зеркало из https://github.com/microsoft/clang.git
[CUDA] Allow trivial constructors as initializer for __shared__ variables.
Differential Revision: http://reviews.llvm.org/D12739 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@247307 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
4e5a4032df
Коммит
80ba331d31
|
@ -2165,8 +2165,10 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
|
||||||
if (getLangOpts().CPlusPlus && getLangOpts().CUDAIsDevice
|
if (getLangOpts().CPlusPlus && getLangOpts().CUDAIsDevice
|
||||||
&& D->hasAttr<CUDASharedAttr>()) {
|
&& D->hasAttr<CUDASharedAttr>()) {
|
||||||
if (InitExpr) {
|
if (InitExpr) {
|
||||||
Error(D->getLocation(),
|
const auto *C = dyn_cast<CXXConstructExpr>(InitExpr);
|
||||||
"__shared__ variable cannot have an initialization.");
|
if (C == nullptr || !C->getConstructor()->hasTrivialBody())
|
||||||
|
Error(D->getLocation(),
|
||||||
|
"__shared__ variable cannot have an initialization.");
|
||||||
}
|
}
|
||||||
Init = llvm::UndefValue::get(getTypes().ConvertType(ASTTy));
|
Init = llvm::UndefValue::get(getTypes().ConvertType(ASTTy));
|
||||||
} else if (!InitExpr) {
|
} else if (!InitExpr) {
|
||||||
|
|
|
@ -25,6 +25,8 @@ struct MyStruct {
|
||||||
// CHECK: @_ZZ5func3vE1a = internal addrspace(3) global float 0.000000e+00
|
// CHECK: @_ZZ5func3vE1a = internal addrspace(3) global float 0.000000e+00
|
||||||
// CHECK: @_ZZ5func4vE1a = internal addrspace(3) global float 0.000000e+00
|
// CHECK: @_ZZ5func4vE1a = internal addrspace(3) global float 0.000000e+00
|
||||||
// CHECK: @b = addrspace(3) global float undef
|
// CHECK: @b = addrspace(3) global float undef
|
||||||
|
// CHECK: @c = addrspace(3) global %struct.c undef
|
||||||
|
// CHECK @d = addrspace(3) global %struct.d undef
|
||||||
|
|
||||||
__device__ void foo() {
|
__device__ void foo() {
|
||||||
// CHECK: load i32, i32* addrspacecast (i32 addrspace(1)* @i to i32*)
|
// CHECK: load i32, i32* addrspacecast (i32 addrspace(1)* @i to i32*)
|
||||||
|
@ -117,3 +119,15 @@ __device__ int construct_shared_struct() {
|
||||||
return t.getData();
|
return t.getData();
|
||||||
// CHECK: call i32 @_ZN14StructWithCtor7getDataEv(%struct.StructWithCtor* addrspacecast (%struct.StructWithCtor addrspace(3)* @_ZZ23construct_shared_structvE1t to %struct.StructWithCtor*))
|
// CHECK: call i32 @_ZN14StructWithCtor7getDataEv(%struct.StructWithCtor* addrspacecast (%struct.StructWithCtor addrspace(3)* @_ZZ23construct_shared_structvE1t to %struct.StructWithCtor*))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make sure we allow __shared__ structures with default or empty constructors.
|
||||||
|
struct c {
|
||||||
|
int i;
|
||||||
|
};
|
||||||
|
__shared__ struct c c;
|
||||||
|
|
||||||
|
struct d {
|
||||||
|
int i;
|
||||||
|
d() {}
|
||||||
|
};
|
||||||
|
__shared__ struct d d;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче