1 2 /* { dg-options "-fno-short-enums" {target short_enums} } */ 3 typedef union tree_node *tree; 4 enum tree_code { EXCESS_PRECISION_EXPR }; 5 enum built_in_function { BUILT_IN_ACOS, BUILT_IN_FPCLASSIFY, BUILT_IN_ISFINITE }; 6 struct tree_base { 7 __extension__ enum tree_code code : 16; 8 unsigned side_effects_flag : 1; 9 }; 10 struct tree_exp { 11 tree operands[1]; 12 }; 13 struct tree_function_decl { 14 __extension__ enum built_in_function function_code : 11; 15 unsigned static_ctor_flag : 1; 16 }; 17 union tree_node { 18 struct tree_base base; 19 struct tree_function_decl function_decl; 20 struct tree_exp exp; 21 }; 22 static tree convert_arguments(tree fundecl)23convert_arguments (tree fundecl) 24 { 25 tree val = (void *)0; 26 unsigned int parmnum; 27 unsigned char type_generic_remove_excess_precision = 0; 28 switch (((fundecl)->function_decl.function_code)) 29 { 30 case BUILT_IN_ISFINITE: 31 case BUILT_IN_FPCLASSIFY: 32 type_generic_remove_excess_precision = 1; 33 } 34 for (parmnum = 0;; ++parmnum) 35 if (((enum tree_code) (val)->base.code) == EXCESS_PRECISION_EXPR 36 && !type_generic_remove_excess_precision) 37 val = ((val)->exp.operands[0]); 38 return val; 39 } 40 tree build_function_call_vec(tree function)41build_function_call_vec (tree function) 42 { 43 return convert_arguments (function); 44 } 45 46