On Sat, 7 Jul 2007, Joseph S. Myers wrote: > No, that's something else entirely (a "float" old-style parameter > declaration corresponds to a "double" argument in a prototype). It's > convert_arguments that handles converting to prototype types and default > argument promotions for arguments not covered by a prototype (including > those in the ... of a variadic function). > > else if (TREE_CODE (TREE_TYPE (val)) == REAL_TYPE > && (TYPE_PRECISION (TREE_TYPE (val)) > < TYPE_PRECISION (double_type_node)) > && !DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (val)))) > /* Convert `float' to `double'. */ > argarray[parmnum] = convert (double_type_node, val);
Ah perfect, thanks. I'm thinking something like what's below. I'll move it over to gcc-patches and add a ChangeLog if it passes testing. Thanks for your help! --Kaveh diff -rup orig/egcc-SVN20070706/gcc/c-typeck.c egcc-SVN20070706/gcc/c-typeck.c --- orig/egcc-SVN20070706/gcc/c-typeck.c 2007-06-30 23:02:59.000000000 -0400 +++ egcc-SVN20070706/gcc/c-typeck.c 2007-07-07 21:26:33.982197838 -0400 @@ -2394,6 +2394,8 @@ convert_arguments (int nargs, tree *arga { tree typetail, valtail; int parmnum; + const bool type_generic = + !!lookup_attribute ("type generic", TYPE_ATTRIBUTES(TREE_TYPE (fundecl))); tree selector; /* Change pointer to function to the function itself for @@ -2585,8 +2587,13 @@ convert_arguments (int nargs, tree *arga && (TYPE_PRECISION (TREE_TYPE (val)) < TYPE_PRECISION (double_type_node)) && !DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (val)))) - /* Convert `float' to `double'. */ - argarray[parmnum] = convert (double_type_node, val); + { + /* Convert `float' to `double'. */ + if (type_generic) + argarray[parmnum] = val; + else + argarray[parmnum] = convert (double_type_node, val); + } else if ((invalid_func_diag = targetm.calls.invalid_arg_for_unprototyped_fn (typelist, fundecl, val))) {