From 58d59d4b68ffc5f9d77868720917effa21d096df Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Fri, 21 Oct 2016 23:01:55 +0000 Subject: [PATCH] Remove unnecessary distinction between Ref_Compatible and Ref_Compatible_With_Added_Qualification. We always treated these two values the same way. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@284895 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Sema/Sema.h | 8 +------- lib/Sema/SemaCast.cpp | 2 +- lib/Sema/SemaInit.cpp | 7 +++---- lib/Sema/SemaOverload.cpp | 13 +++++-------- 4 files changed, 10 insertions(+), 20 deletions(-) diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 37d814bfd8..be5a0bcd58 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -8992,13 +8992,7 @@ public: /// that their unqualified forms (T1 and T2) are either the same /// or T1 is a base class of T2. Ref_Related, - /// Ref_Compatible_With_Added_Qualification - The two types are - /// reference-compatible with added qualification, meaning that - /// they are reference-compatible and the qualifiers on T1 (cv1) - /// are greater than the qualifiers on T2 (cv2). - Ref_Compatible_With_Added_Qualification, - /// Ref_Compatible - The two types are reference-compatible and - /// have equivalent qualifiers (cv1 == cv2). + /// Ref_Compatible - The two types are reference-compatible. Ref_Compatible }; diff --git a/lib/Sema/SemaCast.cpp b/lib/Sema/SemaCast.cpp index e19020c6ad..43fdf59042 100644 --- a/lib/Sema/SemaCast.cpp +++ b/lib/Sema/SemaCast.cpp @@ -1165,7 +1165,7 @@ TryLValueToRValueCast(Sema &Self, Expr *SrcExpr, QualType DestType, ToType, FromType, DerivedToBase, ObjCConversion, ObjCLifetimeConversion) - < Sema::Ref_Compatible_With_Added_Qualification) { + != Sema::Ref_Compatible) { if (CStyle) return TC_NotApplicable; msg = diag::err_bad_lvalue_to_rvalue_cast; diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index c6a773cf8f..f5e38b4fbd 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -4263,7 +4263,7 @@ static void TryReferenceInitializationCore(Sema &S, bool T1Function = T1->isFunctionType(); if (isLValueRef || T1Function) { if (InitCategory.isLValue() && - (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification || + (RefRelationship == Sema::Ref_Compatible || (Kind.isCStyleOrFunctionalCast() && RefRelationship == Sema::Ref_Related))) { // - is an lvalue (but is not a bit-field), and "cv1 T1" is @@ -4336,7 +4336,7 @@ static void TryReferenceInitializationCore(Sema &S, // "cv1 T1" is reference-compatible with "cv2 T2" // Note: functions are handled below. if (!T1Function && - (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification || + (RefRelationship == Sema::Ref_Compatible || (Kind.isCStyleOrFunctionalCast() && RefRelationship == Sema::Ref_Related)) && (InitCategory.isXValue() || @@ -4393,8 +4393,7 @@ static void TryReferenceInitializationCore(Sema &S, return; } - if ((RefRelationship == Sema::Ref_Compatible || - RefRelationship == Sema::Ref_Compatible_With_Added_Qualification) && + if (RefRelationship == Sema::Ref_Compatible && isRValueRef && InitCategory.isLValue()) { Sequence.SetFailed( InitializationSequence::FK_RValueReferenceBindingToLValue); diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 8d6c562dd0..a39ad58c4f 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -4220,10 +4220,8 @@ Sema::CompareReferenceRelationship(SourceLocation Loc, T1Quals.removeUnaligned(); T2Quals.removeUnaligned(); - if (T1Quals == T2Quals) + if (T1Quals.compatiblyIncludes(T2Quals)) return Ref_Compatible; - else if (T1Quals.compatiblyIncludes(T2Quals)) - return Ref_Compatible_With_Added_Qualification; else return Ref_Related; } @@ -4401,8 +4399,7 @@ TryReferenceInit(Sema &S, Expr *Init, QualType DeclType, // reference-compatible with "cv2 T2," or // // Per C++ [over.ics.ref]p4, we don't check the bit-field property here. - if (InitCategory.isLValue() && - RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification) { + if (InitCategory.isLValue() && RefRelationship == Sema::Ref_Compatible) { // C++ [over.ics.ref]p1: // When a parameter of reference type binds directly (8.5.3) // to an argument expression, the implicit conversion sequence @@ -4464,10 +4461,10 @@ TryReferenceInit(Sema &S, Expr *Init, QualType DeclType, // // -- is an xvalue, class prvalue, array prvalue or function // lvalue and "cv1 T1" is reference-compatible with "cv2 T2", or - if (RefRelationship >= Sema::Ref_Compatible_With_Added_Qualification && + if (RefRelationship == Sema::Ref_Compatible && (InitCategory.isXValue() || - (InitCategory.isPRValue() && (T2->isRecordType() || T2->isArrayType())) || - (InitCategory.isLValue() && T2->isFunctionType()))) { + (InitCategory.isPRValue() && (T2->isRecordType() || T2->isArrayType())) || + (InitCategory.isLValue() && T2->isFunctionType()))) { ICS.setStandard(); ICS.Standard.First = ICK_Identity; ICS.Standard.Second = DerivedToBase? ICK_Derived_To_Base -- 2.40.0