]> granicus.if.org Git - clang/commitdiff
When searching for a default constructor or copy constructor, skip constructor templates
authorDouglas Gregor <dgregor@apple.com>
Fri, 4 Sep 2009 14:46:39 +0000 (14:46 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 4 Sep 2009 14:46:39 +0000 (14:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81002 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/DeclCXX.cpp

index 29a7c7fad9e4b90a9c6c2f8e03a12b0db05dbbfd..155005a10035533c159d4fb2f582797f1ad2dae5 100644 (file)
@@ -157,6 +157,11 @@ CXXConstructorDecl *CXXRecordDecl::getCopyConstructor(ASTContext &Context,
   DeclContext::lookup_const_iterator Con, ConEnd;
   for (llvm::tie(Con, ConEnd) = this->lookup(ConstructorName);
        Con != ConEnd; ++Con) {
+    // C++ [class.copy]p2:
+    //   A non-template constructor for class X is a copy constructor if [...]
+    if (isa<FunctionTemplateDecl>(*Con))
+      continue;
+
     if (cast<CXXConstructorDecl>(*Con)->isCopyConstructor(Context, 
                                                           FoundTQs)) {
       if (((TypeQuals & QualType::Const) == (FoundTQs & QualType::Const)) ||
@@ -301,6 +306,10 @@ CXXRecordDecl::getDefaultConstructor(ASTContext &Context) {
   DeclContext::lookup_const_iterator Con, ConEnd;
   for (llvm::tie(Con, ConEnd) = lookup(ConstructorName);
        Con != ConEnd; ++Con) {
+    // FIXME: In C++0x, a constructor template can be a default constructor.
+    if (isa<FunctionTemplateDecl>(*Con))
+      continue;
+
     CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(*Con);
     if (Constructor->isDefaultConstructor())
       return Constructor;