From dfe292dbebe84bc3a19dba83e9eef52d56492b0a Mon Sep 17 00:00:00 2001 From: Sebastian Redl Date: Sun, 22 Mar 2009 21:28:55 +0000 Subject: [PATCH] Fix build from r67476 and address the easy part of Doug's comments on rvalue refs. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67480 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDeclCXX.cpp | 9 ++++----- lib/Sema/SemaType.cpp | 9 ++++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 60d1692156..95e282ae25 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -711,7 +711,10 @@ namespace { class VISIBILITY_HIDDEN PureVirtualMethodCollector { ASTContext &Context; + public: typedef llvm::SmallVector MethodList; + + private: MethodList Methods; void Collect(const CXXRecordDecl* RD, MethodList& Methods); @@ -1865,7 +1868,6 @@ Sema::CheckReferenceInit(Expr *&Init, QualType &DeclType, BindsDirectly = true; // Rvalue references cannot bind to lvalues (N2812). - // FIXME: This part of rvalue references is still in flux. Revisit later. if (isRValRef) { if (!ICS) Diag(Init->getSourceRange().getBegin(), diag::err_lvalue_to_rvalue_ref) @@ -1909,8 +1911,6 @@ Sema::CheckReferenceInit(Expr *&Init, QualType &DeclType, // 92) (this conversion is selected by enumerating the // applicable conversion functions (13.3.1.6) and choosing // the best one through overload resolution (13.3)), - // FIXME: Without standard language for N2812, the rvalue reference treatment - // here is pretty much a guess. if (!isRValRef && !SuppressUserConversions && T2->isRecordType()) { // FIXME: Look for conversions in base classes! CXXRecordDecl *T2RecordDecl @@ -1923,10 +1923,9 @@ Sema::CheckReferenceInit(Expr *&Init, QualType &DeclType, = Conversions->function_begin(); Func != Conversions->function_end(); ++Func) { CXXConversionDecl *Conv = cast(*Func); - + // If the conversion function doesn't return a reference type, // it can't be considered for this conversion. - // FIXME: This will change when we support rvalue references. if (Conv->getConversionType()->isLValueReferenceType() && (AllowExplicit || !Conv->isExplicit())) AddConversionCandidate(Conv, Init, DeclType, CandidateSet); diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index 24b32e8147..3f4e78cf28 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -323,10 +323,13 @@ QualType Sema::BuildReferenceType(QualType T, bool LValueRef, unsigned Quals, SourceLocation Loc, DeclarationName Entity) { if (LValueRef) { if (const RValueReferenceType *R = T->getAsRValueReferenceType()) { - // FIXME: Find the C++0x reference for reference collapsing. - // In reference collapsing, lvalue refs win over rvalue refs. + // C++0x [dcl.typedef]p9: If a typedef TD names a type that is a + // reference to a type T, and attempt to create the type "lvalue + // reference to cv TD" creates the type "lvalue reference to T". + // We use the qualifiers (restrict or none) of the original reference, + // not the new ones. This is consistent with GCC. return Context.getLValueReferenceType(R->getPointeeType()). - getQualifiedType(Quals); + getQualifiedType(T.getCVRQualifiers()); } } if (T->isReferenceType()) { -- 2.40.0