aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaInit.cpp
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2010-01-12 20:32:25 +0000
committerChandler Carruth <chandlerc@gmail.com>2010-01-12 20:32:25 +0000
commit5535c38a2fcface6c13bc8bbeca66882de2fa227 (patch)
treeb22ed8971f2daf7571379a65a3d21f5318b6e131 /lib/Sema/SemaInit.cpp
parente9cde116a9beac8ad0acd99b9face9d07990cc73 (diff)
Fix the CodeGen half of PR5911 by changing reference initialization to
correctly look through arrays to see cv-qualifiers. Also enhances the routine for doing this to preserve more type sugaring for diagnostics. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93252 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaInit.cpp')
-rw-r--r--lib/Sema/SemaInit.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp
index 0079265a38..1970f56e28 100644
--- a/lib/Sema/SemaInit.cpp
+++ b/lib/Sema/SemaInit.cpp
@@ -2227,9 +2227,11 @@ static void TryReferenceInitialization(Sema &S,
QualType DestType = Entity.getType();
QualType cv1T1 = DestType->getAs<ReferenceType>()->getPointeeType();
- QualType T1 = cv1T1.getUnqualifiedType();
+ Qualifiers T1Quals;
+ QualType T1 = S.Context.getUnqualifiedArrayType(cv1T1, T1Quals);
QualType cv2T2 = Initializer->getType();
- QualType T2 = cv2T2.getUnqualifiedType();
+ Qualifiers T2Quals;
+ QualType T2 = S.Context.getUnqualifiedArrayType(cv2T2, T2Quals);
SourceLocation DeclLoc = Initializer->getLocStart();
// If the initializer is the address of an overloaded function, try
@@ -2279,9 +2281,9 @@ static void TryReferenceInitialization(Sema &S,
// can occur. This property will be checked by PerformInitialization.
if (DerivedToBase)
Sequence.AddDerivedToBaseCastStep(
- S.Context.getQualifiedType(T1, cv2T2.getQualifiers()),
+ S.Context.getQualifiedType(T1, T2Quals),
/*isLValue=*/true);
- if (cv1T1.getQualifiers() != cv2T2.getQualifiers())
+ if (T1Quals != T2Quals)
Sequence.AddQualificationConversionStep(cv1T1, /*IsLValue=*/true);
Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/false);
return;
@@ -2312,7 +2314,7 @@ static void TryReferenceInitialization(Sema &S,
// non-volatile const type (i.e., cv1 shall be const), or the reference
// shall be an rvalue reference and the initializer expression shall
// be an rvalue.
- if (!((isLValueRef && cv1T1.getCVRQualifiers() == Qualifiers::Const) ||
+ if (!((isLValueRef && T1Quals.hasConst()) ||
(isRValueRef && InitLvalue != Expr::LV_Valid))) {
if (ConvOvlResult && !Sequence.getFailedCandidateSet().empty())
Sequence.SetOverloadFailure(
@@ -2339,9 +2341,9 @@ static void TryReferenceInitialization(Sema &S,
RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification) {
if (DerivedToBase)
Sequence.AddDerivedToBaseCastStep(
- S.Context.getQualifiedType(T1, cv2T2.getQualifiers()),
+ S.Context.getQualifiedType(T1, T2Quals),
/*isLValue=*/false);
- if (cv1T1.getQualifiers() != cv2T2.getQualifiers())
+ if (T1Quals != T2Quals)
Sequence.AddQualificationConversionStep(cv1T1, /*IsLValue=*/false);
Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true);
return;
@@ -2406,8 +2408,10 @@ static void TryReferenceInitialization(Sema &S,
// [...] If T1 is reference-related to T2, cv1 must be the
// same cv-qualification as, or greater cv-qualification
// than, cv2; otherwise, the program is ill-formed.
+ unsigned T1CVRQuals = T1Quals.getCVRQualifiers();
+ unsigned T2CVRQuals = T2Quals.getCVRQualifiers();
if (RefRelationship == Sema::Ref_Related &&
- !cv1T1.isAtLeastAsQualifiedAs(cv2T2)) {
+ (T1CVRQuals | T2CVRQuals) != T1CVRQuals) {
Sequence.SetFailed(InitializationSequence::FK_ReferenceInitDropsQualifiers);
return;
}