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