<div class="gmail_quote">On Tue, Jul 3, 2012 at 3:14 AM, Abramo Bagnara <span dir="ltr"><<a href="mailto:abramo.bagnara@gmail.com" target="_blank">abramo.bagnara@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
It seems that clang alters a perfectly valid AST adding a bogus<br>
__builtin_trap.<br>
<br>
Am I wrong if I say that a strong invariant for clang is that AST of<br>
valid code should always be conformant with original source?<br></blockquote><div><br></div><div>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.)</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The test is taken from g++ testsuite:<br>
<br>
$ cat sizeof6.C<br>
// { dg-do compile }<br>
// Contributed by Giovanni Bajo <giovannibajo at gcc dot gnu dot org><br>
// PR c++/13683: bogus warning about passing non-PODs through ellipsis<br>
<br>
struct B {};<br>
struct NonPOD : B {};<br>
<br>
struct A<br>
{<br>
  static int check(...);<br>
  static NonPOD GetNonPOD(void);<br>
  enum { value = sizeof(A::check(A::GetNonPOD())) };<br>
};<br>
$ ~/llvm_trunk/Release+Asserts/bin/clang++ -cc1 -ast-dump sizeof6.C<br>
typedef __int128 __int128_t;<br>
typedef unsigned __int128 __uint128_t;<br>
typedef __va_list_tag __builtin_va_list[1];<br>
struct B {<br>
    struct B;<br>
    inline void ~B() throw();<br>
};<br>
struct NonPOD :  B {<br>
    struct NonPOD;<br>
    inline void ~NonPOD() throw();<br>
};<br>
struct A {<br>
    struct A;<br>
    static int check(...);<br>
    static NonPOD GetNonPOD();<br>
    enum  {<br>
        value = (ImplicitCastExpr 0x2d8adb0 <sizeof6.C:12:18, col:49><br>
'unsigned int' <IntegralCast><br>
  (UnaryExprOrTypeTraitExpr 0x2d8ad40 <col:18, col:49> 'unsigned long'<br>
sizeof<br>
    (ParenExpr 0x2d8ad20 <col:24, col:49> 'int'<br>
      (CallExpr 0x2d8ab10 <col:25, col:48> 'int'<br>
        (ImplicitCastExpr 0x2d8aaf8 <col:25, col:28> 'int (*)(...)'<br>
<FunctionToPointerDecay><br>
          (DeclRefExpr 0x2d8a778 <col:25, col:28> 'int (...)' lvalue<br>
CXXMethod 0x2d8a460 'check' 'int (...)'))<br>
        (BinaryOperator 0x2d8acf8 <col:34, col:47> 'struct NonPOD' ','<br>
          (CallExpr 0x2d8acd0 <col:34, col:47> 'void'<br>
            (ImplicitCastExpr 0x2d8acb8 <col:34> 'void (*)(void)<br>
__attribute__((noreturn))' <FunctionToPointerDecay><br>
              (DeclRefExpr 0x2d8ac68 <col:34> 'void (void)<br>
__attribute__((noreturn))' lvalue Function 0x2d8ab70 '__builtin_trap'<br>
'void (void) __attribute__((noreturn))')))<br>
          (CallExpr 0x2d8a860 <col:34, col:47> 'struct NonPOD'<br>
            (ImplicitCastExpr 0x2d8a848 <col:34, col:37> 'struct NonPOD<br>
(*)(void)' <FunctionToPointerDecay><br>
              (DeclRefExpr 0x2d8a7e8 <col:34, col:37> 'struct NonPOD<br>
(void)' lvalue CXXMethod 0x2d8a5c0 'GetNonPOD' 'struct NonPOD<br>
(void)'))))))))<br>
<br>
    };<br>
};<br>
void __builtin_trap() __attribute__((nothrow));<br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
</blockquote></div><br>