[cfe-commits] r62124 - in /cfe/trunk: lib/AST/DeclarationName.cpp lib/Sema/SemaOverload.cpp test/SemaCXX/overloaded-operator.cpp

Douglas Gregor dgregor at apple.com
Mon Jan 12 16:11:19 PST 2009


Author: dgregor
Date: Mon Jan 12 18:11:19 2009
New Revision: 62124

URL: http://llvm.org/viewvc/llvm-project?rev=62124&view=rev
Log:
Make sure we don't name a constructor or destructor with a qualified
type. It leads to very weird errors.

Modified:
    cfe/trunk/lib/AST/DeclarationName.cpp
    cfe/trunk/lib/Sema/SemaOverload.cpp
    cfe/trunk/test/SemaCXX/overloaded-operator.cpp

Modified: cfe/trunk/lib/AST/DeclarationName.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclarationName.cpp?rev=62124&r1=62123&r2=62124&view=diff

==============================================================================
--- cfe/trunk/lib/AST/DeclarationName.cpp (original)
+++ cfe/trunk/lib/AST/DeclarationName.cpp Mon Jan 12 18:11:19 2009
@@ -286,9 +286,11 @@
   switch (Kind) {
   case DeclarationName::CXXConstructorName: 
     EKind = DeclarationNameExtra::CXXConstructor;
+    assert(Ty.getCVRQualifiers() == 0 && "Constructor type must be unqualified");
     break;
   case DeclarationName::CXXDestructorName:
     EKind = DeclarationNameExtra::CXXDestructor;
+    assert(Ty.getCVRQualifiers() == 0 && "Destructor type must be unqualified");
     break;
   case DeclarationName::CXXConversionFunctionName:
     EKind = DeclarationNameExtra::CXXConversionFunction;

Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=62124&r1=62123&r2=62124&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Mon Jan 12 18:11:19 2009
@@ -1115,7 +1115,7 @@
     CXXRecordDecl *ToRecordDecl = ToRecordType->getDecl();
     DeclarationName ConstructorName 
       = Context.DeclarationNames.getCXXConstructorName(
-                                             Context.getCanonicalType(ToType));
+                        Context.getCanonicalType(ToType).getUnqualifiedType());
     DeclContext::lookup_iterator Con, ConEnd;
     for (llvm::tie(Con, ConEnd) = ToRecordDecl->lookup(ConstructorName);
          Con != ConEnd; ++Con) {

Modified: cfe/trunk/test/SemaCXX/overloaded-operator.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/overloaded-operator.cpp?rev=62124&r1=62123&r2=62124&view=diff

==============================================================================
--- cfe/trunk/test/SemaCXX/overloaded-operator.cpp (original)
+++ cfe/trunk/test/SemaCXX/overloaded-operator.cpp Mon Jan 12 18:11:19 2009
@@ -172,3 +172,14 @@
   int &i2 = a2->m;
   a3->m; // expected-error{{no viable overloaded 'operator->'; candidate is}}
 }
+
+struct CopyConBase {
+};
+
+struct CopyCon : public CopyConBase {
+  CopyCon(const CopyConBase &Base);
+
+  CopyCon(const CopyConBase *Base) {
+    *this = *Base;
+  }
+};





More information about the cfe-commits mailing list