]> granicus.if.org Git - clang/commitdiff
When something goes wrong in type-checking a namespace definition, make the namespace...
authorDouglas Gregor <dgregor@apple.com>
Tue, 10 Jan 2012 22:14:10 +0000 (22:14 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 10 Jan 2012 22:14:10 +0000 (22:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147882 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp

index 39f79757be39aa6227a8a3ef0b6170d1ea035a0e..e9c842bdc7aa4e7e02152e5f3fcb30ac8a700a0d 100644 (file)
@@ -5532,6 +5532,7 @@ Decl *Sema::ActOnStartNamespaceDef(Scope *NamespcScope,
   // For anonymous namespace, take the location of the left brace.
   SourceLocation Loc = II ? IdentLoc : LBrace;
   bool IsInline = InlineLoc.isValid();
+  bool IsInvalid = false;
   bool IsStd = false;
   bool AddToKnown = false;
   Scope *DeclRegionScope = NamespcScope->getParent();
@@ -5586,6 +5587,7 @@ Decl *Sema::ActOnStartNamespaceDef(Scope *NamespcScope,
       Diag(Loc, diag::err_redefinition_different_kind)
         << II;
       Diag(PrevDecl->getLocation(), diag::note_previous_definition);
+      IsInvalid = true;
       // Continue on to push Namespc as current DeclContext and return it.
     } else if (II->isStr("std") &&
                CurContext->getRedeclContext()->isTranslationUnit()) {
@@ -5615,7 +5617,7 @@ Decl *Sema::ActOnStartNamespaceDef(Scope *NamespcScope,
       Diag(Loc, diag::err_inline_namespace_mismatch)
         << IsInline;
       Diag(PrevNS->getLocation(), diag::note_previous_definition);
-
+      
       // Recover by ignoring the new namespace's inline status.
       IsInline = PrevNS->isInline();
     }
@@ -5623,6 +5625,8 @@ Decl *Sema::ActOnStartNamespaceDef(Scope *NamespcScope,
   
   NamespaceDecl *Namespc = NamespaceDecl::Create(Context, CurContext, IsInline,
                                                  StartLoc, Loc, II, PrevNS);
+  if (IsInvalid)
+    Namespc->setInvalidDecl();
   
   ProcessDeclAttributeList(DeclRegionScope, Namespc, AttrList);