ProcessDeclAttributes(S, NewFD, D);
// attributes declared post-definition are currently ignored
- if (PrevDecl) {
+ if (Redeclaration && PrevDecl) {
const FunctionDecl *Def, *PrevFD = dyn_cast<FunctionDecl>(PrevDecl);
if (PrevFD && PrevFD->getBody(Def) && D.hasAttributes()) {
Diag(NewFD->getLocation(), diag::warn_attribute_precede_definition);
--- /dev/null
+// RUN: clang-cc -fsyntax-only -verify %s
+struct X { };
+struct Y { };
+
+bool f0(X) { return true; } // expected-note{{definition}}
+bool f1(X) { return true; }
+
+__attribute__ ((__visibility__("hidden"))) bool f0(X); // expected-warning{{attribute}}
+__attribute__ ((__visibility__("hidden"))) bool f1(Y);