• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 { };
fTest8::C100   struct C : B, A { void f() {} };
101   C c;
102 }
103