annotate gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr-1.C @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // Verify the correctness of folding relational expressions involving
kono
parents:
diff changeset
2 // pointers to array elements and struct data members and null pointers.
kono
parents:
diff changeset
3 // Although the C semantics of relational expressions are only defined
kono
parents:
diff changeset
4 // for pointers to objects, C++ makes them well-defined when
kono
parents:
diff changeset
5 // (nullptr < p) yields true. See the discussion of the patch for
kono
parents:
diff changeset
6 // c++/67376 on gcc-patches for additional background.
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 // { dg-do compile { target c++11 } }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 // { dg-options "-O1 -fdelete-null-pointer-checks -fdump-tree-optimized" }
111
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 // Runtime assert. Used for potentially invalid expressions.
kono
parents:
diff changeset
12 #define RA(e) ((e) ? (void)0 : __builtin_abort ())
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 // Static assert. Used for valid core constant expressions.
kono
parents:
diff changeset
15 #define SA(e) static_assert ((e), #e)
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 void test_first_array_element ()
kono
parents:
diff changeset
18 {
kono
parents:
diff changeset
19 static constexpr int a[] = { 0 };
kono
parents:
diff changeset
20 constexpr const int *null = 0;
kono
parents:
diff changeset
21 constexpr const int *pi = a;
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 // The following are valid constant expressions since in &*pi
kono
parents:
diff changeset
24 // the '&*' "cancel each other out."
kono
parents:
diff changeset
25 SA (!(null == &*pi));
kono
parents:
diff changeset
26 SA ( (null != &*pi));
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 // The validity of the relational expressions involving null
kono
parents:
diff changeset
29 // pointers in a constexpr context is questionable. Use a run
kono
parents:
diff changeset
30 // time assertion to verify these.
kono
parents:
diff changeset
31 RA ( (null < &*pi));
kono
parents:
diff changeset
32 RA ( (null <= &*pi));
kono
parents:
diff changeset
33 RA (!(null > &*pi));
kono
parents:
diff changeset
34 RA (!(null >= &*pi));
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 SA (!(&*pi == null));
kono
parents:
diff changeset
37 SA ( (&*pi != null));
kono
parents:
diff changeset
38 RA (!(&*pi < null));
kono
parents:
diff changeset
39 RA (!(&*pi <= null));
kono
parents:
diff changeset
40 RA ( (&*pi > null));
kono
parents:
diff changeset
41 RA ( (&*pi >= null));
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 // The following are valid constant expressions since &pi [0] is
kono
parents:
diff changeset
44 // equivalent to &*pi.
kono
parents:
diff changeset
45 SA (!(null == &pi [0]));
kono
parents:
diff changeset
46 SA ( (null != &pi [0]));
kono
parents:
diff changeset
47 RA ( (null < &pi [0]));
kono
parents:
diff changeset
48 RA ( (null <= &pi [0]));
kono
parents:
diff changeset
49 RA (!(null > &pi [0]));
kono
parents:
diff changeset
50 RA (!(null >= &pi [0]));
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 SA (!(&pi [0] == null));
kono
parents:
diff changeset
53 SA ( (&pi [0] != null));
kono
parents:
diff changeset
54 RA (!(&pi [0] < null));
kono
parents:
diff changeset
55 RA (!(&pi [0] <= null));
kono
parents:
diff changeset
56 RA ( (&pi [0] > null));
kono
parents:
diff changeset
57 RA ( (&pi [0] >= null));
kono
parents:
diff changeset
58 }
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 void test_first_null_array_element ()
kono
parents:
diff changeset
61 {
kono
parents:
diff changeset
62 constexpr const int *pi = 0;
kono
parents:
diff changeset
63 constexpr const int *qi = 0;
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 // The following are valid constant expressions since in &*qi
kono
parents:
diff changeset
66 // the '&*' "cancel each other out."
kono
parents:
diff changeset
67 SA ( (pi == &*qi));
kono
parents:
diff changeset
68 SA (!(pi != &*qi));
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 // The validity of the relational expressions involving null
kono
parents:
diff changeset
71 // pointers in a constexpr context is questionable.
kono
parents:
diff changeset
72 RA (!(pi < &*qi));
kono
parents:
diff changeset
73 RA ( (pi <= &*qi));
kono
parents:
diff changeset
74 RA (!(pi > &*qi));
kono
parents:
diff changeset
75 RA ( (pi >= &*qi));
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 SA ( (&*qi == pi));
kono
parents:
diff changeset
78 SA (!(&*qi != pi));
kono
parents:
diff changeset
79 RA (!(&*qi < pi));
kono
parents:
diff changeset
80 RA ( (&*qi <= pi));
kono
parents:
diff changeset
81 RA (!(&*qi > pi));
kono
parents:
diff changeset
82 RA ( (&*qi >= pi));
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 // The following are valid constant expressions since &qi [0] is
kono
parents:
diff changeset
85 // equivalent to &*qi.
kono
parents:
diff changeset
86 SA ( (pi == &qi [0]));
kono
parents:
diff changeset
87 SA (!(pi != &qi [0]));
kono
parents:
diff changeset
88 RA (!(pi < &qi [0]));
kono
parents:
diff changeset
89 RA ( (pi <= &qi [0]));
kono
parents:
diff changeset
90 RA (!(pi > &qi [0]));
kono
parents:
diff changeset
91 RA ( (pi >= &qi [0]));
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 SA ( (&qi [0] == pi));
kono
parents:
diff changeset
94 SA (!(&qi [0] != pi));
kono
parents:
diff changeset
95 RA (!(&qi [0] < pi));
kono
parents:
diff changeset
96 RA ( (&qi [0] <= pi));
kono
parents:
diff changeset
97 RA (!(&qi [0] > pi));
kono
parents:
diff changeset
98 RA ( (&qi [0] >= pi));
kono
parents:
diff changeset
99 }
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 void test_first_struct_member ()
kono
parents:
diff changeset
102 {
kono
parents:
diff changeset
103 static struct S { int a, b; } s = { 0, 0 };
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 constexpr const int *p = 0;
kono
parents:
diff changeset
106 constexpr const S *q = &s;
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 SA (!(p == &q->b));
kono
parents:
diff changeset
109 SA ( (p != &q->b));
kono
parents:
diff changeset
110 RA ( (p < &q->b));
kono
parents:
diff changeset
111 RA ( (p <= &q->b));
kono
parents:
diff changeset
112 RA (!(p > &q->b));
kono
parents:
diff changeset
113 RA (!(p >= &q->b));
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 SA (!(&q->b == p));
kono
parents:
diff changeset
116 SA ( (&q->b != p));
kono
parents:
diff changeset
117 RA (!(&q->b < p));
kono
parents:
diff changeset
118 RA (!(&q->b <= p));
kono
parents:
diff changeset
119 RA ( (&q->b > p));
kono
parents:
diff changeset
120 RA ( (&q->b >= p));
kono
parents:
diff changeset
121 }
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 // Expect all runtime asserts to have been eliminated as a result
kono
parents:
diff changeset
124 // of the tested expressions constant folded into true.
kono
parents:
diff changeset
125 // { dg-final { scan-assembler-not "abort" } }