comparison gcc/testsuite/g++.dg/init/array56.C @ 152:2b5abeee2509

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents
children
comparison
equal deleted inserted replaced
145:1830386684a0 152:2b5abeee2509
1 /* PR c++/90938 - Initializing array with {1} works, but not {0}
2 { dg-do compile { target c++11 } }
3 { dg-options "-O -Wall -fdump-tree-optimized" } */
4
5 #define assert(e) \
6 ((e) ? (void)0 \
7 : (__builtin_printf ("assertion failed on line %i: %s\n", \
8 __LINE__, #e), \
9 __builtin_abort ()))
10
11 namespace A {
12
13 struct X
14 {
15 X () = default;
16 X (int n) : n (n + 1) { }
17 int n;
18 };
19
20 static_assert (__is_trivial (X), "X is trivial");
21
22 static void test ()
23 {
24 {
25 X x[] { 0 };
26 assert (1 == x->n);
27 }
28
29 {
30 X x[1] { 0 };
31 assert (1 == x->n); // fails
32 }
33
34 {
35 X x[2] { 0 };
36 assert (1 == x[0].n && 0 == x[1].n); // fails
37 }
38
39 {
40 X x[] { 1, 0 };
41 assert (2 == x[0].n && 1 == x[1].n); // passes
42 }
43
44 {
45 X x[2] { 1, 0 };
46 assert (2 == x[0].n && 1 == x[1].n); // fails
47 }
48 }
49
50 }
51
52 namespace B {
53
54 struct X
55 {
56 X () = default;
57 X (int *p) : p (p ? p : new int (1)) { }
58 int *p;
59 };
60
61 static_assert (__is_trivial (X), "X is trivial");
62
63 static void test ()
64 {
65 X x[1] { nullptr };
66 assert (*x->p == 1); // fails
67
68 X y[1] { 0 };
69 assert (*y->p == 1); // fails
70 }
71
72 }
73
74 namespace C {
75
76 static const char *vector_swizzle (int vecsize, int index)
77 {
78 static const char *swizzle[4][4] =
79 {
80 { ".x", ".y", ".z", ".w" },
81 { ".xy", ".yz", ".zw", nullptr },
82 { ".xyz", ".yzw", nullptr, nullptr },
83 { "", nullptr, nullptr, nullptr },
84 };
85
86 assert (vecsize >= 1 && vecsize <= 4);
87 assert (index >= 0 && index < 4);
88 assert (swizzle[vecsize - 1][index]);
89
90 return swizzle[vecsize - 1][index];
91 }
92
93 static void test ()
94 {
95 assert (!*vector_swizzle(4, 0));
96 }
97
98 }
99
100 int main ()
101 {
102 A::test ();
103 B::test ();
104 C::test ();
105 }
106
107 // { dg-final { scan-tree-dump-not "abort" "optimized" } }