1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s 23218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor 33218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor// Test the use of elaborated-type-specifiers to inject the names of 43218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor// structs (or classes or unions) into an outer scope as described in 53218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor// C++ [basic.scope.pdecl]p5. 63218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregortypedef struct S1 { 73218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor union { 83218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor struct S2 *x; 93218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor struct S3 *y; 103218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor }; 113218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor} S1; 123218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor 133218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregorbool test_elab(S1 *s1, struct S2 *s2, struct S3 *s3) { 143218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor if (s1->x == s2) return true; 153218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor if (s1->y == s3) return true; 163218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor return false; 173218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor} 183218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor 193218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregornamespace NS { 203218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor class X { 213218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor public: 228d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain void test_elab2(struct S4 *s4); // expected-note{{'NS::S4' declared here}} 233218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor }; 243218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor 25a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor void X::test_elab2(S4 *s4) { } // expected-note{{passing argument to parameter 's4' here}} 263218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor} 273218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor 283218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregorvoid test_X_elab(NS::X x) { 293218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor struct S4 *s4 = 0; 307c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall x.test_elab2(s4); // expected-error{{cannot initialize a parameter of type 'NS::S4 *' with an lvalue of type 'struct S4 *'}} 313218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor} 323218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor 333218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregornamespace NS { 343218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor S4 *get_S4(); 353218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor} 363218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor 373218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregorvoid test_S5_scope() { 388d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain S4 *s4; // expected-error{{unknown type name 'S4'; did you mean 'NS::S4'?}} 393218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor} 403218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor 413218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregorint test_funcparam_scope(struct S5 * s5) { 423218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor struct S5 { int y; } *s5_2 = 0; 430c6db9417dceeb082296c4e097be5de3ee1c5eb7Douglas Gregor if (s5 == s5_2) return 1; // expected-error {{comparison of distinct pointer types ('struct S5 *' and 'struct S5 *')}} 443218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor return 0; 453218c4bb3b5d7250f12420de6db7ef3e3f805a75Douglas Gregor} 466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace test5 { 486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct A { 496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines class __attribute__((visibility("hidden"))) B {}; 506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void test(class __attribute__((visibility("hidden"), noreturn)) B b) { // expected-warning {{'noreturn' attribute only applies to functions and methods}} 526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 55