summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-01-13 10:14:57 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-01-13 10:14:57 +0000
commit29b6ec9d09d855b08d98e2a5ddb814104644c4a5 (patch)
tree44e8bdb752f512f0490198d147264328fc9f1eb1
parent940569b4717ba5e6f9faca6682ae30e68e253660 (diff)
Revert "Sema: An extern declaration can't be a redeclaration of a parameter"
This reverts commit r225780, we can't compile line 181 in sanitizer_platform_limits_posix.cc with this commit. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225781 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaDecl.cpp6
-rw-r--r--test/Sema/private-extern.c4
2 files changed, 4 insertions, 6 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 82ffd4da5f..baa6822da7 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -3282,12 +3282,14 @@ void Sema::MergeVarDecl(VarDecl *New, LookupResult &Previous) {
}
// Check if extern is followed by non-extern and vice-versa.
- if (New->hasGlobalStorage() && !Old->hasLinkage() && Old->hasLocalStorage()) {
+ if (New->hasExternalStorage() &&
+ !Old->hasLinkage() && Old->isLocalVarDecl()) {
Diag(New->getLocation(), diag::err_extern_non_extern) << New->getDeclName();
Diag(OldLocation, PrevDiag);
return New->setInvalidDecl();
}
- if (Old->hasGlobalStorage() && !New->hasLinkage() && New->hasLocalStorage()) {
+ if (Old->hasLinkage() && New->isLocalVarDecl() &&
+ !New->hasExternalStorage()) {
Diag(New->getLocation(), diag::err_non_extern_extern) << New->getDeclName();
Diag(OldLocation, PrevDiag);
return New->setInvalidDecl();
diff --git a/test/Sema/private-extern.c b/test/Sema/private-extern.c
index 94afd87fbb..0c13c92bba 100644
--- a/test/Sema/private-extern.c
+++ b/test/Sema/private-extern.c
@@ -83,7 +83,3 @@ __private_extern__ int g19;
int g19 = 0;
__private_extern__ int g20 = 0;
-
-void f10(int g20) { // expected-note{{previous definition is here}}
- extern int g20; // expected-error{{extern declaration of 'g20' follows non-extern declaration}}
-}