]> granicus.if.org Git - clang/commitdiff
When creating CXXRecordDecls and RecordDecls within ActOnTag, hook up the new [CXX...
authorTed Kremenek <kremenek@apple.com>
Tue, 2 Sep 2008 21:26:19 +0000 (21:26 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 2 Sep 2008 21:26:19 +0000 (21:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55652 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp

index 564f530191dc45a5906f0b74e96d170e70f5e23e..7c660bf5955e1563a2fad476b3b00d5d366c6349 100644 (file)
@@ -1683,9 +1683,10 @@ Sema::DeclTy *Sema::ActOnTag(Scope *S, unsigned TagType, TagKind TK,
   // If this is a named struct, check to see if there was a previous forward
   // declaration or definition.
   // Use ScopedDecl instead of TagDecl, because a NamespaceDecl may come up.
-  if (ScopedDecl *PrevDecl = 
-          dyn_cast_or_null<ScopedDecl>(LookupDecl(Name, Decl::IDNS_Tag, S))) {
-    
+  ScopedDecl *PrevDecl = 
+    dyn_cast_or_null<ScopedDecl>(LookupDecl(Name, Decl::IDNS_Tag, S));
+  
+  if (PrevDecl) {    
     assert((isa<TagDecl>(PrevDecl) || isa<NamespaceDecl>(PrevDecl)) &&
             "unexpected Decl type");
     if (TagDecl *PrevTagDecl = dyn_cast<TagDecl>(PrevDecl)) {
@@ -1758,9 +1759,18 @@ Sema::DeclTy *Sema::ActOnTag(Scope *S, unsigned TagType, TagKind TK,
     // struct X { int A; } D;    D should chain to X.
     if (getLangOptions().CPlusPlus)
       // FIXME: Look for a way to use RecordDecl for simple structs.
-      New = CXXRecordDecl::Create(Context, Kind, CurContext, Loc, Name, 0);
+
+      // We use 'dyn_cast' instead of 'cast' because PrevDecl might not
+      // be a CXXRecordDecl* if we had a redefinition error.  In this case,
+      // the dyn_cast will return a NULL pointer.
+      New = CXXRecordDecl::Create(Context, Kind, CurContext, Loc, Name,
+                                  dyn_cast_or_null<CXXRecordDecl>(PrevDecl));
     else
-      New = RecordDecl::Create(Context, Kind, CurContext, Loc, Name, 0);
+      // We use 'dyn_cast' instead of 'cast' because PrevDecl might not
+      // be a RecordDecl* if we had a redefinition error.  In this case,
+      // the dyn_cast will return a NULL pointer.      
+      New = RecordDecl::Create(Context, Kind, CurContext, Loc, Name,
+                               dyn_cast_or_null<RecordDecl>(PrevDecl));
   }
   
   // If this has an identifier, add it to the scope stack.