]> granicus.if.org Git - clang/commitdiff
Fix build from r67476 and address the easy part of Doug's comments on rvalue refs.
authorSebastian Redl <sebastian.redl@getdesigned.at>
Sun, 22 Mar 2009 21:28:55 +0000 (21:28 +0000)
committerSebastian Redl <sebastian.redl@getdesigned.at>
Sun, 22 Mar 2009 21:28:55 +0000 (21:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67480 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
lib/Sema/SemaType.cpp

index 60d169215642e258acb5c6a8d659c483e7042077..95e282ae25e5ac40dbc0c9302f485e3be97b814d 100644 (file)
@@ -711,7 +711,10 @@ namespace {
   class VISIBILITY_HIDDEN PureVirtualMethodCollector {
     ASTContext &Context;
 
+  public:
     typedef llvm::SmallVector<const CXXMethodDecl*, 8> 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<CXXConversionDecl>(*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);
index 24b32e8147c85303a470862a0f0876e28f84679f..3f4e78cf28cc5b3cbfc516378ec4cdf16024daca 100644 (file)
@@ -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()) {