blob: ba2bc9b3d026daf735eab64ca524043340e63d2d [file] [log] [blame]
Richard Trieu52541612011-07-21 02:46:28 +00001// 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
7namespace 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 Trieu697d05d2011-07-21 03:20:52 +000031 int d2b = 1 ? Foo<bool>::D : i; // expected-warning {{warn-sign-conversion.cpp:13:5>' to 'int'}}
Richard Trieu52541612011-07-21 02:46:28 +000032 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
49namespace 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}