Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -emit-llvm -O3 -o - | FileCheck %s
      2 
      3 struct Empty { };
      4 
      5 struct A {
      6   explicit A(unsigned a = 0xffffffff) : a(a) { }
      7 
      8   unsigned a;
      9 };
     10 
     11 struct B : A, Empty {
     12   B() : A(), Empty() { }
     13 };
     14 
     15 struct C : A, Empty {
     16   C() : A(), Empty() { }
     17   C(const C& other) : A(0x12345678), Empty(other) { }
     18 };
     19 
     20 struct D : A, Empty {
     21   D& operator=(const D& other) {
     22     a = 0x87654321;
     23     Empty::operator=(other);
     24 
     25     return *this;
     26   }
     27 };
     28 
     29 #define CHECK(x) if (!(x)) return __LINE__
     30 
     31 // PR7012
     32 // CHECK: define i32 @_Z1fv()
     33 int f() {
     34   B b1;
     35 
     36   // Check that A::a is not overwritten by the Empty default constructor.
     37   CHECK(b1.a == 0xffffffff);
     38 
     39   C c1;
     40   C c2(c1);
     41 
     42   // Check that A::a has the value set in the C::C copy constructor.
     43   CHECK(c2.a == 0x12345678);
     44 
     45   D d1, d2;
     46   d2 = d1;
     47 
     48   // Check that A::as has the value set in the D copy assignment operator.
     49   CHECK(d2.a == 0x87654321);
     50 
     51   // Success!
     52   // CHECK: ret i32 0
     53   return 0;
     54 }
     55 
     56 namespace PR8796 {
     57   struct FreeCell {
     58   };
     59   union ThingOrCell {
     60     FreeCell t;
     61     FreeCell cell;
     62   };
     63   struct Things {
     64     ThingOrCell things;
     65   };
     66   Things x;
     67 }
     68 
     69 #ifdef HARNESS
     70 extern "C" void printf(const char *, ...);
     71 
     72 int main() {
     73   int result = f();
     74 
     75   if (result == 0)
     76     printf("success!\n");
     77   else
     78     printf("test on line %d failed!\n", result);
     79 
     80   return result;
     81 }
     82 #endif
     83