]> granicus.if.org Git - clang/commitdiff
c: privide deprecated warning when __private_extern__ storage
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 17 Aug 2012 21:44:55 +0000 (21:44 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 17 Aug 2012 21:44:55 +0000 (21:44 +0000)
specifier is unsed in a declaration; as it may not make the symbol
local to linkage unit as intended. Suggest using "hidden" visibility
attribute instead. // rdar://7703982

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
test/Sema/asm.c
test/Sema/attr-used.c
test/Sema/private-extern.c
test/Sema/tentative-decls.c
test/Sema/thread-specifier.c

index c00c9a81509593caf75760b72d2a1a9f7f2fa87e..0623966279657c034eb0e6c9542e44edda7be8d8 100644 (file)
@@ -1490,10 +1490,10 @@ def note_non_literal_user_provided_dtor : Note<
 def note_non_literal_nontrivial_dtor : Note<
   "%0 is not literal because it has a non-trivial destructor">;
 def warn_private_extern : Warning<
-  "Use of __private_extern__ on tentative definition has unexpected"
-  " behaviour - use __attribute__((visibility(\"hidden\"))) on extern"
-  " declaration or definition instead">,
-  InGroup<PrivateExtern>, DefaultIgnore;
+  "use of __private_extern__ on a declaration may not produce external symbol "
+  "private to the linkage unit and is deprecated">, InGroup<PrivateExtern>;
+def note_private_extern : Note<
+  "use __attribute__((visibility(\"hidden\"))) attribute instead">;
 
 // C++11 char16_t/char32_t
 def warn_cxx98_compat_unicode_type : Warning<
index ea181de00a988f6f4a7898b7d2e1416b22cae51b..e1b146d9b440b894273143b5d03ef6b282cc47c9 100644 (file)
@@ -6758,8 +6758,10 @@ void Sema::ActOnUninitializedDecl(Decl *RealDecl,
                                  AbstractVariableType))
         Var->setInvalidDecl();
       if (!Type->isDependentType() && !Var->isInvalidDecl() &&
-          Var->getStorageClass() == SC_PrivateExtern)
+          Var->getStorageClass() == SC_PrivateExtern) {
         Diag(Var->getLocation(), diag::warn_private_extern);
+        Diag(Var->getLocation(), diag::note_private_extern);
+      }
         
       return;
 
index 44d83e92143b0fb95480d3e5821de910ab38bc41..155d736b9956c1e245c6b60b8ab6dd791d0577e8 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 %s -triple i386-pc-linux-gnu -verify -fsyntax-only
+// RUN: %clang_cc1 %s -Wno-private-extern -triple i386-pc-linux-gnu -verify -fsyntax-only
 
 void f() {
   int i;
index 08388169247e5ae9c0daf2ddec53252f83c3efd1..e2dfab141a99c51165b2d24b39fb9e982554be9b 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -verify -fsyntax-only %s
+// RUN: %clang_cc1 -verify -fsyntax-only -Wno-private-extern %s
 
 extern int l0 __attribute__((used)); // expected-warning {{used attribute ignored}}
 __private_extern__ int l1 __attribute__((used)); // expected-warning {{used attribute ignored}}
index 25591dc5b1f2f058ccc2abfc57feee7395f9b68d..e480f3f224811340bf8fd734cfe65ec1430aeb27 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -verify -fsyntax-only %s
+// RUN: %clang_cc1 -verify -fsyntax-only -Wno-private-extern %s
 
 static int g0; // expected-note{{previous definition}}
 int g0; // expected-error{{non-static declaration of 'g0' follows static declaration}}
index e14540ba841746a6ef85580fe72b78157435ec5a..bf2b1e4ee6a5bb211c39ccd77093dac7b003650d 100644 (file)
@@ -33,7 +33,8 @@ static int i3 = 5;
 extern int i3;
 
 // rdar://7703982
-__private_extern__ int pExtern; // expected-warning {{Use of __private_extern__ on tentative definition has unexpected behaviour}}
+__private_extern__ int pExtern; // expected-warning {{use of __private_extern__ on a declaration may not produce external symbol private to the linkage unit and is deprecated}} \
+// expected-note {{use __attribute__((visibility("hidden"))) attribute instead}}
 int pExtern = 0;
 
 int i4;
index 0d439b1669c17442694b6603ec588f099d0aaa4d..c06aad8acbdb7c3c257bda3ba2362d1c740a3804 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only -verify -pedantic %s
+// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only -Wno-private-extern -verify -pedantic %s
 
 __thread int t1;
 __thread extern int t2; // expected-warning {{'__thread' before 'extern'}}