]> granicus.if.org Git - clang/commitdiff
Ignore visibility attributes after definitions. This matches newer (4.7) gcc's
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 12 Jul 2012 04:32:30 +0000 (04:32 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 12 Jul 2012 04:32:30 +0000 (04:32 +0000)
behavior and is the first step in fixing pr13338.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDeclCXX.cpp
test/CodeGenCXX/pragma-visibility.cpp
test/SemaCXX/attr-visibility.cpp

index ebbdb8b263a0bde2367c30ed86208f590d9b475b..769285a0b8d9fd80d9f65b40386daf82a10739b9 100644 (file)
@@ -1637,6 +1637,9 @@ def err_attribute_aligned_greater_than_8192 : Error<
 def warn_redeclaration_without_attribute_prev_attribute_ignored : Warning<
   "'%0' redeclared without %1 attribute: previous %1 ignored">;
 def warn_attribute_ignored : Warning<"%0 attribute ignored">;
+def warn_attribute_after_definition_ignored : Warning<
+  "attribute %0 after definition is ignored">,
+   InGroup<IgnoredAttributes>;
 def warn_unknown_attribute_ignored : Warning<
   "unknown attribute %0 ignored">, InGroup<UnknownAttributes>;
 def warn_unhandled_ms_attribute_ignored : Warning<
index ebd9180ec64dae3433c370b1e1eedda8b9fa074d..ba1b4f77fcace2f2db05473c6d712868922b297a 100644 (file)
@@ -4700,6 +4700,14 @@ void Sema::ActOnFinishCXXMemberSpecification(Scope* S, SourceLocation RLoc,
 
   AdjustDeclIfTemplate(TagDecl);
 
+  for (const AttributeList* l = AttrList; l; l = l->getNext()) {
+    if (l->getKind() != AttributeList::AT_Visibility)
+      continue;
+    l->setInvalid();
+    Diag(l->getLoc(), diag::warn_attribute_after_definition_ignored) <<
+      l->getName();
+  }
+
   ActOnFields(S, RLoc, TagDecl, llvm::makeArrayRef(
               // strict aliasing violation!
               reinterpret_cast<Decl**>(FieldCollector->getCurFields()),
index e54626ee2e11a9c2dd813c535e343109fda1b75e..9b54a1813ce7cf81de3e0e4bb22d44794fa87175 100644 (file)
@@ -16,14 +16,6 @@ int x2::y = 10;
 // CHECK: @_ZN2x21yE = global
 #pragma GCC visibility pop
 
-#pragma GCC visibility push(hidden)
-struct x3 {
-  static int y;
-} __attribute((visibility("default")));
-int x3::y = 10;
-// CHECK: @_ZN2x31yE = global
-#pragma GCC visibility pop
-
 #pragma GCC visibility push(hidden)
 template<class T> struct x4 {
   static int y;
index 26dc67c6de2706acb97467cec55891aee77592ba..05aa5a33c72e83ec271d890a463f40743050a481 100644 (file)
@@ -14,3 +14,7 @@ template <>
  __attribute__((visibility("default"))) // expected-error {{visibility does not match previous declaration}}
 void foo<int>() {
 }
+
+struct x3 {
+  static int y;
+} __attribute((visibility("default"))); // expected-warning {{attribute 'visibility' after definition is ignored}}