1// RUN: %clang_cc1 %s -fsyntax-only -verify -Wduplicate-enum
2// RUN: %clang_cc1 %s -x c++ -fsyntax-only -verify -Wduplicate-enum
3enum A {
4  A1 = 0,  // expected-note {{element A1 also has value 0}}
5  A2 = -1,
6  A3,  // expected-warning {{element A3 has been implicitly assigned 0 which another element has been assigned}}
7  A4};
8
9enum B {
10  B1 = -1,  // expected-note {{element B1 also has value -1}}
11  B2,       // expected-warning {{element B2 has been implicitly assigned 0 which another element has been assigned}}
12  B3,
13  B4 = -2,
14  B5,  // expected-warning {{element B5 has been implicitly assigned -1 which another element has been assigned}}
15  B6   // expected-note {{element B6 also has value 0}}
16};
17
18enum C { C1, C2 = -1, C3 }; // expected-warning{{element C1 has been implicitly assigned 0 which another element has been assigned}} \
19  // expected-note {{element C3 also has value 0}}
20
21enum D {
22  D1,
23  D2,
24  D3,  // expected-warning{{element D3 has been implicitly assigned 2 which another element has been assigned}}
25  D4 = D2,  // no warning
26  D5 = 2  // expected-note {{element D5 also has value 2}}
27};
28
29enum E {
30  E1,
31  E2 = E1,
32  E3 = E2
33};
34
35enum F {
36  F1,
37  F2,
38  FCount,
39  FMax = FCount - 1
40};
41
42enum G {
43  G1,
44  G2,
45  GMax = G2,
46  GCount = GMax + 1
47};
48
49enum {
50  H1 = 0,
51  H2 = -1,
52  H3,
53  H4};
54
55enum {
56  I1 = -1,
57  I2,
58  I3,
59  I4 = -2,
60  I5,
61  I6
62};
63
64enum { J1, J2 = -1, J3 };
65
66enum {
67  K1,
68  K2,
69  K3,
70  K4 = K2,
71  K5 = 2
72};
73
74enum {
75  L1,
76  L2 = L1,
77  L3 = L2
78};
79
80enum {
81  M1,
82  M2,
83  MCount,
84  MMax = MCount - 1
85};
86
87enum {
88  N1,
89  N2,
90  NMax = N2,
91  NCount = NMax + 1
92};
93
94// PR15693
95enum enum1 {
96  VALUE // expected-note{{previous definition is here}}
97};
98
99enum enum2 {
100  VALUE // expected-error{{redefinition of enumerator 'VALUE'}}
101};
102