summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/Decl.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2012-12-18 04:18:55 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2012-12-18 04:18:55 +0000
commit74a133fa9a11d6ac366c7825681b2d4c5ad31f35 (patch)
treee1a3bc649ead73c0f1f87b4a9c9f3c5e1bd18bc1 /clang/lib/AST/Decl.cpp
parent8522ba845f8a824e2142e21ee71b2900c42f929e (diff)
downloadbcm5719-llvm-74a133fa9a11d6ac366c7825681b2d4c5ad31f35.tar.gz
bcm5719-llvm-74a133fa9a11d6ac366c7825681b2d4c5ad31f35.zip
Merge storage classes even when contexts don't match.
This fixes the storage class of extern decls that are merged with file level statics. The patch also fixes the linkage computation so that they are considered internal. llvm-svn: 170406
Diffstat (limited to 'clang/lib/AST/Decl.cpp')
-rw-r--r--clang/lib/AST/Decl.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 4e4bc0ec809..a2c6da67f04 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -786,12 +786,16 @@ static LinkageInfo getLVForDecl(const NamedDecl *D, bool OnlyTemplate) {
}
if (const VarDecl *Var = dyn_cast<VarDecl>(D))
- if (Var->getStorageClass() == SC_Extern ||
- Var->getStorageClass() == SC_PrivateExtern) {
+ if (Var->getStorageClassAsWritten() == SC_Extern ||
+ Var->getStorageClassAsWritten() == SC_PrivateExtern) {
if (Var->isInAnonymousNamespace() &&
!Var->getDeclContext()->isExternCContext())
return LinkageInfo::uniqueExternal();
+ // This is an "extern int foo;" which got merged with a file static.
+ if (Var->getStorageClass() == SC_Static)
+ return LinkageInfo::internal();
+
LinkageInfo LV;
if (Var->getStorageClass() == SC_PrivateExtern)
LV.mergeVisibility(HiddenVisibility, true);
OpenPOWER on IntegriCloud