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