/* { dg-options "-fno-short-enums" {target short_enums} } */ typedef union tree_node *tree; enum tree_code { EXCESS_PRECISION_EXPR }; enum built_in_function { BUILT_IN_ACOS, BUILT_IN_FPCLASSIFY, BUILT_IN_ISFINITE }; struct tree_base { __extension__ enum tree_code code : 16; unsigned side_effects_flag : 1; }; struct tree_exp { tree operands[1]; }; struct tree_function_decl { __extension__ enum built_in_function function_code : 11; unsigned static_ctor_flag : 1; }; union tree_node { struct tree_base base; struct tree_function_decl function_decl; struct tree_exp exp; }; static tree convert_arguments (tree fundecl) { tree val = (void *)0; unsigned int parmnum; unsigned char type_generic_remove_excess_precision = 0; switch (((fundecl)->function_decl.function_code)) { case BUILT_IN_ISFINITE: case BUILT_IN_FPCLASSIFY: type_generic_remove_excess_precision = 1; } for (parmnum = 0;; ++parmnum) if (((enum tree_code) (val)->base.code) == EXCESS_PRECISION_EXPR && !type_generic_remove_excess_precision) val = ((val)->exp.operands[0]); return val; } tree build_function_call_vec (tree function) { return convert_arguments (function); }