You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
4.4 KiB
192 lines
4.4 KiB
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s
|
|
|
|
// rdar://8818236
|
|
namespace rdar8818236 {
|
|
struct S {
|
|
char c2;
|
|
union {
|
|
char c;
|
|
int i;
|
|
};
|
|
};
|
|
|
|
// CHECK: @_ZN11rdar88182363fooE = global i64 4
|
|
char S::*foo = &S::c;
|
|
}
|
|
|
|
struct A {
|
|
union {
|
|
int a;
|
|
void* b;
|
|
};
|
|
|
|
A() : a(0) { }
|
|
};
|
|
|
|
A a;
|
|
|
|
namespace PR7021 {
|
|
struct X
|
|
{
|
|
union { long l; };
|
|
};
|
|
|
|
// CHECK-LABEL: define void @_ZN6PR70211fENS_1XES0_
|
|
void f(X x, X z) {
|
|
X x1;
|
|
|
|
// CHECK: store i64 1, i64
|
|
x1.l = 1;
|
|
|
|
// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
|
|
X x2(x1);
|
|
|
|
X x3;
|
|
// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
|
|
x3 = x1;
|
|
|
|
// CHECK: ret void
|
|
}
|
|
}
|
|
|
|
namespace test2 {
|
|
struct A {
|
|
struct {
|
|
union {
|
|
int b;
|
|
};
|
|
};
|
|
|
|
A();
|
|
};
|
|
|
|
A::A() : b(10) { }
|
|
// CHECK-LABEL: define void @_ZN5test21AC2Ev(
|
|
// CHECK-NOT: }
|
|
// CHECK: store i32 10
|
|
// CHECK: }
|
|
}
|
|
|
|
namespace PR10512 {
|
|
struct A {
|
|
A();
|
|
A(int);
|
|
A(long);
|
|
|
|
struct {
|
|
struct {int x;};
|
|
struct {int y;};
|
|
};
|
|
};
|
|
|
|
// CHECK-LABEL: define void @_ZN7PR105121AC2Ev
|
|
// CHECK: [[THISADDR:%[a-zA-Z0-9.]+]] = alloca [[A:%"struct[A-Za-z0-9:.]+"]]
|
|
// CHECK-NEXT: store [[A]]* [[THIS:%[a-zA-Z0-9.]+]], [[A]]** [[THISADDR]]
|
|
// CHECK-NEXT: [[THIS1:%[a-zA-Z0-9.]+]] = load [[A]]*, [[A]]** [[THISADDR]]
|
|
// CHECK-NEXT: ret void
|
|
A::A() {}
|
|
|
|
// CHECK-LABEL: define void @_ZN7PR105121AC2Ei
|
|
// CHECK: [[THISADDR:%[a-zA-Z0-9.]+]] = alloca [[A:%"struct[A-Za-z0-9:.]+"]]
|
|
// CHECK-NEXT: [[XADDR:%[a-zA-Z0-9.]+]] = alloca i32
|
|
// CHECK-NEXT: store [[A]]* [[THIS:%[a-zA-Z0-9.]+]], [[A]]** [[THISADDR]]
|
|
// CHECK-NEXT: store i32 [[X:%[a-zA-Z0-9.]+]], i32* [[XADDR]]
|
|
// CHECK-NEXT: [[THIS1:%[a-zA-Z0-9.]+]] = load [[A]]*, [[A]]** [[THISADDR]]
|
|
// CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}}
|
|
// CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}}
|
|
// CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}}
|
|
// CHECK-NEXT: [[TMP:%[a-zA-Z0-9.]+]] = load i32, i32* [[XADDR]]
|
|
// CHECK-NEXT: store i32 [[TMP]]
|
|
// CHECK-NEXT: ret void
|
|
A::A(int x) : x(x) { }
|
|
|
|
// CHECK-LABEL: define void @_ZN7PR105121AC2El
|
|
// CHECK: [[THISADDR:%[a-zA-Z0-9.]+]] = alloca [[A:%"struct[A-Za-z0-9:.]+"]]
|
|
// CHECK-NEXT: [[XADDR:%[a-zA-Z0-9.]+]] = alloca i64
|
|
// CHECK-NEXT: store [[A]]* [[THIS:%[a-zA-Z0-9.]+]], [[A]]** [[THISADDR]]
|
|
// CHECK-NEXT: store i64 [[X:%[a-zA-Z0-9.]+]], i64* [[XADDR]]
|
|
// CHECK-NEXT: [[THIS1:%[a-zA-Z0-9.]+]] = load [[A]]*, [[A]]** [[THISADDR]]
|
|
// CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}}
|
|
// CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 1}}
|
|
// CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}}
|
|
// CHECK-NEXT: [[TMP:%[a-zA-Z0-9.]+]] = load i64, i64* [[XADDR]]
|
|
// CHECK-NEXT: [[CONV:%[a-zA-Z0-9.]+]] = trunc i64 [[TMP]] to i32
|
|
// CHECK-NEXT: store i32 [[CONV]]
|
|
// CHECK-NEXT: ret void
|
|
A::A(long y) : y(y) { }
|
|
}
|
|
|
|
namespace test3 {
|
|
struct A {
|
|
union {
|
|
mutable char fibers[100];
|
|
struct {
|
|
void (*callback)(void*);
|
|
void *callback_value;
|
|
};
|
|
};
|
|
|
|
A();
|
|
};
|
|
|
|
A::A() : callback(0), callback_value(0) {}
|
|
// CHECK-LABEL: define void @_ZN5test31AC2Ev(
|
|
// CHECK: [[THIS:%.*]] = load
|
|
// CHECK-NEXT: [[UNION:%.*]] = getelementptr inbounds {{.*}} [[THIS]], i32 0, i32 0
|
|
// CHECK-NEXT: [[STRUCT:%.*]] = bitcast {{.*}}* [[UNION]] to
|
|
// CHECK-NEXT: [[CALLBACK:%.*]] = getelementptr inbounds {{.*}} [[STRUCT]], i32 0, i32 0
|
|
// CHECK: store
|
|
// CHECK-NEXT: [[UNION:%.*]] = getelementptr inbounds {{.*}} [[THIS]], i32 0, i32 0
|
|
// CHECK-NEXT: [[STRUCT:%.*]] = bitcast {{.*}}* [[UNION]] to
|
|
// CHECK-NEXT: [[CVALUE:%.*]] = getelementptr inbounds {{.*}} [[STRUCT]], i32 0, i32 1
|
|
// CHECK-NEXT: store i8* null, i8** [[CVALUE]]
|
|
}
|
|
|
|
struct S {
|
|
// CHECK: store i32 42
|
|
// CHECK: store i32 55
|
|
S() : x(42), y(55) {}
|
|
union {
|
|
struct {
|
|
int x;
|
|
union { int y; };
|
|
};
|
|
};
|
|
} s;
|
|
|
|
|
|
//PR8760
|
|
template <typename T> struct Foo {
|
|
Foo() : ptr(__nullptr) {}
|
|
union {
|
|
T *ptr;
|
|
};
|
|
};
|
|
Foo<int> f;
|
|
|
|
namespace PR9683 {
|
|
struct QueueEntry {
|
|
union {
|
|
struct {
|
|
void* mPtr;
|
|
union {
|
|
unsigned mSubmissionTag;
|
|
};
|
|
};
|
|
unsigned mValue;
|
|
};
|
|
QueueEntry() {}
|
|
};
|
|
QueueEntry QE;
|
|
}
|
|
|
|
namespace PR13154 {
|
|
struct IndirectReferenceField {
|
|
struct {
|
|
float &x;
|
|
};
|
|
IndirectReferenceField(float &x);
|
|
};
|
|
IndirectReferenceField::IndirectReferenceField(float &xx) : x(xx) {}
|
|
}
|