]> granicus.if.org Git - clang/commitdiff
Member function templates (and instantiations/specializations thereof)
authorDouglas Gregor <dgregor@apple.com>
Tue, 13 Oct 2009 23:45:19 +0000 (23:45 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 13 Oct 2009 23:45:19 +0000 (23:45 +0000)
are never copy constructors or copy assignment operators.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84057 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/DeclCXX.cpp

index b9a87aedd7612adcb9c2932f15a5c342f49b657e..457f4c85a04711452ff16e13b50dc211476dcd5e 100644 (file)
@@ -192,7 +192,8 @@ bool CXXRecordDecl::hasConstCopyAssignment(ASTContext &Context,
     const CXXMethodDecl* Method = cast<CXXMethodDecl>(*Op);
     if (Method->isStatic())
       continue;
-    // TODO: Skip templates? Or is this implicitly done due to parameter types?
+    if (Method->getPrimaryTemplate())
+      continue;
     const FunctionProtoType *FnType =
       Method->getType()->getAs<FunctionProtoType>();
     assert(FnType && "Overloaded operator has no prototype.");
@@ -259,6 +260,11 @@ void CXXRecordDecl::addedAssignmentOperator(ASTContext &Context,
   const FunctionProtoType *FnType = OpDecl->getType()->getAs<FunctionProtoType>();
   assert(FnType && "Overloaded operator has no proto function type.");
   assert(FnType->getNumArgs() == 1 && !FnType->isVariadic());
+  
+  // Copy assignment operators must be non-templates.
+  if (OpDecl->getPrimaryTemplate() || OpDecl->getDescribedFunctionTemplate())
+    return;
+  
   QualType ArgType = FnType->getArgType(0);
   if (const LValueReferenceType *Ref = ArgType->getAs<LValueReferenceType>())
     ArgType = Ref->getPointeeType();
@@ -694,7 +700,9 @@ CXXConstructorDecl::isCopyConstructor(ASTContext &Context,
   //   const volatile X&, and either there are no other parameters
   //   or else all other parameters have default arguments (8.3.6).
   if ((getNumParams() < 1) ||
-      (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()))
+      (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) ||
+      (getPrimaryTemplate() != 0) ||
+      (getDescribedFunctionTemplate() != 0))
     return false;
 
   const ParmVarDecl *Param = getParamDecl(0);