1 |
305 |
jeremybenn |
// { dg-do assemble }
|
2 |
|
|
// g++ 1.37.1 bug 900428_01
|
3 |
|
|
|
4 |
|
|
// g++ fails to issue error messages for cases where an incomplete type
|
5 |
|
|
// object must be evaluated if the value of such an evaluation is not
|
6 |
|
|
// actually used in the given context.
|
7 |
|
|
|
8 |
|
|
// In the case where such an object is volatile, it is obvious that this
|
9 |
|
|
// could be a problem, however I believe that errors should be issued
|
10 |
|
|
// for such cases regardless of whether or not such values are volatile
|
11 |
|
|
// because the abstract semantics seem to require the evaluation of such
|
12 |
|
|
// values whether they are volatile or not.
|
13 |
|
|
|
14 |
|
|
// [expr.static.cast/4, stmt.expr/1, expr.comma/1] show that expressions do
|
15 |
|
|
// not under go lvalue to rvalue decay, unless the value is actually used.
|
16 |
|
|
// This can be surprising when the object is volatile. We interpret a
|
17 |
|
|
// dereference of pointer to volatile to be a read.
|
18 |
|
|
|
19 |
|
|
// keywords: incomplete types, evaluation, volatile qualifier
|
20 |
|
|
|
21 |
|
|
int *ip_fn ();
|
22 |
|
|
int &ir_fn ();
|
23 |
|
|
volatile int *vip_fn ();
|
24 |
|
|
volatile int &vir_fn ();
|
25 |
|
|
|
26 |
|
|
void int_test (int i, int *p, volatile int *vp, int &r, volatile int &vr)
|
27 |
|
|
{
|
28 |
|
|
int j;
|
29 |
|
|
volatile int vj;
|
30 |
|
|
|
31 |
|
|
*p; // ok, no warning
|
32 |
|
|
(void)*p; // ok, no warning
|
33 |
|
|
(void)(i ? j : *p); // ok, no warning
|
34 |
|
|
(void)(i ? *p : j); // ok, no warning
|
35 |
|
|
(void)((void)1, *p); // ok, no warning
|
36 |
|
|
|
37 |
|
|
*vp; // ok, no warning
|
38 |
|
|
(void)*vp; // ok, no warning
|
39 |
|
|
(void)(i ? vj : *vp); // ok, no warning
|
40 |
|
|
(void)(i ? *vp : vj); // ok, no warning
|
41 |
|
|
(void)((void)1, *vp); // ok, no warning
|
42 |
|
|
|
43 |
|
|
r; // ok, no warning
|
44 |
|
|
(void)r; // ok, no warning
|
45 |
|
|
(void)(i ? j : r); // ok, no warning
|
46 |
|
|
(void)(i ? r : j); // ok, no warning
|
47 |
|
|
(void)((void)1, r); // ok, no warning
|
48 |
|
|
|
49 |
|
|
vr; // { dg-warning "" } reference not accessed
|
50 |
|
|
(void)vr; // { dg-warning "" } reference not accessed
|
51 |
|
|
(void)(i ? vj : vr); // { dg-warning "" } reference not accessed
|
52 |
|
|
(void)(i ? vr : vj); // { dg-warning "" } reference not accessed
|
53 |
|
|
(void)((void)1, vr); // { dg-warning "" } reference not accessed
|
54 |
|
|
|
55 |
|
|
*ip_fn (); // ok, no warning
|
56 |
|
|
*vip_fn (); // ok, no warning
|
57 |
|
|
ir_fn (); // ok, no warning
|
58 |
|
|
vir_fn (); // { dg-warning "" } reference not accessed
|
59 |
|
|
}
|
60 |
|
|
|
61 |
|
|
struct S;
|
62 |
|
|
S *sp_fn ();
|
63 |
|
|
S &sr_fn ();
|
64 |
|
|
volatile S *vsp_fn ();
|
65 |
|
|
volatile S &vsr_fn ();
|
66 |
|
|
|
67 |
|
|
void incomplete_test (int i, S *p, volatile S *vp, S &r, volatile S &vr)
|
68 |
|
|
{
|
69 |
|
|
extern S j;
|
70 |
|
|
extern volatile S vj;
|
71 |
|
|
|
72 |
|
|
*p; // ok, no warning
|
73 |
|
|
(void)*p; // ok, no warning
|
74 |
|
|
(void)(i ? j : *p); // ok, no warning
|
75 |
|
|
(void)(i ? *p : j); // ok, no warning
|
76 |
|
|
(void)((void)1, *p); // ok, no warning
|
77 |
|
|
|
78 |
|
|
*vp; // { dg-warning "" } incomplete not accessed
|
79 |
|
|
(void)*vp; // { dg-warning "" } incomplete not accessed
|
80 |
|
|
(void)(i ? vj : *vp); // { dg-warning "" } incomplete not accessed
|
81 |
|
|
(void)(i ? *vp : vj); // { dg-warning "" } incomplete not accessed
|
82 |
|
|
(void)((void)1, *vp); // { dg-warning "" } incomplete not accessed
|
83 |
|
|
|
84 |
|
|
r; // ok, no warning
|
85 |
|
|
(void)r; // ok, no warning
|
86 |
|
|
(void)(i ? j : r); // ok, no warning
|
87 |
|
|
(void)(i ? r : j); // ok, no warning
|
88 |
|
|
(void)((void)1, r); // ok, no warning
|
89 |
|
|
|
90 |
|
|
vr; // { dg-warning "" } reference not accessed
|
91 |
|
|
(void)vr; // { dg-warning "" } reference not accessed
|
92 |
|
|
(void)(i ? vj : vr); // { dg-warning "" } reference not accessed
|
93 |
|
|
(void)(i ? vr : vj); // { dg-warning "" } reference not accessed
|
94 |
|
|
(void)((void)1, vr); // { dg-warning "" } reference not accessed
|
95 |
|
|
|
96 |
|
|
*sp_fn (); // ok, no warning
|
97 |
|
|
*vsp_fn (); // { dg-warning "" } incomplete not accessed
|
98 |
|
|
sr_fn (); // ok, no warning
|
99 |
|
|
vsr_fn (); // { dg-warning "" } reference not accessed
|
100 |
|
|
}
|
101 |
|
|
|
102 |
|
|
struct T {int m;};
|
103 |
|
|
T *tp_fn ();
|
104 |
|
|
T &tr_fn ();
|
105 |
|
|
volatile T *vtp_fn ();
|
106 |
|
|
volatile T &vtr_fn ();
|
107 |
|
|
|
108 |
|
|
void complete_test (int i, T *p, volatile T *vp, T &r, volatile T &vr)
|
109 |
|
|
{
|
110 |
|
|
T j;
|
111 |
|
|
volatile T vj;
|
112 |
|
|
|
113 |
|
|
*p; // ok, no warning
|
114 |
|
|
(void)*p; // ok, no warning
|
115 |
|
|
(void)(i ? j : *p); // ok, no warning
|
116 |
|
|
(void)(i ? *p : j); // ok, no warning
|
117 |
|
|
(void)((void)1, *p); // ok, no warning
|
118 |
|
|
|
119 |
|
|
*vp; // ok, no warning
|
120 |
|
|
(void)*vp; // ok, no warning
|
121 |
|
|
(void)(i ? vj : *vp); // ok, no warning
|
122 |
|
|
(void)(i ? *vp : vj); // ok, no warning
|
123 |
|
|
(void)((void)1, *vp); // ok, no warning
|
124 |
|
|
|
125 |
|
|
r; // ok, no warning
|
126 |
|
|
(void)r; // ok, no warning
|
127 |
|
|
(void)(i ? j : r); // ok, no warning
|
128 |
|
|
(void)(i ? r : j); // ok, no warning
|
129 |
|
|
(void)((void)1, r); // ok, no warning
|
130 |
|
|
|
131 |
|
|
vr; // { dg-warning "" } reference not accessed
|
132 |
|
|
(void)vr; // { dg-warning "" } reference not accessed
|
133 |
|
|
(void)(i ? vj : vr); // { dg-warning "" } reference not accessed
|
134 |
|
|
(void)(i ? vr : vj); // { dg-warning "" } reference not accessed
|
135 |
|
|
(void)((void)1, vr); // { dg-warning "" } reference not accessed
|
136 |
|
|
|
137 |
|
|
*tp_fn (); // ok, no warning
|
138 |
|
|
*vtp_fn (); // ok, no warning
|
139 |
|
|
tr_fn (); // ok, no warning
|
140 |
|
|
vtr_fn (); // ok, no warning{ dg-warning "" } reference not accessed
|
141 |
|
|
}
|
142 |
|
|
|
143 |
|
|
void extern_test ()
|
144 |
|
|
{
|
145 |
|
|
extern S es;
|
146 |
|
|
extern volatile S ves;
|
147 |
|
|
extern T et;
|
148 |
|
|
extern volatile T vet;
|
149 |
|
|
|
150 |
|
|
extern S &esr;
|
151 |
|
|
extern volatile S &vesr;
|
152 |
|
|
extern T &etr;
|
153 |
|
|
extern volatile T &vetr;
|
154 |
|
|
|
155 |
|
|
es; // ok, no warning
|
156 |
|
|
ves; // { dg-warning "" } incomplete not accessed
|
157 |
|
|
et; // ok, no warning
|
158 |
|
|
vet; // ok, no warning
|
159 |
|
|
|
160 |
|
|
esr; // ok, no warning
|
161 |
|
|
vesr; // { dg-warning "" } incomplete not accessed
|
162 |
|
|
etr; // ok, no warning
|
163 |
|
|
vetr; // { dg-warning "" } reference not accessed
|
164 |
|
|
}
|