1
2/* { dg-options "-fno-short-enums" {target short_enums} } */
3typedef union tree_node *tree;
4enum tree_code { EXCESS_PRECISION_EXPR };
5enum built_in_function { BUILT_IN_ACOS, BUILT_IN_FPCLASSIFY, BUILT_IN_ISFINITE };
6struct tree_base {
7    __extension__ enum tree_code code : 16;
8    unsigned side_effects_flag : 1;
9};
10struct tree_exp {
11    tree     operands[1];
12};
13struct tree_function_decl {
14    __extension__ enum built_in_function function_code : 11;
15    unsigned static_ctor_flag : 1;
16};
17union tree_node {
18    struct tree_base base;
19    struct tree_function_decl function_decl;
20    struct tree_exp exp;
21};
22static tree
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}
40tree
41build_function_call_vec (tree function)
42{
43  return convert_arguments (function);
44}
45
46