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