diff options
author | Anastasia Stulova <anastasia.stulova@arm.com> | 2019-06-21 11:36:15 +0000 |
---|---|---|
committer | Anastasia Stulova <anastasia.stulova@arm.com> | 2019-06-21 11:36:15 +0000 |
commit | 3562edb9c49eb43eaabeb0d1dab255397cfe027c (patch) | |
tree | 4429d774775c2b04b24de01d0c06522bccabd6a7 /clang/lib/Sema/SemaInit.cpp | |
parent | 8d30a6e40c6b58fb08891b62a9ab31c4abc4ec4e (diff) | |
download | llvm-3562edb9c49eb43eaabeb0d1dab255397cfe027c.zip llvm-3562edb9c49eb43eaabeb0d1dab255397cfe027c.tar.gz llvm-3562edb9c49eb43eaabeb0d1dab255397cfe027c.tar.bz2 |
[Sema] Fix diagnostic for addr spaces in reference binding
Extend reference binding behavior to account for address spaces.
Differential Revision: https://reviews.llvm.org/D62914
llvm-svn: 364032
Diffstat (limited to 'clang/lib/Sema/SemaInit.cpp')
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 1288091..d2a4a09 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -4631,7 +4631,10 @@ static void TryReferenceInitializationCore(Sema &S, // - Otherwise, the reference shall be an lvalue reference to a // non-volatile const type (i.e., cv1 shall be const), or the reference // shall be an rvalue reference. - if (isLValueRef && !(T1Quals.hasConst() && !T1Quals.hasVolatile())) { + // For address spaces, we interpret this to mean that an addr space + // of a reference "cv1 T1" is a superset of addr space of "cv2 T2". + if (isLValueRef && !(T1Quals.hasConst() && !T1Quals.hasVolatile() && + T1Quals.isAddressSpaceSupersetOf(T2Quals))) { if (S.Context.getCanonicalType(T2) == S.Context.OverloadTy) Sequence.SetFailed(InitializationSequence::FK_AddressOfOverloadFailed); else if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty()) @@ -4640,7 +4643,10 @@ static void TryReferenceInitializationCore(Sema &S, ConvOvlResult); else if (!InitCategory.isLValue()) Sequence.SetFailed( - InitializationSequence::FK_NonConstLValueReferenceBindingToTemporary); + T1Quals.isAddressSpaceSupersetOf(T2Quals) + ? InitializationSequence:: + FK_NonConstLValueReferenceBindingToTemporary + : InitializationSequence::FK_ReferenceInitDropsQualifiers); else { InitializationSequence::FailureKind FK; switch (RefRelationship) { @@ -8521,12 +8527,16 @@ bool InitializationSequence::Diagnose(Sema &S, Qualifiers DroppedQualifiers = SourceType.getQualifiers() - NonRefType.getQualifiers(); - S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals) - << NonRefType - << SourceType - << Qualifiers::fromCVRMask(DroppedQualifiers.getCVRQualifiers()) - << DroppedQualifiers.getCVRQualifiers() - << Args[0]->getSourceRange(); + if (!NonRefType.getQualifiers().isAddressSpaceSupersetOf( + SourceType.getQualifiers())) + S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals) + << NonRefType << SourceType << 1 /*addr space*/ + << Args[0]->getSourceRange(); + else + S.Diag(Kind.getLocation(), diag::err_reference_bind_drops_quals) + << NonRefType << SourceType << 0 /*cv quals*/ + << Qualifiers::fromCVRMask(DroppedQualifiers.getCVRQualifiers()) + << DroppedQualifiers.getCVRQualifiers() << Args[0]->getSourceRange(); break; } |