1 // RUN: %clang_cc1 -verify=expected,lt50,lt51 -fopenmp -fopenmp-version=45 -ferror-limit 100 -o - -std=c++11 %s -Wuninitialized
2 // RUN: %clang_cc1 -verify=expected,ge50,lt51 -fopenmp -fopenmp-version=50 -ferror-limit 100 -o - -std=c++11 %s -Wuninitialized
3 // RUN: %clang_cc1 -verify=expected,ge50,ge51 -fopenmp -fopenmp-version=51 -ferror-limit 100 -o - -std=c++11 %s -Wuninitialized
4 
5 // RUN: %clang_cc1 -verify=expected,lt50,lt51 -fopenmp-simd -fopenmp-version=45 -ferror-limit 100 -o - -std=c++11 %s -Wuninitialized
6 // RUN: %clang_cc1 -verify=expected,ge50,lt51 -fopenmp-simd -fopenmp-version=50 -ferror-limit 100 -o - -std=c++11 %s -Wuninitialized
7 // RUN: %clang_cc1 -verify=expected,ge50,ge51 -fopenmp-simd -fopenmp-version=51 -ferror-limit 100 -o - -std=c++11 %s -Wuninitialized
8 
xxx(int argc)9 void xxx(int argc) {
10   int x; // expected-note {{initialize the variable 'x' to silence this warning}}
11 #pragma omp target update to(x)
12   argc = x; // expected-warning {{variable 'x' is uninitialized when used here}}
13 }
14 
foo()15 void foo() {
16 }
17 
foobool(int argc)18 bool foobool(int argc) {
19   return argc;
20 }
21 
22 struct S1; // Aexpected-note {{declared here}}
23 
24 template <class T, class S> // Aexpected-note {{declared here}}
tmain(T argc,S ** argv)25 int tmain(T argc, S **argv) {
26   int n;
27   return 0;
28 }
29 
30 struct S {
31   int i;
32 };
33 
main(int argc,char ** argv)34 int main(int argc, char **argv) {
35   int m;
36   #pragma omp target update // expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
37   #pragma omp target update to(m) { // expected-warning {{extra tokens at the end of '#pragma omp target update' are ignored}}
38   #pragma omp target update to(m) ( // expected-warning {{extra tokens at the end of '#pragma omp target update' are ignored}}
39   #pragma omp target update to(m) [ // expected-warning {{extra tokens at the end of '#pragma omp target update' are ignored}}
40   #pragma omp target update to(m) ] // expected-warning {{extra tokens at the end of '#pragma omp target update' are ignored}}
41   #pragma omp target update to(m) ) // expected-warning {{extra tokens at the end of '#pragma omp target update' are ignored}}
42 
43   #pragma omp declare mapper(id: S s) map(s.i)
44   S s;
45 
46   // Check parsing with no modifiers.
47   // lt51-error@+2 {{expected expression}}
48   // lt51-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
49   #pragma omp target update to(: s)
50   // expected-error@+2 {{expected expression}}
51   // expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
52   #pragma omp target update to(:)
53   // expected-error@+2 2 {{expected expression}}
54   // expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
55   #pragma omp target update to(,:)
56 
57   // Check parsing with one modifier.
58   // expected-error@+2 {{use of undeclared identifier 'foobar'}}
59   // expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
60   #pragma omp target update to(foobar: s)
61   // expected-error@+3 {{expected ',' or ')' in 'to' clause}}
62   // expected-error@+2 {{expected ')'}}
63   // expected-note@+1 {{to match this '('}}
64   #pragma omp target update to(m: s)
65   #pragma omp target update to(mapper(id): s)
66   // lt51-error@+2 {{use of undeclared identifier 'present'}}
67   // lt51-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
68   #pragma omp target update to(present: s)
69   // ge51-warning@+4 {{missing ':' after motion modifier - ignoring}}
70   // lt51-warning@+3 {{missing ':' after ) - ignoring}}
71   // expected-error@+2 {{expected expression}}
72   // expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
73   #pragma omp target update to(mapper(id) s)
74   // ge51-warning@+4 {{missing ':' after motion modifier - ignoring}}
75   // ge51-error@+3 {{expected expression}}
76   // lt51-error@+2 {{use of undeclared identifier 'present'}}
77   // expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
78   #pragma omp target update to(present s)
79   // ge51-warning@+4 {{missing ':' after motion modifier - ignoring}}
80   // lt51-warning@+3 {{missing ':' after ) - ignoring}}
81   // expected-error@+2 {{expected expression}}
82   // expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
83   #pragma omp target update to(mapper(id))
84   // ge51-warning@+4 {{missing ':' after motion modifier - ignoring}}
85   // ge51-error@+3 {{expected expression}}
86   // lt51-error@+2 {{use of undeclared identifier 'present'}}
87   // expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
88   #pragma omp target update to(present)
89   // expected-error@+2 {{expected expression}}
90   // expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
91   #pragma omp target update to(mapper(id):)
92   // ge51-error@+3 {{expected expression}}
93   // lt51-error@+2 {{use of undeclared identifier 'present'}}
94   // expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
95   #pragma omp target update to(present:)
96 
97   // Check parsing with two modifiers.
98   // lt51-warning@+1 {{missing ':' after ) - ignoring}}
99   #pragma omp target update to(mapper(id), present: s)
100   // lt51-error@+3 {{use of undeclared identifier 'present'}}
101   // lt51-error@+2 {{use of undeclared identifier 'id'}}
102   // lt51-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
103   #pragma omp target update to(present, mapper(id): s)
104   // lt51-warning@+1 {{missing ':' after ) - ignoring}}
105   #pragma omp target update to(mapper(id) present: s)
106   // lt51-error@+2 {{use of undeclared identifier 'present'}}
107   // lt51-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
108   #pragma omp target update to(present mapper(id): s)
109 
110   // Check parsing with unnecessary commas.
111   // lt51-warning@+1 {{missing ':' after ) - ignoring}}
112   #pragma omp target update to(mapper(id),: s)
113   // lt51-error@+3 {{use of undeclared identifier 'present'}}
114   // lt51-error@+2 {{expected expression}}
115   // lt51-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
116   #pragma omp target update to(present , : s)
117   // ge51-warning@+2 {{missing ':' after motion modifier - ignoring}}
118   // lt51-warning@+1 {{missing ':' after ) - ignoring}}
119   #pragma omp target update to(mapper(id),,: s)
120   // ge51-warning@+5 {{missing ':' after motion modifier - ignoring}}
121   // lt51-error@+4 {{use of undeclared identifier 'present'}}
122   // lt51-error@+3 {{expected expression}}
123   // lt51-error@+2 {{expected expression}}
124   // lt51-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
125   #pragma omp target update to(present,,: s)
126   // lt51-warning@+1 {{missing ':' after ) - ignoring}}
127   #pragma omp target update to(mapper(id), present,: s)
128   // lt51-error@+4 {{use of undeclared identifier 'present'}}
129   // lt51-error@+3 {{use of undeclared identifier 'id'}}
130   // lt51-error@+2 {{expected expression}}
131   // lt51-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
132   #pragma omp target update to(present, mapper(id),: s)
133 
134   #pragma omp target update from(m) allocate(m) // expected-error {{unexpected OpenMP clause 'allocate' in directive '#pragma omp target update'}}
135   {
136     foo();
137   }
138 
139   double marr[10][5][10];
140 #pragma omp target update to(marr[0:2][2:4][1:2]) // lt50-error {{array section does not specify contiguous storage}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
141   {}
142 #pragma omp target update from(marr[0:2][2:4][1:2]) // lt50-error {{array section does not specify contiguous storage}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
143 
144 #pragma omp target update to(marr[0:][1:2:2][1:2]) // ge50-error {{array section does not specify length for outermost dimension}} lt50-error {{expected ']'}} lt50-note {{to match this '['}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
145   {}
146 #pragma omp target update from(marr[0:][1:2:2][1:2]) // ge50-error {{array section does not specify length for outermost dimension}} lt50-error {{expected ']'}} lt50-note {{to match this '['}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
147 
148   int arr[4][3][2][1];
149 #pragma omp target update to(arr[0:2][2:4][:2][1]) // lt50-error {{array section does not specify contiguous storage}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
150   {}
151 #pragma omp target update from(arr[0:2][2:4][:2][1]) // lt50-error {{array section does not specify contiguous storage}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
152 
153   double ***dptr;
154 #pragma omp target update to(dptr[0:2][2:4][1:2]) // lt50-error {{array section does not specify contiguous storage}} ge50-error 2 {{section length is unspecified and cannot be inferred because subscripted value is an array of unknown bound}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
155   {}
156 #pragma omp target update from(dptr[0:2][2:4][1:2]) // lt50-error {{array section does not specify contiguous storage}} ge50-error 2 {{section length is unspecified and cannot be inferred because subscripted value is an array of unknown bound}} lt50-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
157 
158   int iarr[5][5];
159 // ge50-error@+4 {{section stride is evaluated to a non-positive value -1}}
160 // lt50-error@+3 {{expected ']'}}
161 // lt50-note@+2 {{to match this '['}}
162 // expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
163 #pragma omp target update to(iarr[0:][1:2:-1])
164   {}
165 // ge50-error@+4 {{section stride is evaluated to a non-positive value -1}}
166 // lt50-error@+3 {{expected ']'}}
167 // lt50-note@+2 {{to match this '['}}
168 // expected-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
169 #pragma omp target update from(iarr[0:][1:2:-1])
170   {}
171 // lt50-error@+5 {{expected expression}}
172 // ge50-error@+4 {{array section does not specify length for outermost dimension}}
173 // lt50-error@+3 {{expected ']'}}
174 // lt50-note@+2 {{to match this '['}}
175 // lt50-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
176 #pragma omp target update to(iarr[0: :2][1:2])
177   {}
178 // lt50-error@+5 {{expected expression}}
179 // ge50-error@+4 {{array section does not specify length for outermost dimension}}
180 // lt50-error@+3 {{expected ']'}}
181 // lt50-note@+2 {{to match this '['}}
182 // lt50-error@+1 {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}}
183 #pragma omp target update from(iarr[0: :2][1:2])
184   {}
185 
186   return tmain(argc, argv);
187 }
188