summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/Decl.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-06-21 16:08:37 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-06-21 16:08:37 +0000
commitcc99b3ca9e9a4fba24db1931d07f00dd5045fb4a (patch)
tree0da063675568388da954e287bc6321de2ec461d1 /clang/lib/AST/Decl.cpp
parentbbc29ea82197eccd2dc17af1bc3174a3f0bcb223 (diff)
downloadbcm5719-llvm-cc99b3ca9e9a4fba24db1931d07f00dd5045fb4a.tar.gz
bcm5719-llvm-cc99b3ca9e9a4fba24db1931d07f00dd5045fb4a.zip
Fixes a corner case bug whereby declaring and defining an extern variable in a
particular sequence causes its definition to not be generated in the object file. (fixes radar 8071804). llvm-svn: 106424
Diffstat (limited to 'clang/lib/AST/Decl.cpp')
-rw-r--r--clang/lib/AST/Decl.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 25687e15c4c..c912af878a8 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -701,7 +701,15 @@ VarDecl::DefinitionKind VarDecl::isThisDeclarationADefinition() const {
// AST for 'extern "C" int foo;' is annotated with 'extern'.
if (hasExternalStorage())
return DeclarationOnly;
-
+
+ if (getStorageClassAsWritten() == Extern ||
+ getStorageClassAsWritten() == PrivateExtern) {
+ for (const VarDecl *PrevVar = getPreviousDeclaration();
+ PrevVar; PrevVar = PrevVar->getPreviousDeclaration()) {
+ if (PrevVar->getLinkage() == InternalLinkage && PrevVar->hasInit())
+ return DeclarationOnly;
+ }
+ }
// C99 6.9.2p2:
// A declaration of an object that has file scope without an initializer,
// and without a storage class specifier or the scs 'static', constitutes
OpenPOWER on IntegriCloud