diff --git a/clang/include/clang/Sema/Initialization.h b/clang/include/clang/Sema/Initialization.h --- a/clang/include/clang/Sema/Initialization.h +++ b/clang/include/clang/Sema/Initialization.h @@ -335,8 +335,15 @@ } /// Create the initialization entity for a temporary. - static InitializedEntity InitializeTemporary(TypeSourceInfo *TypeInfo) { - return InitializeTemporary(TypeInfo, TypeInfo->getType()); + static InitializedEntity InitializeTemporary(ASTContext &Context, + TypeSourceInfo *TypeInfo) { + QualType Type = TypeInfo->getType(); + if (Context.getLangOpts().OpenCLCPlusPlus) { + assert(!Type.hasAddressSpace() && "Temporary already has address space!"); + Type = Context.getAddrSpaceQualType(Type, LangAS::opencl_private); + } + + return InitializeTemporary(TypeInfo, Type); } /// Create the initialization entity for a temporary. diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -1453,7 +1453,8 @@ "List initialization must have initializer list as expression."); SourceRange FullRange = SourceRange(TyBeginLoc, RParenOrBraceLoc); - InitializedEntity Entity = InitializedEntity::InitializeTemporary(TInfo); + InitializedEntity Entity = + InitializedEntity::InitializeTemporary(Context, TInfo); InitializationKind Kind = Exprs.size() ? ListInitialization @@ -5290,7 +5291,8 @@ S, Sema::ExpressionEvaluationContext::Unevaluated); Sema::SFINAETrap SFINAE(S, /*AccessCheckingSFINAE=*/true); Sema::ContextRAII TUContext(S, S.Context.getTranslationUnitDecl()); - InitializedEntity To(InitializedEntity::InitializeTemporary(Args[0])); + InitializedEntity To( + InitializedEntity::InitializeTemporary(S.Context, Args[0])); InitializationKind InitKind(InitializationKind::CreateDirect(KWLoc, KWLoc, RParenLoc)); InitializationSequence Init(S, To, InitKind, ArgExprs); diff --git a/clang/test/SemaOpenCLCXX/addrspace-constructors.clcpp b/clang/test/SemaOpenCLCXX/addrspace-constructors.clcpp --- a/clang/test/SemaOpenCLCXX/addrspace-constructors.clcpp +++ b/clang/test/SemaOpenCLCXX/addrspace-constructors.clcpp @@ -32,6 +32,8 @@ __local X lx; __private X x; + __private X tx = X(); + __private Y py; __constant Y cy1; // expected-error{{variable in constant address space must be initialized}} __constant Y cy2(1); // expected-error{{no matching constructor for initialization of '__constant Y'}} diff --git a/clang/test/SemaOpenCLCXX/temporaries.clcpp b/clang/test/SemaOpenCLCXX/temporaries.clcpp new file mode 100644 --- /dev/null +++ b/clang/test/SemaOpenCLCXX/temporaries.clcpp @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 %s -pedantic -ast-dump | FileCheck %s + +struct X { + X() __private = default; +}; + +// CHECK: VarDecl {{.*}} gx +// CHECK: CXXTemporaryObjectExpr {{.*}} '__private X' +__global X gx = X(); + +void k() { + // CHECK: VarDecl {{.*}} x1 + // CHECK: CXXTemporaryObjectExpr {{.*}} '__private X' + X x1 = X(); + + // CHECK: VarDecl {{.*}} x2 + // CHECK: CXXConstructExpr {{.*}} 'const __private X' + const X x2; +}