111
|
1 // PR c++/55250
|
|
2 // { dg-do compile { target c++14 } }
|
|
3
|
|
4 #define SA(X) static_assert((X),#X)
|
|
5
|
|
6 constexpr int Test1(int x) { enum E { y = 1 }; return x + y; }
|
|
7
|
|
8 constexpr int Test2(int x) { struct T { constexpr operator int() { return 1; } }; return x + T(); }
|
|
9
|
|
10 constexpr int Test3(int x) { typedef enum E { y = 1 } EE; return x + EE::y; }
|
|
11
|
|
12 constexpr int Test4(int x) { typedef struct T { constexpr operator int() { return 1; } } TT; return x + TT(); }
|
|
13
|
|
14 constexpr int Test5(int x) { using EE = enum E { y = 1 }; return x + EE::y; }
|
|
15
|
|
16 constexpr int Test6(int x) { using TT = struct T { constexpr operator int() { return 1; } }; return x + TT(); }
|
|
17
|
|
18 SA(Test1(2) == 3);
|
|
19 SA(Test2(2) == 3);
|
|
20 SA(Test3(2) == 3);
|
|
21 SA(Test4(2) == 3);
|
|
22 SA(Test5(2) == 3);
|
|
23 SA(Test6(2) == 3);
|
|
24
|
|
25 struct S1
|
|
26 {
|
|
27 constexpr S1() { enum E { y = 1 }; SA(y == 1); }
|
|
28 };
|
|
29
|
|
30 struct S2
|
|
31 {
|
|
32 constexpr S2() { struct T { constexpr operator int() { return 1; } }; SA(T() == 1); }
|
|
33 };
|
|
34
|
|
35 struct S3
|
|
36 {
|
|
37 constexpr S3() { typedef enum E { y = 1} EE; SA(EE::y == 1); }
|
|
38 };
|
|
39
|
|
40 struct S4
|
|
41 {
|
|
42 constexpr S4() { typedef struct T { constexpr operator int() { return 1; } } TT; SA(TT() == 1); }
|
|
43 };
|
|
44
|
|
45 struct S5
|
|
46 {
|
|
47 constexpr S5() { using EE = enum E { y = 1}; SA(EE::y == 1); }
|
|
48 };
|
|
49
|
|
50 struct S6
|
|
51 {
|
|
52 constexpr S6() { using TT = struct T { constexpr operator int() { return 1; } }; SA(TT() == 1); }
|
|
53 };
|
|
54
|
|
55 S1 s1;
|
|
56 S2 s2;
|
|
57 S3 s3;
|
|
58 S4 s4;
|
|
59 S5 s5;
|
|
60 S6 s6;
|