145
|
1 // PR c++/91353 - P1331R2: Allow trivial default init in constexpr contexts.
|
|
2 // { dg-do compile { target c++2a } }
|
|
3 // Test basic use.
|
|
4
|
|
5 struct S {
|
|
6 int i;
|
|
7 constexpr S(bool b) {
|
|
8 if (b)
|
|
9 i = 42;
|
|
10 }
|
|
11 };
|
|
12 constexpr S s1(true);
|
|
13 constexpr S s2(false); // { dg-error "not a constant expression" }
|
|
14
|
|
15 constexpr int
|
|
16 fn1 (int x)
|
|
17 {
|
|
18 int a;
|
|
19 a = 5;
|
|
20 return x + a;
|
|
21 }
|
|
22
|
|
23 static_assert (fn1 (2) == 7);
|
|
24
|
|
25 constexpr int
|
|
26 fn2 (int x)
|
|
27 {
|
|
28 const int a; // { dg-error "uninitialized .const a." }
|
|
29 constexpr int b; // { dg-error "uninitialized .const b." }
|
|
30 return x;
|
|
31 }
|
|
32
|
|
33 constexpr int
|
|
34 fn3 (int x)
|
|
35 {
|
|
36 int a; // { dg-message ".int a. is not const" }
|
|
37 return x + a; // { dg-error "the value of .a. is not usable in a constant expression" }
|
|
38 }
|
|
39
|
|
40 constexpr int a = fn3 (5); // { dg-message "in .constexpr. expansion of" }
|
|
41
|
|
42 constexpr int
|
|
43 fn4 ()
|
|
44 {
|
|
45 struct S { int a = -5; int b; } s;
|
|
46 return s.a;
|
|
47 }
|
|
48
|
|
49 static_assert (fn4 () == -5);
|
|
50
|
|
51 constexpr int
|
|
52 fn5 ()
|
|
53 {
|
|
54 struct S { int a = 9; int b; } s;
|
|
55 return s.b;
|
|
56 }
|
|
57
|
|
58 constexpr int b = fn5 (); // { dg-error "accessing uninitialized member" }
|
|
59 // { dg-message "in .constexpr. expansion of" "" { target *-*-* } .-1 }
|
|
60
|
|
61 constexpr int
|
|
62 fn6 ()
|
|
63 {
|
|
64 int a;
|
|
65 return 42;
|
|
66 }
|
|
67
|
|
68 static_assert (fn6 () == 42);
|
|
69
|
|
70 constexpr int
|
|
71 fn7 (bool b)
|
|
72 {
|
|
73 int a; // { dg-message ".int a. is not const" }
|
|
74 if (b)
|
|
75 a = 42;
|
|
76 return a;
|
|
77 }
|
|
78
|
|
79 static_assert (fn7 (true) == 42);
|
|
80 static_assert (fn7 (false) == 42); // { dg-error "non-constant condition|the value of .a. is not usable" }
|
|
81 // { dg-message "in .constexpr. expansion of" "" { target *-*-* } .-1 }
|
|
82
|
|
83 constexpr int
|
|
84 fn8 (int n)
|
|
85 {
|
|
86 int r;
|
|
87 switch (n)
|
|
88 {
|
|
89 case 1:
|
|
90 r = n;
|
|
91 return r;
|
|
92 case 42:
|
|
93 r = n;
|
|
94 return r;
|
|
95 }
|
|
96 }
|
|
97
|
|
98 static_assert (fn8 (1) == 1);
|
|
99 static_assert (fn8 (42) == 42);
|