[cfe-dev] AST is alterated for valid code?

Richard Smith richard at metafoo.co.uk
Tue Jul 3 12:13:06 PDT 2012


On Tue, Jul 3, 2012 at 3:14 AM, Abramo Bagnara <abramo.bagnara at gmail.com>wrote:

>
> It seems that clang alters a perfectly valid AST adding a bogus
> __builtin_trap.
>
> Am I wrong if I say that a strong invariant for clang is that AST of
> valid code should always be conformant with original source?
>

Yes, this is a hack, and should be revisited; the trap should be inserted
by CodeGen, not by Sema. (To facilitate this, either
Sema::isValidVarArgType should be moved from Sema to somewhere in AST, or
we should add some marker to the AST to indicate a bad varargs call.)


> The test is taken from g++ testsuite:
>
> $ cat sizeof6.C
> // { dg-do compile }
> // Contributed by Giovanni Bajo <giovannibajo at gcc dot gnu dot org>
> // PR c++/13683: bogus warning about passing non-PODs through ellipsis
>
> struct B {};
> struct NonPOD : B {};
>
> struct A
> {
>   static int check(...);
>   static NonPOD GetNonPOD(void);
>   enum { value = sizeof(A::check(A::GetNonPOD())) };
> };
> $ ~/llvm_trunk/Release+Asserts/bin/clang++ -cc1 -ast-dump sizeof6.C
> typedef __int128 __int128_t;
> typedef unsigned __int128 __uint128_t;
> typedef __va_list_tag __builtin_va_list[1];
> struct B {
>     struct B;
>     inline void ~B() throw();
> };
> struct NonPOD :  B {
>     struct NonPOD;
>     inline void ~NonPOD() throw();
> };
> struct A {
>     struct A;
>     static int check(...);
>     static NonPOD GetNonPOD();
>     enum  {
>         value = (ImplicitCastExpr 0x2d8adb0 <sizeof6.C:12:18, col:49>
> 'unsigned int' <IntegralCast>
>   (UnaryExprOrTypeTraitExpr 0x2d8ad40 <col:18, col:49> 'unsigned long'
> sizeof
>     (ParenExpr 0x2d8ad20 <col:24, col:49> 'int'
>       (CallExpr 0x2d8ab10 <col:25, col:48> 'int'
>         (ImplicitCastExpr 0x2d8aaf8 <col:25, col:28> 'int (*)(...)'
> <FunctionToPointerDecay>
>           (DeclRefExpr 0x2d8a778 <col:25, col:28> 'int (...)' lvalue
> CXXMethod 0x2d8a460 'check' 'int (...)'))
>         (BinaryOperator 0x2d8acf8 <col:34, col:47> 'struct NonPOD' ','
>           (CallExpr 0x2d8acd0 <col:34, col:47> 'void'
>             (ImplicitCastExpr 0x2d8acb8 <col:34> 'void (*)(void)
> __attribute__((noreturn))' <FunctionToPointerDecay>
>               (DeclRefExpr 0x2d8ac68 <col:34> 'void (void)
> __attribute__((noreturn))' lvalue Function 0x2d8ab70 '__builtin_trap'
> 'void (void) __attribute__((noreturn))')))
>           (CallExpr 0x2d8a860 <col:34, col:47> 'struct NonPOD'
>             (ImplicitCastExpr 0x2d8a848 <col:34, col:37> 'struct NonPOD
> (*)(void)' <FunctionToPointerDecay>
>               (DeclRefExpr 0x2d8a7e8 <col:34, col:37> 'struct NonPOD
> (void)' lvalue CXXMethod 0x2d8a5c0 'GetNonPOD' 'struct NonPOD
> (void)'))))))))
>
>     };
> };
> void __builtin_trap() __attribute__((nothrow));
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20120703/ee52b786/attachment.html>


More information about the cfe-dev mailing list