111
|
1 // { dg-do compile }
|
|
2
|
|
3 struct S { int x; } s;
|
|
4
|
|
5 // Make sure we detect errors on non-type-dependent things
|
|
6 // even when the templates are never instantiated.
|
|
7 template<typename T> void f1()
|
|
8 {
|
145
|
9 #pragma omp atomic // { dg-error "invalid" }
|
|
10 s += 1;
|
111
|
11 }
|
|
12
|
|
13 template<typename T> void f2(float *f)
|
|
14 {
|
145
|
15 #pragma omp atomic // { dg-error "invalid" }
|
|
16 *f |= 1; // { dg-message "evaluation" "" { target *-*-* } .-1 }
|
111
|
17 }
|
|
18
|
|
19 // Here the rhs is dependent, but not type dependent.
|
|
20 template<typename T> void f3(float *f)
|
|
21 {
|
145
|
22 #pragma omp atomic // { dg-error "invalid" }
|
|
23 *f |= sizeof (T); // { dg-message "evaluation" "" { target *-*-* } .-1 }
|
111
|
24 }
|
|
25
|
|
26 // And the converse, no error here because we're never fed a T.
|
|
27 template<typename T> void f4(T *t)
|
|
28 {
|
|
29 #pragma omp atomic
|
|
30 *t += 1;
|
|
31 }
|
|
32
|
|
33 // Here we'll let it go, because the rhs is type dependent and
|
|
34 // we can't properly instantiate the statement, and we do most
|
|
35 // of the semantic analysis concurrent with that.
|
|
36 template<typename T> void f5(float *f)
|
|
37 {
|
145
|
38 #pragma omp atomic // { dg-error "invalid" "" { xfail *-*-* } }
|
|
39 *f |= (T)sizeof(T); // { dg-error "evaluation" "" { xfail *-*-* } }
|
111
|
40 }
|