Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
      2 
      3 // An extra byte should be allocated for an empty class.
      4 namespace Test1 {
      5   // CHECK: %"struct.Test1::A" = type { i8 }
      6   struct A { } *a;
      7 }
      8 
      9 namespace Test2 {
     10   // No need to add tail padding here.
     11   // CHECK: %"struct.Test2::A" = type { i8*, i32 }
     12   struct A { void *a; int b; } *a;
     13 }
     14 
     15 namespace Test3 {
     16   // C should have a vtable pointer.
     17   // CHECK: %"struct.Test3::A" = type <{ i32 (...)**, i32, [4 x i8] }>
     18   struct A { virtual void f(); int a; } *a;
     19 }
     20 
     21 namespace Test4 {
     22   // Test from PR5589.
     23   // CHECK: %"struct.Test4::B" = type { %"struct.Test4::A", i16, double }
     24   // CHECK: %"struct.Test4::A" = type { i32, i8, float }
     25   struct A {
     26     int a;
     27     char c;
     28     float b;
     29   };
     30   struct B : public A {
     31     short d;
     32     double e;
     33   } *b;
     34 }
     35 
     36 namespace Test5 {
     37   struct A {
     38     virtual void f();
     39     char a;
     40   };
     41 
     42   // CHECK: %"struct.Test5::B" = type {  %"struct.Test5::A.base", i8, i8, [5 x i8] }
     43   struct B : A {
     44     char b : 1;
     45     char c;
     46   } *b;
     47 }
     48 
     49 // PR10912: don't crash
     50 namespace Test6 {
     51   template <typename T> class A {
     52     // If T is complete, IR-gen will want to translate it recursively
     53     // when translating T*.
     54     T *foo;
     55   };
     56 
     57   class B;
     58 
     59   // This causes IR-gen to have an incomplete translation of A<B>
     60   // sitting around.
     61   A<B> *a;
     62 
     63   class C {};
     64   class B : public C {
     65     // This forces Sema to instantiate A<B>, which triggers a callback
     66     // to IR-gen.  Because of the previous, incomplete translation,
     67     // IR-gen actually cares, and it immediately tries to complete
     68     // A<B>'s IR type.  That, in turn, causes the translation of B*.
     69     // B isn't complete yet, but it has a definition, and if we try to
     70     // compute a record layout for that definition then we'll really
     71     // regret it later.
     72     A<B> a;
     73   };
     74 
     75   // The derived class E and empty base class C are required to
     76   // provoke the original assertion.
     77   class E : public B {};
     78   E *e;
     79 }
     80 
     81 // <rdar://problem/11324125>: Make sure this doesn't crash.  (It's okay
     82 // if we start rejecting it at some point.)
     83 namespace Test7 {
     84   #pragma pack (1)
     85   class A {};
     86   // CHECK: %"class.Test7::B" = type <{ i32 (...)**, %"class.Test7::A" }>
     87   class B {
     88      virtual ~B();
     89      A a;
     90   };
     91   B* b;
     92   #pragma pack ()
     93 }
     94 
     95 // Shouldn't crash.
     96 namespace Test8 {
     97   struct A {};
     98   struct D { int a; };
     99   struct B : virtual D, A { };
    100   struct C : B, A { void f() {} };
    101   C c;
    102 }
    103