aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2008-12-15 17:33:16 +0000
committerDouglas Gregor <dgregor@apple.com>2008-12-15 17:33:16 +0000
commit0874bd31984529b71aa4ffaac73be948e2402222 (patch)
treed6e11ff172f7cb8347be11406ece6da8ecb3146f
parent7df7b6bb800e1987951285ea192e4f347e1b603a (diff)
Don't double-destroy constructors defined out-of-line. This is a
half-solution; the real solution is coming when constructors and destructors are treated like all other functions by ActOnDeclarator. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61037 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/AST/DeclBase.cpp1
-rw-r--r--lib/Sema/SemaDeclCXX.cpp20
2 files changed, 12 insertions, 9 deletions
diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp
index 6ddb967a63..45ba794d6b 100644
--- a/lib/AST/DeclBase.cpp
+++ b/lib/AST/DeclBase.cpp
@@ -321,7 +321,6 @@ void Decl::swapAttrs(Decl *RHS) {
void Decl::Destroy(ASTContext& C) {
-
if (ScopedDecl* SD = dyn_cast<ScopedDecl>(this)) {
// Observe the unrolled recursion. By setting N->NextDeclarator = 0x0
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index c3e947d432..1efb17408a 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -1112,13 +1112,17 @@ Sema::DeclTy *Sema::ActOnConstructorDeclarator(CXXConstructorDecl *ConDecl) {
// Make sure this constructor is an overload of the existing
// constructors.
OverloadedFunctionDecl::function_iterator MatchedDecl;
- if (!IsOverload(ConDecl, ClassDecl->getConstructors(), MatchedDecl) &&
- CurContext == (*MatchedDecl)->getLexicalDeclContext()) {
- Diag(ConDecl->getLocation(), diag::err_constructor_redeclared)
- << SourceRange(ConDecl->getLocation());
- Diag((*MatchedDecl)->getLocation(), diag::note_previous_declaration)
- << SourceRange((*MatchedDecl)->getLocation());
- ConDecl->setInvalidDecl();
+ if (!IsOverload(ConDecl, ClassDecl->getConstructors(), MatchedDecl)) {
+ if (CurContext == (*MatchedDecl)->getLexicalDeclContext()) {
+ Diag(ConDecl->getLocation(), diag::err_constructor_redeclared)
+ << SourceRange(ConDecl->getLocation());
+ Diag((*MatchedDecl)->getLocation(), diag::note_previous_declaration)
+ << SourceRange((*MatchedDecl)->getLocation());
+ ConDecl->setInvalidDecl();
+ return 0;
+ }
+
+ // FIXME: Just drop the definition (for now).
return ConDecl;
}
@@ -1142,7 +1146,7 @@ Sema::DeclTy *Sema::ActOnConstructorDeclarator(CXXConstructorDecl *ConDecl) {
}
// Add this constructor to the set of constructors of the current
- // class.
+ // class.
ClassDecl->addConstructor(Context, ConDecl);
return (DeclTy *)ConDecl;
}