diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index df296eb4e28e5..e57f3de75ac8a 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -3728,6 +3728,10 @@ QualType QualType::getNonLValueExprType(const ASTContext &Context) const { (!getTypePtr()->isDependentType() && !getTypePtr()->isRecordType())) return getUnqualifiedType(); + // A prvalue should not have an address space. + if (hasAddressSpace()) + return Context.removeAddrSpaceQualType(*this); + return *this; } diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 48ce51863c2c0..44071e150b781 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -7682,9 +7682,8 @@ PerformConstructorInitialization(Sema &S, CurInit = S.CheckForImmediateInvocation( CXXTemporaryObjectExpr::Create( - S.Context, CalleeDecl, - Entity.getType().getNonLValueExprType(S.Context), TSInfo, - ConstructorArgs, ParenOrBraceRange, HadMultipleCandidates, + S.Context, CalleeDecl, Entity.getType().getNonReferenceType(), + TSInfo, ConstructorArgs, ParenOrBraceRange, HadMultipleCandidates, IsListInitialization, IsStdInitListInitialization, ConstructorInitRequiresZeroInit), CalleeDecl); diff --git a/clang/test/SemaCXX/address-space-prvalue.cpp b/clang/test/SemaCXX/address-space-prvalue.cpp new file mode 100644 index 0000000000000..c0cbb20c10f2d --- /dev/null +++ b/clang/test/SemaCXX/address-space-prvalue.cpp @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 %s -ast-dump | FileCheck %s + +struct X { int a; }; + +using GlobalX = X __attribute__((address_space(1))); + +GlobalX prvalue(); +GlobalX &lvalue(); +GlobalX &&xvalue(); + +void test() { + // A prvalue should not have an address space even if the function's + // return type is address-space qualified. + // CHECK: VarDecl {{.*}} v 'X' + // CHECK: CallExpr {{.*}} 'X'{{$}} + auto v = prvalue(); + + // CHECK: VarDecl {{.*}} l '__attribute__((address_space(1))) X &' + // CHECK: CallExpr {{.*}}:'__attribute__((address_space(1))) X' lvalue + auto &l = lvalue(); + + // CHECK: VarDecl {{.*}} r '__attribute__((address_space(1))) X &&' + // CHECK: CallExpr {{.*}}:'__attribute__((address_space(1))) X' xvalue + auto &&r = xvalue(); +}