1*67e74705SXin Li // RUN: %clang_cc1 -triple %itanium_abi_triple -verify -fsyntax-only -Wsign-conversion %s 2*67e74705SXin Li 3*67e74705SXin Li // NOTE: When a 'enumeral mismatch' warning is implemented then expect several 4*67e74705SXin Li // of the following cases to be impacted. 5*67e74705SXin Li 6*67e74705SXin Li // namespace for anonymous enums tests 7*67e74705SXin Li namespace test1 { 8*67e74705SXin Li enum { A }; 9*67e74705SXin Li enum { B = -1 }; 10*67e74705SXin Li 11*67e74705SXin Li template <typename T> struct Foo { 12*67e74705SXin Li enum { C }; 13*67e74705SXin Li enum { D = ~0U }; 14*67e74705SXin Li }; 15*67e74705SXin Li 16*67e74705SXin Li enum { E = ~0U }; 17*67e74705SXin Li doit_anonymous(int i)18*67e74705SXin Li void doit_anonymous( int i ) { 19*67e74705SXin Li int a1 = 1 ? i : A; 20*67e74705SXin Li int a2 = 1 ? A : i; 21*67e74705SXin Li 22*67e74705SXin Li int b1 = 1 ? i : B; 23*67e74705SXin Li int b2 = 1 ? B : i; 24*67e74705SXin Li 25*67e74705SXin Li int c1 = 1 ? i : Foo<bool>::C; 26*67e74705SXin Li int c2 = 1 ? Foo<bool>::C : i; 27*67e74705SXin Li 28*67e74705SXin Li int d1a = 1 ? i : Foo<bool>::D; // expected-warning {{test1::Foo<bool>::(anonymous enum at }} 29*67e74705SXin Li int d1b = 1 ? i : Foo<bool>::D; // expected-warning {{warn-sign-conversion.cpp:13:5)' to 'int'}} 30*67e74705SXin Li int d2a = 1 ? Foo<bool>::D : i; // expected-warning {{operand of ? changes signedness: 'test1::Foo<bool>::(anonymous enum at }} 31*67e74705SXin Li int d2b = 1 ? Foo<bool>::D : i; // expected-warning {{warn-sign-conversion.cpp:13:5)' to 'int'}} 32*67e74705SXin Li int d3a = 1 ? B : Foo<bool>::D; // expected-warning {{operand of ? changes signedness: 'test1::Foo<bool>::(anonymous enum at }} 33*67e74705SXin Li int d3b = 1 ? B : Foo<bool>::D; // expected-warning {{warn-sign-conversion.cpp:13:5)' to 'int'}} 34*67e74705SXin Li int d4a = 1 ? Foo<bool>::D : B; // expected-warning {{operand of ? changes signedness: 'test1::Foo<bool>::(anonymous enum at }} 35*67e74705SXin Li int d4b = 1 ? Foo<bool>::D : B; // expected-warning {{warn-sign-conversion.cpp:13:5)' to 'int'}} 36*67e74705SXin Li 37*67e74705SXin Li int e1a = 1 ? i : E; // expected-warning {{operand of ? changes signedness: 'test1::(anonymous enum at }} 38*67e74705SXin Li int e1b = 1 ? i : E; // expected-warning {{warn-sign-conversion.cpp:16:3)' to 'int'}} 39*67e74705SXin Li int e2a = 1 ? E : i; // expected-warning {{operand of ? changes signedness: 'test1::(anonymous enum at }} 40*67e74705SXin Li int e2b = 1 ? E : i; // expected-warning {{warn-sign-conversion.cpp:16:3)' to 'int'}} 41*67e74705SXin Li int e3a = 1 ? E : B; // expected-warning {{operand of ? changes signedness: 'test1::(anonymous enum at }} 42*67e74705SXin Li int e3b = 1 ? E : B; // expected-warning {{warn-sign-conversion.cpp:16:3)' to 'int'}} 43*67e74705SXin Li int e4a = 1 ? B : E; // expected-warning {{operand of ? changes signedness: 'test1::(anonymous enum at }} 44*67e74705SXin Li int e4b = 1 ? B : E; // expected-warning {{warn-sign-conversion.cpp:16:3)' to 'int'}} 45*67e74705SXin Li } 46*67e74705SXin Li } 47*67e74705SXin Li 48*67e74705SXin Li // namespace for named enums tests 49*67e74705SXin Li namespace test2 { 50*67e74705SXin Li enum Named1 { A }; 51*67e74705SXin Li enum Named2 { B = -1 }; 52*67e74705SXin Li 53*67e74705SXin Li template <typename T> struct Foo { 54*67e74705SXin Li enum Named3 { C }; 55*67e74705SXin Li enum Named4 { D = ~0U }; 56*67e74705SXin Li }; 57*67e74705SXin Li 58*67e74705SXin Li enum Named5 { E = ~0U }; 59*67e74705SXin Li doit_anonymous(int i)60*67e74705SXin Li void doit_anonymous( int i ) { 61*67e74705SXin Li int a1 = 1 ? i : A; 62*67e74705SXin Li int a2 = 1 ? A : i; 63*67e74705SXin Li 64*67e74705SXin Li int b1 = 1 ? i : B; 65*67e74705SXin Li int b2 = 1 ? B : i; 66*67e74705SXin Li 67*67e74705SXin Li int c1 = 1 ? i : Foo<bool>::C; 68*67e74705SXin Li int c2 = 1 ? Foo<bool>::C : i; 69*67e74705SXin Li 70*67e74705SXin Li int d1 = 1 ? i : Foo<bool>::D; // expected-warning {{operand of ? changes signedness: 'test2::Foo<bool>::Named4' to 'int'}} 71*67e74705SXin Li int d2 = 1 ? Foo<bool>::D : i; // expected-warning {{operand of ? changes signedness: 'test2::Foo<bool>::Named4' to 'int'}} 72*67e74705SXin Li int d3 = 1 ? B : Foo<bool>::D; // expected-warning {{operand of ? changes signedness: 'test2::Foo<bool>::Named4' to 'int'}} 73*67e74705SXin Li int d4 = 1 ? Foo<bool>::D : B; // expected-warning {{operand of ? changes signedness: 'test2::Foo<bool>::Named4' to 'int'}} 74*67e74705SXin Li 75*67e74705SXin Li int e1 = 1 ? i : E; // expected-warning {{operand of ? changes signedness: 'test2::Named5' to 'int'}} 76*67e74705SXin Li int e2 = 1 ? E : i; // expected-warning {{operand of ? changes signedness: 'test2::Named5' to 'int'}} 77*67e74705SXin Li int e3 = 1 ? E : B; // expected-warning {{operand of ? changes signedness: 'test2::Named5' to 'int'}} 78*67e74705SXin Li int e4 = 1 ? B : E; // expected-warning {{operand of ? changes signedness: 'test2::Named5' to 'int'}} 79*67e74705SXin Li } 80*67e74705SXin Li } 81