1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | |
3 | // Test the use of elaborated-type-specifiers to inject the names of |
4 | // structs (or classes or unions) into an outer scope as described in |
5 | // C++ [basic.scope.pdecl]p5. |
6 | typedef struct S1 { |
7 | union { |
8 | struct S2 *x; |
9 | struct S3 *y; |
10 | }; |
11 | } S1; |
12 | |
13 | bool test_elab(S1 *s1, struct S2 *s2, struct S3 *s3) { |
14 | if (s1->x == s2) return true; |
15 | if (s1->y == s3) return true; |
16 | return false; |
17 | } |
18 | |
19 | namespace NS { |
20 | class X { |
21 | public: |
22 | void test_elab2(struct S4 *s4); // expected-note{{'NS::S4' declared here}} |
23 | }; |
24 | |
25 | void X::test_elab2(S4 *s4) { } // expected-note{{passing argument to parameter 's4' here}} |
26 | } |
27 | |
28 | void test_X_elab(NS::X x) { |
29 | struct S4 *s4 = 0; |
30 | x.test_elab2(s4); // expected-error{{cannot initialize a parameter of type 'NS::S4 *' with an lvalue of type 'struct S4 *'}} |
31 | } |
32 | |
33 | namespace NS { |
34 | S4 *get_S4(); |
35 | } |
36 | |
37 | void test_S5_scope() { |
38 | S4 *s4; // expected-error{{unknown type name 'S4'; did you mean 'NS::S4'?}} |
39 | } |
40 | |
41 | int test_funcparam_scope(struct S5 * s5) { |
42 | struct S5 { int y; } *s5_2 = 0; |
43 | if (s5 == s5_2) return 1; // expected-error {{comparison of distinct pointer types ('struct S5 *' and 'struct S5 *')}} |
44 | return 0; |
45 | } |
46 | |
47 | namespace test5 { |
48 | struct A { |
49 | class __attribute__((visibility("hidden"))) B {}; |
50 | |
51 | void test(class __attribute__((visibility("hidden"), noreturn)) B b) { // expected-warning {{'noreturn' attribute only applies to functions and methods}} |
52 | } |
53 | }; |
54 | } |
55 | |
56 | namespace test6 { |
57 | struct C { |
58 | template <typename> friend struct A; // expected-note {{'A' declared here}} |
59 | }; |
60 | struct B { |
61 | struct A *p; // expected-error {{implicit declaration introduced by elaborated type conflicts with a template of the same name}} |
62 | }; |
63 | } |
64 | |