Make check_warn_object_type work without gcc ({}) extension

This commit is contained in:
Kp 2016-03-05 17:26:24 +00:00
parent 57c33695e6
commit 97219697a7

View file

@ -551,17 +551,21 @@ void check_warn_object_type(const object &, object_type_t, const char *file, uns
#define set_reactor_id(O,I) (check_warn_object_type(O, OBJ_CNTRLCEN, __FILE__, __LINE__), set_reactor_id(O, I))
#define set_robot_id(O,I) (check_warn_object_type(O, OBJ_ROBOT, __FILE__, __LINE__), set_robot_id(O, I))
#define set_weapon_id(O,I) (check_warn_object_type(O, OBJ_WEAPON, __FILE__, __LINE__), set_weapon_id(O, I))
#ifdef DXX_HAVE_BUILTIN_CONSTANT_P
#ifdef DXX_CONSTANT_TRUE
#define check_warn_object_type(O,T,F,L) \
({ \
const object &dxx_check_warn_o = O; \
/* If the type is always wrong, force a compile-time error. */ \
if (__builtin_constant_p(dxx_check_warn_o.type != T) && dxx_check_warn_o.type != T) \
DXX_ALWAYS_ERROR_FUNCTION(dxx_error_object_type_mismatch, "object type mismatch"); \
( DXX_BEGIN_COMPOUND_STATEMENT { \
const object &dxx_check_warn_o = (O); \
const auto type = dxx_check_warn_o.type; \
/* If the type is always right, omit the runtime check. */ \
if (!(__builtin_constant_p(dxx_check_warn_o.type == T) && dxx_check_warn_o.type == T)) \
(check_warn_object_type)(O,T,F,L); \
})
DXX_CONSTANT_TRUE(type == T) || ( \
/* If the type is always wrong, force a compile-time error. */ \
DXX_CONSTANT_TRUE(type != T) \
? DXX_ALWAYS_ERROR_FUNCTION(dxx_error_object_type_mismatch, "object type mismatch") \
: static_cast<void>( \
check_warn_object_type(dxx_check_warn_o,T,F,L), 0 \
) \
, 0); \
} DXX_END_COMPOUND_STATEMENT )
#endif
}