llvm-project/clang/test/Sema/decl-hidden-in-c++.c
Aaron Ballman 2f976956e5
[C] Diagnose declarations hidden in C++ (#137368)
This introduces a new diagnostic, -Wc++-hidden-decl, which is grouped
under -Wc++-compat, that diagnoses declarations which are valid in C but
invalid in C++ due to the type being at the wrong scope. e.g.,
```
  struct S {
    struct T {
      int x;
    } t;
  };

  struct T t; // Valid C, invalid C++
```
This is implementing the other half of #21898
2025-04-29 07:58:00 -04:00

69 lines
2.7 KiB
C

// 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;
};