annotate gcc/testsuite/g++.dg/cpp2a/constexpr-init1.C @ 145:1830386684a0

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