1d4d3ce6ed8d4981a18d013f8694c762c47b44c77Argyrios Kyrtzidis// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s
2c186b8fe4a308b53569fe839a3224de70d92ab0eAnders Carlsson
30413db4a26b0a1577b75c2979b0eb21f3490d17aArgyrios Kyrtzidis// rdar://8818236
40413db4a26b0a1577b75c2979b0eb21f3490d17aArgyrios Kyrtzidisnamespace rdar8818236 {
50413db4a26b0a1577b75c2979b0eb21f3490d17aArgyrios Kyrtzidisstruct S {
60413db4a26b0a1577b75c2979b0eb21f3490d17aArgyrios Kyrtzidis  char c2;
70413db4a26b0a1577b75c2979b0eb21f3490d17aArgyrios Kyrtzidis  union {
80413db4a26b0a1577b75c2979b0eb21f3490d17aArgyrios Kyrtzidis    char c;
90413db4a26b0a1577b75c2979b0eb21f3490d17aArgyrios Kyrtzidis    int i;
100413db4a26b0a1577b75c2979b0eb21f3490d17aArgyrios Kyrtzidis  };
110413db4a26b0a1577b75c2979b0eb21f3490d17aArgyrios Kyrtzidis};
120413db4a26b0a1577b75c2979b0eb21f3490d17aArgyrios Kyrtzidis
130413db4a26b0a1577b75c2979b0eb21f3490d17aArgyrios Kyrtzidis// CHECK: @_ZN11rdar88182363fooE = global i64 4
140413db4a26b0a1577b75c2979b0eb21f3490d17aArgyrios Kyrtzidischar S::*foo  = &S::c;
150413db4a26b0a1577b75c2979b0eb21f3490d17aArgyrios Kyrtzidis}
160413db4a26b0a1577b75c2979b0eb21f3490d17aArgyrios Kyrtzidis
17c186b8fe4a308b53569fe839a3224de70d92ab0eAnders Carlssonstruct A {
18c186b8fe4a308b53569fe839a3224de70d92ab0eAnders Carlsson  union {
19c186b8fe4a308b53569fe839a3224de70d92ab0eAnders Carlsson    int a;
20c186b8fe4a308b53569fe839a3224de70d92ab0eAnders Carlsson    void* b;
21c186b8fe4a308b53569fe839a3224de70d92ab0eAnders Carlsson  };
22c186b8fe4a308b53569fe839a3224de70d92ab0eAnders Carlsson
23c186b8fe4a308b53569fe839a3224de70d92ab0eAnders Carlsson  A() : a(0) { }
24c186b8fe4a308b53569fe839a3224de70d92ab0eAnders Carlsson};
25c186b8fe4a308b53569fe839a3224de70d92ab0eAnders Carlsson
26c186b8fe4a308b53569fe839a3224de70d92ab0eAnders CarlssonA a;
27fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor
28fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregornamespace PR7021 {
29fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor  struct X
30fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor  {
31fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor    union { long l; };
32fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor  };
33fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor
3493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6PR70211fENS_1XES0_
35fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor  void f(X x, X z) {
36fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor    X x1;
37fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor
38fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor    // CHECK: store i64 1, i64
39fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor    x1.l = 1;
40fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor
41fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor    // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
42fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor    X x2(x1);
43fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor
44fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor    X x3;
45fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor    // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
46fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor    x3 = x1;
47fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor
48fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor    // CHECK: ret void
49fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor  }
50fe60f84c4f201c9ca8126066779da8ee004a70fcDouglas Gregor}
51f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall
52f1860e5c381a2710fcebe6d55d799c6b25c21041John McCallnamespace test2 {
53f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall  struct A {
54f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall    struct {
55f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall      union {
56f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall        int b;
57f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall      };
58f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall    };
59f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall
60f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall    A();
61f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall  };
62f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall
63f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall  A::A() : b(10) { }
6493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN5test21AC2Ev(
65f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall  // CHECK-NOT: }
66f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall  // CHECK: store i32 10
67f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall  // CHECK: }
68f1860e5c381a2710fcebe6d55d799c6b25c21041John McCall}
69a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall
704dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregornamespace PR10512 {
714dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  struct A {
724dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor    A();
734dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor    A(int);
744dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor    A(long);
754dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor
764dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor    struct {
774dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor      struct {int x;};
784dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor      struct {int y;};
794dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor    };
804dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  };
814dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor
8293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN7PR105121AC2Ev
834dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK: [[THISADDR:%[a-zA-z0-9.]+]] = alloca [[A:%"struct[A-Za-z0-9:.]+"]]
844dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: store [[A]]* [[THIS:%[a-zA-z0-9.]+]], [[A]]** [[THISADDR]]
853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: [[THIS1:%[a-zA-z0-9.]+]] = load [[A]]*, [[A]]** [[THISADDR]]
864dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: ret void
874dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  A::A() {}
884dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor
8993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN7PR105121AC2Ei
904dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK: [[THISADDR:%[a-zA-z0-9.]+]] = alloca [[A:%"struct[A-Za-z0-9:.]+"]]
914dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: [[XADDR:%[a-zA-z0-9.]+]] = alloca i32
924dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: store [[A]]* [[THIS:%[a-zA-z0-9.]+]], [[A]]** [[THISADDR]]
934dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: store i32 [[X:%[a-zA-z0-9.]+]], i32* [[XADDR]]
943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: [[THIS1:%[a-zA-z0-9.]+]] = load [[A]]*, [[A]]** [[THISADDR]]
954dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}}
964dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}}
974dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}}
983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: [[TMP:%[a-zA-z0-9.]+]] = load i32, i32* [[XADDR]]
994dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: store i32 [[TMP]]
1004dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: ret void
1014dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  A::A(int x) : x(x) { }
1024dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor
10393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN7PR105121AC2El
1044dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK: [[THISADDR:%[a-zA-z0-9.]+]] = alloca [[A:%"struct[A-Za-z0-9:.]+"]]
1054dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: [[XADDR:%[a-zA-z0-9.]+]] = alloca i64
1064dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: store [[A]]* [[THIS:%[a-zA-z0-9.]+]], [[A]]** [[THISADDR]]
1074dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: store i64 [[X:%[a-zA-z0-9.]+]], i64* [[XADDR]]
1083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: [[THIS1:%[a-zA-z0-9.]+]] = load [[A]]*, [[A]]** [[THISADDR]]
1094dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}}
1104dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 1}}
1114dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}}
1123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: [[TMP:%[a-zA-z0-9.]+]] = load i64, i64* [[XADDR]]
1134dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: [[CONV:%[a-zA-z0-9.]+]] = trunc i64 [[TMP]] to i32
1144dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: store i32 [[CONV]]
1154dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  // CHECK-NEXT: ret void
1164dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor  A::A(long y) : y(y) { }
1174dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor}
1184dc41c9b766140b507980a13acccf2f05ed19cd3Douglas Gregor
119a9976d3b192690db20f59dc44099ac4ca939bdb7John McCallnamespace test3 {
120a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall  struct A {
121a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall    union {
122a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall      mutable char fibers[100];
123a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall      struct {
124a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall        void (*callback)(void*);
125a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall        void *callback_value;
126a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall      };
127a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall    };
128a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall
129a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall    A();
130a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall  };
131a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall
132a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall  A::A() : callback(0), callback_value(0) {}
13393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN5test31AC2Ev(
134a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall  // CHECK: [[THIS:%.*]] = load
135a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall  // CHECK-NEXT: [[UNION:%.*]] = getelementptr inbounds {{.*}} [[THIS]], i32 0, i32 0
136bc7fbf0d37b286b37d96b033dfaaabf9c729bca8John McCall  // CHECK-NEXT: [[STRUCT:%.*]] = bitcast {{.*}}* [[UNION]] to
137a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall  // CHECK-NEXT: [[CALLBACK:%.*]] = getelementptr inbounds {{.*}} [[STRUCT]], i32 0, i32 0
13804af8aa157c55198bba9231dd6d811cf7ecda9a5Chris Lattner  // CHECK: store
139a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall  // CHECK-NEXT: [[UNION:%.*]] = getelementptr inbounds {{.*}} [[THIS]], i32 0, i32 0
140bc7fbf0d37b286b37d96b033dfaaabf9c729bca8John McCall  // CHECK-NEXT: [[STRUCT:%.*]] = bitcast {{.*}}* [[UNION]] to
141d4d3ce6ed8d4981a18d013f8694c762c47b44c77Argyrios Kyrtzidis  // CHECK-NEXT: [[CVALUE:%.*]] = getelementptr inbounds {{.*}} [[STRUCT]], i32 0, i32 1
142d4d3ce6ed8d4981a18d013f8694c762c47b44c77Argyrios Kyrtzidis  // CHECK-NEXT: store i8* null, i8** [[CVALUE]]
143a9976d3b192690db20f59dc44099ac4ca939bdb7John McCall}
144881b36ccbf8eaee709e7763369062a52f5961df1Argyrios Kyrtzidis
145881b36ccbf8eaee709e7763369062a52f5961df1Argyrios Kyrtzidisstruct S {
146881b36ccbf8eaee709e7763369062a52f5961df1Argyrios Kyrtzidis  // CHECK: store i32 42
147881b36ccbf8eaee709e7763369062a52f5961df1Argyrios Kyrtzidis  // CHECK: store i32 55
148881b36ccbf8eaee709e7763369062a52f5961df1Argyrios Kyrtzidis  S() : x(42), y(55) {}
149881b36ccbf8eaee709e7763369062a52f5961df1Argyrios Kyrtzidis  union {
150881b36ccbf8eaee709e7763369062a52f5961df1Argyrios Kyrtzidis    struct {
151881b36ccbf8eaee709e7763369062a52f5961df1Argyrios Kyrtzidis      int x;
152881b36ccbf8eaee709e7763369062a52f5961df1Argyrios Kyrtzidis      union { int y; };
153881b36ccbf8eaee709e7763369062a52f5961df1Argyrios Kyrtzidis    };
154881b36ccbf8eaee709e7763369062a52f5961df1Argyrios Kyrtzidis  };
155881b36ccbf8eaee709e7763369062a52f5961df1Argyrios Kyrtzidis} s;
15640e17752086c2c497951d64f5ac6ab5039466113Francois Pichet
15740e17752086c2c497951d64f5ac6ab5039466113Francois Pichet
1584955e57cd5de1e47be4e2f3e6c733beac166bbd8John McCall//PR8760
1594955e57cd5de1e47be4e2f3e6c733beac166bbd8John McCalltemplate <typename T> struct Foo {
1604955e57cd5de1e47be4e2f3e6c733beac166bbd8John McCall  Foo() : ptr(__nullptr) {}
1614955e57cd5de1e47be4e2f3e6c733beac166bbd8John McCall  union {
1624955e57cd5de1e47be4e2f3e6c733beac166bbd8John McCall    T *ptr;
1634955e57cd5de1e47be4e2f3e6c733beac166bbd8John McCall  };
1644955e57cd5de1e47be4e2f3e6c733beac166bbd8John McCall};
1654955e57cd5de1e47be4e2f3e6c733beac166bbd8John McCallFoo<int> f;
166e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregor
167e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregornamespace PR9683 {
168e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregor  struct QueueEntry {
169e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregor    union {
170e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregor      struct {
171e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregor        void* mPtr;
172e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregor        union {
173e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregor          unsigned mSubmissionTag;
174e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregor        };
175e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregor      };
176e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregor      unsigned mValue;
177e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregor    };
178e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregor    QueueEntry() {}
179e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregor  };
180e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregor  QueueEntry QE;
181e7003b72e691c4d83ba5516c58bccc2f2a4b3fe0Douglas Gregor}
182859c65cdbe730fd0e940b71ab4ba4884d44a8298Eli Friedman
183859c65cdbe730fd0e940b71ab4ba4884d44a8298Eli Friedmannamespace PR13154 {
184859c65cdbe730fd0e940b71ab4ba4884d44a8298Eli Friedman  struct IndirectReferenceField {
185859c65cdbe730fd0e940b71ab4ba4884d44a8298Eli Friedman      struct {
186859c65cdbe730fd0e940b71ab4ba4884d44a8298Eli Friedman          float &x;
187859c65cdbe730fd0e940b71ab4ba4884d44a8298Eli Friedman      };
188859c65cdbe730fd0e940b71ab4ba4884d44a8298Eli Friedman      IndirectReferenceField(float &x);
189859c65cdbe730fd0e940b71ab4ba4884d44a8298Eli Friedman  };
190859c65cdbe730fd0e940b71ab4ba4884d44a8298Eli Friedman  IndirectReferenceField::IndirectReferenceField(float &xx) : x(xx) {}
191859c65cdbe730fd0e940b71ab4ba4884d44a8298Eli Friedman}
192