1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 
3 void foo();
4 void foo() __attribute__((unused));
5 void foo() __attribute__((unused));
foo()6 void foo(){} // expected-note {{previous definition is here}}
7 void foo() __attribute__((constructor)); // expected-warning {{must precede definition}}
8 void foo();
9 
10 int bar;
11 extern int bar;
12 int bar;
13 int bar __attribute__((weak));
14 int bar __attribute__((used));
15 extern int bar __attribute__((weak));
16 int bar = 0; // expected-note {{previous definition is here}}
17 int bar __attribute__((weak)); // no warning as it matches the existing
18                                // attribute.
19 int bar __attribute__((used,
20                        visibility("hidden"))); // expected-warning {{must precede definition}}
21 int bar;
22 
23 struct zed {  // expected-note {{previous definition is here}}
24 };
25 struct __attribute__((visibility("hidden"))) zed; // expected-warning {{must precede definition}}
26 
27 struct __attribute__((visibility("hidden"))) zed2 {
28 };
29 struct __attribute__((visibility("hidden"))) zed2;
30 
31 struct __attribute__((visibility("hidden"))) zed3 {  // expected-note {{previous definition is here}}
32 };
33 struct __attribute__((visibility("hidden"),
34                      packed  // expected-warning {{must precede definition}}
35                      )) zed3;
36 
37 struct __attribute__((visibility("hidden"))) zed4 {  // expected-note {{previous attribute is here}}
38 };
39 struct __attribute__((visibility("default"))) zed4; // expected-error {{visibility does not match previous declaration}}
40