This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Q: middle-end problem when variadic builtins promote float to double

On 7/8/07, Kaveh R. GHAZI <> wrote:
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!


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)))

So type-generic is supposed to apply to scalar floating point types only? Btw. you need to add documentation for this function attribute.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]