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<
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()),
// 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;
__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}}