[cfe-commits] [PATCH] Merge function types is C.

Eli Friedman eli.friedman at gmail.com
Wed Nov 28 21:54:20 PST 2012


On Wed, Nov 28, 2012 at 8:04 PM, Rafael Espíndola
<rafael.espindola at gmail.com> wrote:
>> void f(int (*)[10]);
>> void f(int (*)[]);
>> void g() {
>>   int x[5];
>>   f(&x);
>> }
>>
>> gcc gives "warning: passing argument 1 of ‘f’ from incompatible
>> pointer type"; clang should print a similar warning.
>
> Added. This required changing/fixing initialization sequences to use
> the type from the function prototype instead of the one from the
> argument.
>
>>> What is the behavior you would expect from CodeGen? Given
>>>
>>> void f(int);
>>> void f(a)
>>>   char a;
>>> {
>>>   int v[sizeof(a) == 1 ? 1 : -1];
>>> }
>>>
>>> Should it produce a f(i32) that truncates its argument?
>>
>> Yes, this should continue to work the same way it works on trunk.
>
> A new patch is attached. The codegen is not identical in all cases,
> for example, given
>
> int svc_register (void (*dispatch) (int));
> int svc_register (dispatch)
>      void (*dispatch) ();
> {}
>
> without this patch we produce "@svc_register(void (...)* %dispatch)"
> and with it we produce "@svc_register(void (i32)*)", which I think is
> the desired result.

Yes, fine.

@@ -1230,7 +1230,11 @@ void CodeGenFunction::EmitFunctionProlog(const
CGFunctionInfo &FI,

         if (isPromoted)
           V = emitArgumentDemotion(*this, Arg, V);
-
+
+        llvm::Type *LTy = ConvertType(Arg->getType());
+        if (V->getType() != LTy)
+          V = Builder.CreateBitCast(V, LTy);
+

This deserves a comment describing why the bitcast is safe.

Otherwise looks fine.

-Eli




More information about the cfe-commits mailing list