summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/DeclCXX.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-09-04 14:46:39 +0000
committerDouglas Gregor <dgregor@apple.com>2009-09-04 14:46:39 +0000
commit2d2282e8f919f152ba71a19ac037b636b8d89683 (patch)
tree45e9c87888cabba57ee67ec9de9722c616614a31 /clang/lib/AST/DeclCXX.cpp
parent18156bd75ca65c3740e4dc6be50efe1a69e9839c (diff)
downloadbcm5719-llvm-2d2282e8f919f152ba71a19ac037b636b8d89683.tar.gz
bcm5719-llvm-2d2282e8f919f152ba71a19ac037b636b8d89683.zip
When searching for a default constructor or copy constructor, skip constructor templates
llvm-svn: 81002
Diffstat (limited to 'clang/lib/AST/DeclCXX.cpp')
-rw-r--r--clang/lib/AST/DeclCXX.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp
index 29a7c7fad9e..155005a1003 100644
--- a/clang/lib/AST/DeclCXX.cpp
+++ b/clang/lib/AST/DeclCXX.cpp
@@ -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;
OpenPOWER on IntegriCloud