| // RUN: %clang_cc1 -fsyntax-only -verify %s |
| |
| void foo(); |
| void foo() __attribute__((unused)); |
| void foo() __attribute__((unused)); |
| void foo(){} // expected-note {{previous definition is here}} |
| void foo() __attribute__((constructor)); // expected-warning {{must precede definition}} |
| void foo(); |
| |
| int bar; |
| extern int bar; |
| int bar; |
| int bar __attribute__((weak)); |
| int bar __attribute__((used)); |
| extern int bar __attribute__((weak)); |
| int bar = 0; // expected-note {{previous definition is here}} |
| int bar __attribute__((weak)); // no warning as it matches the existing |
| // attribute. |
| int bar __attribute__((used, |
| visibility("hidden"))); // expected-warning {{must precede definition}} |
| int bar; |
| |
| struct zed { // expected-note {{previous definition is here}} |
| }; |
| struct __attribute__((visibility("hidden"))) zed; // expected-warning {{must precede definition}} |
| |
| struct __attribute__((visibility("hidden"))) zed2 { |
| }; |
| struct __attribute__((visibility("hidden"))) zed2; |
| |
| struct __attribute__((visibility("hidden"))) zed3 { // expected-note {{previous definition is here}} |
| }; |
| struct __attribute__((visibility("hidden"), |
| packed // expected-warning {{must precede definition}} |
| )) zed3; |
| |
| struct __attribute__((visibility("hidden"))) zed4 { // expected-note {{previous attribute is here}} |
| }; |
| struct __attribute__((visibility("default"))) zed4; // expected-error {{visibility does not match previous declaration}} |