aboutsummaryrefslogtreecommitdiff
path: root/clang/test/Sema/decl-hidden-in-c++.c
blob: c967d4b474024b88750308e95961922d1699a507 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// 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;
};