]> granicus.if.org Git - clang/commitdiff
Don't double-destroy constructors defined out-of-line. This is a
authorDouglas Gregor <dgregor@apple.com>
Mon, 15 Dec 2008 17:33:16 +0000 (17:33 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 15 Dec 2008 17:33:16 +0000 (17:33 +0000)
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

lib/AST/DeclBase.cpp
lib/Sema/SemaDeclCXX.cpp

index 6ddb967a639e59b2e944a3c9e7428d7d3cf19124..45ba794d6bcc009a44e9f89890a8c73117eb63ce 100644 (file)
@@ -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
index c3e947d432183e8dfcc841550d286328c725eb5c..1efb17408a72648efb28286ce4cafaf19cc18052 100644 (file)
@@ -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;
 }