| // RUN: %clang_cc1 -fsyntax-only -verify -Wc++-hidden-decl %s |
| // RUN: %clang_cc1 -fsyntax-only -verify -Wc++-compat %s |
| // RUN: %clang_cc1 -fsyntax-only -verify=good %s |
| // RUN: %clang_cc1 -fsyntax-only -verify=cxx -x c++ -std=c++2c %s |
| // good-no-diagnostics |
| |
| struct A { |
| struct B { // #b-decl |
| int x; |
| } bs; |
| enum E { // #e-decl |
| One |
| } es; |
| int y; |
| }; |
| |
| struct C { |
| struct D { |
| struct F { // #f-decl |
| int x; |
| } f; |
| } d; |
| }; |
| |
| struct B b; // expected-warning {{struct defined within a struct or union is not visible in C++}} \ |
| expected-note@#b-decl {{declared here}} \ |
| cxx-error {{variable has incomplete type 'struct B'}} \ |
| cxx-note 3 {{forward declaration of 'B'}} |
| enum E e; // expected-warning {{enum defined within a struct or union is not visible in C++}} \ |
| expected-note@#e-decl {{declared here}} \ |
| cxx-error {{ISO C++ forbids forward references to 'enum' types}} \ |
| cxx-error {{variable has incomplete type 'enum E'}} \ |
| cxx-note 3 {{forward declaration of 'E'}} |
| struct F f; // expected-warning {{struct defined within a struct or union is not visible in C++}} \ |
| expected-note@#f-decl {{declared here}} \ |
| cxx-error {{variable has incomplete type 'struct F'}} \ |
| cxx-note {{forward declaration of 'F'}} |
| |
| void func(struct B b); // expected-warning {{struct defined within a struct or union is not visible in C++}} \ |
| expected-note@#b-decl {{declared here}} |
| void other_func(enum E e) { // expected-warning {{enum defined within a struct or union is not visible in C++}} \ |
| expected-note@#e-decl {{declared here}} \ |
| cxx-error {{variable has incomplete type 'enum E'}} |
| struct B b; // expected-warning {{struct defined within a struct or union is not visible in C++}} \ |
| expected-note@#b-decl {{declared here}} \ |
| cxx-error {{variable has incomplete type 'struct B'}} |
| } |
| |
| struct X { |
| struct B b; // expected-warning {{struct defined within a struct or union is not visible in C++}} \ |
| expected-note@#b-decl {{declared here}} \ |
| cxx-error {{field has incomplete type 'struct B'}} |
| enum E e; // expected-warning {{enum defined within a struct or union is not visible in C++}} \ |
| expected-note@#e-decl {{declared here}} \ |
| cxx-error {{field has incomplete type 'enum E'}} |
| }; |
| |
| struct Y { |
| struct Z1 { |
| int x; |
| } zs; |
| |
| struct Z2 { |
| // This is fine, it is still valid C++. |
| struct Z1 inner_zs; |
| } more_zs; |
| }; |
| |