extern void *malloc(__SIZE_TYPE__); enum tree_code { ERROR_MARK, IDENTIFIER_NODE, OP_IDENTIFIER, TREE_LIST, TREE_VEC, BLOCK, VOID_TYPE, INTEGER_TYPE, REAL_TYPE, COMPLEX_TYPE, VECTOR_TYPE, ENUMERAL_TYPE, BOOLEAN_TYPE, CHAR_TYPE, POINTER_TYPE, OFFSET_TYPE, REFERENCE_TYPE, METHOD_TYPE, FILE_TYPE, ARRAY_TYPE, SET_TYPE, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE, FUNCTION_TYPE, LANG_TYPE, INTEGER_CST, REAL_CST, COMPLEX_CST, STRING_CST, FUNCTION_DECL, LABEL_DECL, CONST_DECL, TYPE_DECL, VAR_DECL, PARM_DECL, RESULT_DECL, FIELD_DECL, NAMESPACE_DECL, COMPONENT_REF, BIT_FIELD_REF, INDIRECT_REF, BUFFER_REF, ARRAY_REF, CONSTRUCTOR, COMPOUND_EXPR, MODIFY_EXPR, INIT_EXPR, TARGET_EXPR, COND_EXPR, BIND_EXPR, CALL_EXPR, METHOD_CALL_EXPR, WITH_CLEANUP_EXPR, CLEANUP_POINT_EXPR, PLACEHOLDER_EXPR, WITH_RECORD_EXPR, PLUS_EXPR, MINUS_EXPR, MULT_EXPR, TRUNC_DIV_EXPR, CEIL_DIV_EXPR, FLOOR_DIV_EXPR, ROUND_DIV_EXPR, TRUNC_MOD_EXPR, CEIL_MOD_EXPR, FLOOR_MOD_EXPR, ROUND_MOD_EXPR, RDIV_EXPR, EXACT_DIV_EXPR, FIX_TRUNC_EXPR, FIX_CEIL_EXPR, FIX_FLOOR_EXPR, FIX_ROUND_EXPR, FLOAT_EXPR, EXPON_EXPR, NEGATE_EXPR, MIN_EXPR, MAX_EXPR, ABS_EXPR, FFS_EXPR, LSHIFT_EXPR, RSHIFT_EXPR, LROTATE_EXPR, RROTATE_EXPR, BIT_IOR_EXPR, BIT_XOR_EXPR, BIT_AND_EXPR, BIT_ANDTC_EXPR, BIT_NOT_EXPR, TRUTH_ANDIF_EXPR, TRUTH_ORIF_EXPR, TRUTH_AND_EXPR, TRUTH_OR_EXPR, TRUTH_XOR_EXPR, TRUTH_NOT_EXPR, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, EQ_EXPR, NE_EXPR, UNORDERED_EXPR, ORDERED_EXPR, UNLT_EXPR, UNLE_EXPR, UNGT_EXPR, UNGE_EXPR, UNEQ_EXPR, IN_EXPR, SET_LE_EXPR, CARD_EXPR, RANGE_EXPR, CONVERT_EXPR, NOP_EXPR, NON_LVALUE_EXPR, SAVE_EXPR, UNSAVE_EXPR, RTL_EXPR, ADDR_EXPR, REFERENCE_EXPR, ENTRY_VALUE_EXPR, COMPLEX_EXPR, CONJ_EXPR, REALPART_EXPR, IMAGPART_EXPR, PREDECREMENT_EXPR, PREINCREMENT_EXPR, POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, VA_ARG_EXPR, TRY_CATCH_EXPR, TRY_FINALLY_EXPR, GOTO_SUBROUTINE_EXPR, POPDHC_EXPR, POPDCC_EXPR, LABEL_EXPR, GOTO_EXPR, RETURN_EXPR, EXIT_EXPR, LOOP_EXPR, LABELED_BLOCK_EXPR, EXIT_BLOCK_EXPR, EXPR_WITH_FILE_LOCATION, SWITCH_EXPR, LAST_AND_UNUSED_TREE_CODE }; typedef union tree_node *tree; struct tree_common { union tree_node *chain; union tree_node *type; enum tree_code code : 8; unsigned side_effects_flag : 1; unsigned constant_flag : 1; unsigned permanent_flag : 1; unsigned addressable_flag : 1; unsigned volatile_flag : 1; unsigned readonly_flag : 1; unsigned unsigned_flag : 1; unsigned asm_written_flag: 1; unsigned used_flag : 1; unsigned nothrow_flag : 1; unsigned static_flag : 1; unsigned public_flag : 1; unsigned private_flag : 1; unsigned protected_flag : 1; unsigned bounded_flag : 1; unsigned lang_flag_0 : 1; unsigned lang_flag_1 : 1; unsigned lang_flag_2 : 1; unsigned lang_flag_3 : 1; unsigned lang_flag_4 : 1; unsigned lang_flag_5 : 1; unsigned lang_flag_6 : 1; }; union tree_node { struct tree_common common; }; enum c_tree_code { C_DUMMY_TREE_CODE = LAST_AND_UNUSED_TREE_CODE, SRCLOC, SIZEOF_EXPR, ARROW_EXPR, ALIGNOF_EXPR, EXPR_STMT, COMPOUND_STMT, DECL_STMT, IF_STMT, FOR_STMT, WHILE_STMT, DO_STMT, RETURN_STMT, BREAK_STMT, CONTINUE_STMT, SWITCH_STMT, GOTO_STMT, LABEL_STMT, ASM_STMT, SCOPE_STMT, CASE_LABEL, STMT_EXPR, LAST_C_TREE_CODE }; enum cplus_tree_code { CP_DUMMY_TREE_CODE = LAST_C_TREE_CODE, OFFSET_REF, PTRMEM_CST, NEW_EXPR, VEC_NEW_EXPR, DELETE_EXPR, VEC_DELETE_EXPR, SCOPE_REF, MEMBER_REF, TYPE_EXPR, AGGR_INIT_EXPR, THROW_EXPR, EMPTY_CLASS_EXPR, TEMPLATE_DECL, TEMPLATE_PARM_INDEX, TEMPLATE_TYPE_PARM, TEMPLATE_TEMPLATE_PARM, BOUND_TEMPLATE_TEMPLATE_PARM, TYPENAME_TYPE, TYPEOF_TYPE, USING_DECL, DEFAULT_ARG, TEMPLATE_ID_EXPR, CPLUS_BINDING, OVERLOAD, WRAPPER, LOOKUP_EXPR, FUNCTION_NAME, MODOP_EXPR, CAST_EXPR, REINTERPRET_CAST_EXPR, CONST_CAST_EXPR, STATIC_CAST_EXPR, DYNAMIC_CAST_EXPR, DOTSTAR_EXPR, TYPEID_EXPR, PSEUDO_DTOR_EXPR, SUBOBJECT, CTOR_STMT, CLEANUP_STMT, START_CATCH_STMT, CTOR_INITIALIZER, RETURN_INIT, TRY_BLOCK, HANDLER, TAG_DEFN, IDENTITY_CONV, LVALUE_CONV, QUAL_CONV, STD_CONV, PTR_CONV, PMEM_CONV, BASE_CONV, REF_BIND, USER_CONV, AMBIG_CONV, RVALUE_CONV, LAST_CPLUS_TREE_CODE }; blah(){} convert_like_real (convs) tree convs; { switch (((enum tree_code) (convs)->common.code)) { case AMBIG_CONV: return blah(); default: break; }; abort (); } main() { tree convs = (void *)malloc (sizeof (struct tree_common));; convs->common.code = AMBIG_CONV; convert_like_real (convs); exit (0); }