|  | // RUN: %clang_cc1 %s -fsyntax-only -verify -Wduplicate-enum | 
|  | // RUN: %clang_cc1 %s -x c++ -fsyntax-only -verify -Wduplicate-enum | 
|  | enum A { | 
|  | A1 = 0,  // expected-note {{element 'A1' also has value 0}} | 
|  | A2 = -1, | 
|  | A3,  // expected-warning {{element 'A3' has been implicitly assigned 0 which another element has been assigned}} | 
|  | A4}; | 
|  |  | 
|  | enum B { | 
|  | B1 = -1,  // expected-note {{element 'B1' also has value -1}} | 
|  | B2,       // expected-warning {{element 'B2' has been implicitly assigned 0 which another element has been assigned}} | 
|  | B3, | 
|  | B4 = -2, | 
|  | B5,  // expected-warning {{element 'B5' has been implicitly assigned -1 which another element has been assigned}} | 
|  | B6   // expected-note {{element 'B6' also has value 0}} | 
|  | }; | 
|  |  | 
|  | enum C { C1, C2 = -1, C3 }; // expected-warning{{element 'C1' has been implicitly assigned 0 which another element has been assigned}} \ | 
|  | // expected-note {{element 'C3' also has value 0}} | 
|  |  | 
|  | enum D { | 
|  | D1, | 
|  | D2, | 
|  | D3,  // expected-warning{{element 'D3' has been implicitly assigned 2 which another element has been assigned}} | 
|  | D4 = D2,  // no warning | 
|  | D5 = 2  // expected-note {{element 'D5' also has value 2}} | 
|  | }; | 
|  |  | 
|  | enum E { | 
|  | E1, | 
|  | E2 = E1, | 
|  | E3 = E2 | 
|  | }; | 
|  |  | 
|  | enum F { | 
|  | F1, | 
|  | F2, | 
|  | FCount, | 
|  | FMax = FCount - 1 | 
|  | }; | 
|  |  | 
|  | enum G { | 
|  | G1, | 
|  | G2, | 
|  | GMax = G2, | 
|  | GCount = GMax + 1 | 
|  | }; | 
|  |  | 
|  | enum { | 
|  | H1 = 0, | 
|  | H2 = -1, | 
|  | H3, | 
|  | H4}; | 
|  |  | 
|  | enum { | 
|  | I1 = -1, | 
|  | I2, | 
|  | I3, | 
|  | I4 = -2, | 
|  | I5, | 
|  | I6 | 
|  | }; | 
|  |  | 
|  | enum { J1, J2 = -1, J3 }; | 
|  |  | 
|  | enum { | 
|  | K1, | 
|  | K2, | 
|  | K3, | 
|  | K4 = K2, | 
|  | K5 = 2 | 
|  | }; | 
|  |  | 
|  | enum { | 
|  | L1, | 
|  | L2 = L1, | 
|  | L3 = L2 | 
|  | }; | 
|  |  | 
|  | enum { | 
|  | M1, | 
|  | M2, | 
|  | MCount, | 
|  | MMax = MCount - 1 | 
|  | }; | 
|  |  | 
|  | enum { | 
|  | N1, | 
|  | N2, | 
|  | NMax = N2, | 
|  | NCount = NMax + 1 | 
|  | }; | 
|  |  | 
|  | // PR15693 | 
|  | enum enum1 { | 
|  | VALUE // expected-note{{previous definition is here}} | 
|  | }; | 
|  |  | 
|  | enum enum2 { | 
|  | VALUE // expected-error{{redefinition of enumerator 'VALUE'}} | 
|  | }; |