]> granicus.if.org Git - clang/commitdiff
Fix codegen of chained declarations
authorDaniel Dunbar <daniel@zuster.org>
Tue, 29 Jul 2008 17:47:36 +0000 (17:47 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 29 Jul 2008 17:47:36 +0000 (17:47 +0000)
 - Killed useless CodeGenModule::EmitGlobalVarDeclarator, instead just
   recurse on any ScopedDecl.
 - Fix for <rdar://problem/6093838>

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54162 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenModule.cpp
lib/CodeGen/CodeGenModule.h
lib/CodeGen/ModuleBuilder.cpp
test/CodeGen/2008-07-21-mixed-var-fn-decl.c [new file with mode: 0644]

index f2112ebd7212c3f6303e66ff800d6242580e7365..565286c43de37073ce4f3bfe9b673e8969c37a33 100644 (file)
@@ -772,14 +772,6 @@ void CodeGenModule::EmitGlobalVarInit(const VarDecl *D) {
   }
 }
 
-/// EmitGlobalVarDeclarator - Emit all the global vars attached to the specified
-/// declarator chain.
-void CodeGenModule::EmitGlobalVarDeclarator(const VarDecl *D) {
-  for (; D; D = cast_or_null<VarDecl>(D->getNextDeclarator()))
-    if (D->isFileVarDecl())
-      EmitGlobalVar(D);
-}
-
 void CodeGenModule::UpdateCompletedType(const TagDecl *TD) {
   // Make sure that this type is translated.
   Types.UpdateCompletedType(TD);
index d69b87f12fa6ee78a4421c5380424709baa4bb4a..860949724270e6dfcc420daa76d704592ae5870e 100644 (file)
@@ -124,7 +124,6 @@ public:
   void EmitFunction(const FunctionDecl *FD);
   void EmitGlobalVar(const VarDecl *D);
   void EmitGlobalVarInit(const VarDecl *D);
-  void EmitGlobalVarDeclarator(const VarDecl *D);
   void UpdateCompletedType(const TagDecl *D);
   llvm::Constant *EmitGlobalInit(const Expr *E);
   llvm::Constant *EmitConstantExpr(const Expr *E, CodeGenFunction *CGF = 0);
index b37b8d3f01b8cc2f4d4862bb01ca18736981c834..3fa086fc6a701f66a5ea2d4b34e1e5240395c377 100644 (file)
@@ -64,7 +64,7 @@ namespace {
       // semantic analysis (to ensure all warnings and errors are emitted).
       if (Diags.hasErrorOccurred())
         return;
-      
+
       if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
         Builder->EmitFunction(FD);
       } else if (isa<ObjCClassDecl>(D)){
@@ -86,8 +86,7 @@ namespace {
       } else if (ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D)){
         Builder->EmitObjCMethod(OMD);
       } else if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
-        if (VD->isFileVarDecl())
-          Builder->EmitGlobalVarDeclarator(VD);
+        Builder->EmitGlobalVar(VD);
       } else if (isa<ObjCClassDecl>(D) || isa<ObjCCategoryDecl>(D)) {
         // Forward declaration.  Only used for type checking.
       } else if (ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D)){
@@ -110,6 +109,12 @@ namespace {
         assert(isa<TypeDecl>(D) && "Unknown top level decl");
         // TODO: handle debug info?
       }
+
+      if (ScopedDecl *SD = dyn_cast<ScopedDecl>(D)) {
+        SD = SD->getNextDeclarator();
+        if (SD)
+          HandleTopLevelDecl(SD);
+      }
     }
     
     /// HandleTagDeclDefinition - This callback is invoked each time a TagDecl
diff --git a/test/CodeGen/2008-07-21-mixed-var-fn-decl.c b/test/CodeGen/2008-07-21-mixed-var-fn-decl.c
new file mode 100644 (file)
index 0000000..a7d0976
--- /dev/null
@@ -0,0 +1,5 @@
+// RUN: clang -emit-llvm -o - %s | grep -e "@g[0-9] " | count 2
+
+int g0, f0();
+int f1(), g1;
+