Skip to content

Commit db4ea21

Browse files
committed
[OpenACC] Change 'not implemented' diagnostic to be more specific
Currently we just emit a generic 'not implemented' diagnostic for all OpenACC pragmas. This patch moves the diagnostic to 'Sema' and diagnoses for a specific clause or construct, in preperation of implementing Sema for constructs.
1 parent b497234 commit db4ea21

14 files changed

+1464
-889
lines changed

clang/include/clang/Basic/DiagnosticParseKinds.td

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1355,9 +1355,6 @@ def warn_pragma_acc_ignored
13551355
DefaultIgnore;
13561356
def err_acc_unexpected_directive
13571357
: Error<"unexpected OpenACC directive %select{|'#pragma acc %1'}0">;
1358-
def warn_pragma_acc_unimplemented
1359-
: Warning<"OpenACC directives not yet implemented, pragma ignored">,
1360-
InGroup<SourceUsesOpenACC>;
13611358
def err_acc_invalid_directive
13621359
: Error<"invalid OpenACC directive %select{%1|'%1 %2'}0">;
13631360
def err_acc_invalid_clause : Error<"invalid OpenACC clause %0">;

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12186,4 +12186,15 @@ def err_wasm_builtin_arg_must_match_table_element_type : Error <
1218612186
"%ordinal0 argument must match the element type of the WebAssembly table in the %ordinal1 argument">;
1218712187
def err_wasm_builtin_arg_must_be_integer_type : Error <
1218812188
"%ordinal0 argument must be an integer">;
12189+
12190+
// OpenACC diagnostics.
12191+
def warn_acc_construct_unimplemented
12192+
: Warning<"OpenACC construct '%0' not yet implemented, pragma ignored">,
12193+
InGroup<SourceUsesOpenACC>;
12194+
def warn_acc_clause_unimplemented
12195+
: Warning<"OpenACC clause '%0' not yet implemented, clause ignored">,
12196+
InGroup<SourceUsesOpenACC>;
12197+
def err_acc_construct_appertainment
12198+
: Error<"OpenACC construct '%0' cannot be used here; it can only "
12199+
"be used in a statement context">;
1218912200
} // end of sema component.

clang/lib/Parse/ParseOpenACC.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1182,7 +1182,6 @@ Parser::OpenACCDirectiveParseInfo Parser::ParseOpenACCDirective() {
11821182
// Parses the list of clauses, if present.
11831183
ParseOpenACCClauseList(DirKind);
11841184

1185-
Diag(getCurToken(), diag::warn_pragma_acc_unimplemented);
11861185
assert(Tok.is(tok::annot_pragma_openacc_end) &&
11871186
"Didn't parse all OpenACC Clauses");
11881187
SourceLocation EndLoc = ConsumeAnnotationToken();

clang/lib/Sema/SemaOpenACC.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,35 @@
1111
///
1212
//===----------------------------------------------------------------------===//
1313

14+
#include "clang/Basic/DiagnosticSema.h"
1415
#include "clang/Basic/OpenACCKinds.h"
1516
#include "clang/Sema/Sema.h"
1617

1718
using namespace clang;
1819
bool Sema::ActOnOpenACCClause(OpenACCClauseKind ClauseKind,
1920
SourceLocation StartLoc) {
20-
return true;
21+
if (ClauseKind == OpenACCClauseKind::Invalid)
22+
return false;
23+
// For now just diagnose that it is unsupported and leave the parsing to do
24+
// whatever it can do. This function will eventually need to start returning
25+
// some sort of Clause AST type, but for now just return true/false based on
26+
// success.
27+
return Diag(StartLoc, diag::warn_acc_clause_unimplemented) << ClauseKind;
2128
}
2229
void Sema::ActOnOpenACCConstruct(OpenACCDirectiveKind K,
23-
SourceLocation StartLoc) {}
30+
SourceLocation StartLoc) {
31+
switch (K) {
32+
case OpenACCDirectiveKind::Invalid:
33+
// Nothing to do here, an invalid kind has nothing we can check here. We
34+
// want to continue parsing clauses as far as we can, so we will just
35+
// ensure that we can still work and don't check any construct-specific
36+
// rules anywhere.
37+
break;
38+
default:
39+
Diag(StartLoc, diag::warn_acc_construct_unimplemented) << K;
40+
break;
41+
}
42+
}
2443

2544
bool Sema::ActOnStartOpenACCStmtDirective(OpenACCDirectiveKind K,
2645
SourceLocation StartLoc) {

clang/test/ParserOpenACC/parse-cache-construct.c

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,58 +13,58 @@ void func() {
1313

1414
for (int i = 0; i < 10; ++i) {
1515
// expected-error@+2{{expected '('}}
16-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
16+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
1717
#pragma acc cache
1818
}
1919

2020
for (int i = 0; i < 10; ++i) {
2121
// expected-error@+3{{expected '('}}
2222
// expected-error@+2{{invalid OpenACC clause 'clause'}}
23-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
23+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
2424
#pragma acc cache clause list
2525
}
2626

2727
for (int i = 0; i < 10; ++i) {
28-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
28+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
2929
#pragma acc cache()
3030
}
3131

3232
for (int i = 0; i < 10; ++i) {
3333
// expected-error@+2{{invalid OpenACC clause 'clause'}}
34-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
34+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
3535
#pragma acc cache() clause-list
3636
}
3737

3838
for (int i = 0; i < 10; ++i) {
3939
// expected-error@+3{{expected ')'}}
4040
// expected-note@+2{{to match this '('}}
41-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
41+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
4242
#pragma acc cache(
4343
}
4444

4545
for (int i = 0; i < 10; ++i) {
4646
// expected-error@+4{{use of undeclared identifier 'invalid'}}
4747
// expected-error@+3{{expected ')'}}
4848
// expected-note@+2{{to match this '('}}
49-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
49+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
5050
#pragma acc cache(invalid
5151
}
5252

5353
for (int i = 0; i < 10; ++i) {
5454
// expected-error@+3{{expected ')'}}
5555
// expected-note@+2{{to match this '('}}
56-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
56+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
5757
#pragma acc cache(ArrayPtr
5858
}
5959

6060
for (int i = 0; i < 10; ++i) {
6161
// expected-error@+2{{use of undeclared identifier 'invalid'}}
62-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
62+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
6363
#pragma acc cache(invalid)
6464
}
6565

6666
for (int i = 0; i < 10; ++i) {
67-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
67+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
6868
#pragma acc cache(ArrayPtr)
6969
}
7070

@@ -74,28 +74,28 @@ void func() {
7474
// expected-note@+4{{to match this '['}}
7575
// expected-error@+3{{expected ')'}}
7676
// expected-note@+2{{to match this '('}}
77-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
77+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
7878
#pragma acc cache(ArrayPtr[
7979
}
8080

8181
for (int i = 0; i < 10; ++i) {
8282
// expected-error@+4{{expected expression}}
8383
// expected-error@+3{{expected ']'}}
8484
// expected-note@+2{{to match this '['}}
85-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
85+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
8686
#pragma acc cache(ArrayPtr[, 5)
8787
}
8888

8989
for (int i = 0; i < 10; ++i) {
9090
// expected-error@+4{{expected expression}}
9191
// expected-error@+3{{expected ']'}}
9292
// expected-note@+2{{to match this '['}}
93-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
93+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
9494
#pragma acc cache(Array[)
9595
}
9696

9797
for (int i = 0; i < 10; ++i) {
98-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
98+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
9999
#pragma acc cache(Array[*readonly])
100100
}
101101

@@ -105,92 +105,92 @@ void func() {
105105
// expected-note@+4{{to match this '['}}
106106
// expected-error@+3{{expected ')'}}
107107
// expected-note@+2{{to match this '('}}
108-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
108+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
109109
#pragma acc cache(Array[*readonly:
110110
}
111111

112112
for (int i = 0; i < 10; ++i) {
113-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
113+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
114114
#pragma acc cache(readonly)
115115
}
116116

117117
for (int i = 0; i < 10; ++i) {
118118
// expected-error@+2{{invalid tag 'devnum' on 'cache' directive}}
119-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
119+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
120120
#pragma acc cache(devnum:ArrayPtr)
121121
}
122122

123123
for (int i = 0; i < 10; ++i) {
124124
// expected-error@+2{{invalid tag 'invalid' on 'cache' directive}}
125-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
125+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
126126
#pragma acc cache(invalid:ArrayPtr)
127127
}
128128

129129
for (int i = 0; i < 10; ++i) {
130-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
130+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
131131
#pragma acc cache(readonly:ArrayPtr)
132132
}
133133

134134
for (int i = 0; i < 10; ++i) {
135135
// expected-error@+2{{expected expression}}
136-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
136+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
137137
#pragma acc cache(readonly:ArrayPtr[5:])
138138
}
139139

140140
for (int i = 0; i < 10; ++i) {
141-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
141+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
142142
#pragma acc cache(readonly:ArrayPtr[5:*readonly])
143143
}
144144

145145
for (int i = 0; i < 10; ++i) {
146-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
146+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
147147
#pragma acc cache(readonly:ArrayPtr[5:*readonly], Array)
148148
}
149149

150150
for (int i = 0; i < 10; ++i) {
151-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
151+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
152152
#pragma acc cache(readonly:ArrayPtr[5:*readonly], Array[*readonly:3])
153153
}
154154

155155
for (int i = 0; i < 10; ++i) {
156-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
156+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
157157
#pragma acc cache(readonly:ArrayPtr[5 + i:*readonly], Array[*readonly + i:3])
158158
}
159159

160160
for (int i = 0; i < 10; ++i) {
161161
// expected-error@+4{{expected expression}}
162162
// expected-error@+3{{expected ')'}}
163163
// expected-note@+2{{to match this '('}}
164-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
164+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
165165
#pragma acc cache(readonly:ArrayPtr[5:*readonly],
166166
}
167167

168168
for (int i = 0; i < 10; ++i) {
169169
// expected-error@+2{{expected expression}}
170-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
170+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
171171
#pragma acc cache(readonly:ArrayPtr[5:*readonly],)
172172
}
173173

174174
for (int i = 0; i < 10; ++i) {
175175
// expected-warning@+2{{left operand of comma operator has no effect}}
176-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
176+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
177177
#pragma acc cache(readonly:ArrayPtr[5,6:*readonly])
178178
}
179179

180180
for (int i = 0; i < 10; ++i) {
181181
// expected-warning@+2{{left operand of comma operator has no effect}}
182-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
182+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
183183
#pragma acc cache(readonly:ArrayPtr[5:3, *readonly], ArrayPtr[0])
184184
}
185185

186186
for (int i = 0; i < 10; ++i) {
187-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
187+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
188188
#pragma acc cache(readonly:s.foo)
189189
}
190190

191191
for (int i = 0; i < 10; ++i) {
192192
// expected-warning@+2{{left operand of comma operator has no effect}}
193-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
193+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
194194
#pragma acc cache(readonly:s.Array[1,2])
195195
}
196196
}

clang/test/ParserOpenACC/parse-cache-construct.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,34 @@ template<typename T, int I>
99
void func() {
1010
char *ArrayPtr = getArrayPtr();
1111
for (int i = 0; i < 10; ++i) {
12-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
12+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
1313
#pragma acc cache(ArrayPtr[T::value + I:I + 5], T::array[(i + T::value, 5): 6])
1414
}
1515
for (int i = 0; i < 10; ++i) {
16-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
16+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
1717
#pragma acc cache(NS::NSArray[NS::NSInt])
1818
}
1919

2020
for (int i = 0; i < 10; ++i) {
21-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
21+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
2222
#pragma acc cache(NS::NSArray[NS::NSInt : NS::NSInt])
2323
}
2424

2525
for (int i = 0; i < 10; ++i) {
2626
// expected-error@+2{{use of undeclared identifier 'NSArray'; did you mean 'NS::NSArray'}}
27-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
27+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
2828
#pragma acc cache(NSArray[NS::NSInt : NS::NSInt])
2929
}
3030

3131
for (int i = 0; i < 10; ++i) {
3232
// expected-error@+2{{use of undeclared identifier 'NSInt'; did you mean 'NS::NSInt'}}
33-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
33+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
3434
#pragma acc cache(NS::NSArray[NSInt : NS::NSInt])
3535
}
3636

3737
for (int i = 0; i < 10; ++i) {
3838
// expected-error@+2{{use of undeclared identifier 'NSInt'; did you mean 'NS::NSInt'}}
39-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
39+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
4040
#pragma acc cache(NS::NSArray[NS::NSInt : NSInt])
4141
}
4242
}
@@ -59,56 +59,56 @@ void use() {
5959

6060
Members s;
6161
for (int i = 0; i < 10; ++i) {
62-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
62+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
6363
#pragma acc cache(s.array[s.value])
6464
}
6565
HasMembersArray Arrs;
6666
for (int i = 0; i < 10; ++i) {
67-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
67+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
6868
#pragma acc cache(Arrs.MemArr[3].array[4])
6969
}
7070
for (int i = 0; i < 10; ++i) {
71-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
71+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
7272
#pragma acc cache(Arrs.MemArr[3].array[1:4])
7373
}
7474
for (int i = 0; i < 10; ++i) {
7575
// FIXME: Once we have a new array-section type to represent OpenACC as
7676
// well, change this error message.
7777
// expected-error@+2{{OpenMP array section is not allowed here}}
78-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
78+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
7979
#pragma acc cache(Arrs.MemArr[3:4].array[1:4])
8080
}
8181
for (int i = 0; i < 10; ++i) {
8282
// expected-error@+2{{OpenMP array section is not allowed here}}
83-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
83+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
8484
#pragma acc cache(Arrs.MemArr[3:4].array[4])
8585
}
8686
for (int i = 0; i < 10; ++i) {
8787
// expected-error@+3{{expected ']'}}
8888
// expected-note@+2{{to match this '['}}
89-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
89+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
9090
#pragma acc cache(Arrs.MemArr[3:4:].array[4])
9191
}
9292
for (int i = 0; i < 10; ++i) {
9393
// expected-error@+2{{expected expression}}
94-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
94+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
9595
#pragma acc cache(Arrs.MemArr[:].array[4])
9696
}
9797
for (int i = 0; i < 10; ++i) {
9898
// expected-error@+2{{expected unqualified-id}}
99-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
99+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
100100
#pragma acc cache(Arrs.MemArr[::].array[4])
101101
}
102102
for (int i = 0; i < 10; ++i) {
103103
// expected-error@+4{{expected expression}}
104104
// expected-error@+3{{expected ']'}}
105105
// expected-note@+2{{to match this '['}}
106-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
106+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
107107
#pragma acc cache(Arrs.MemArr[: :].array[4])
108108
}
109109
for (int i = 0; i < 10; ++i) {
110110
// expected-error@+2{{expected expression}}
111-
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
111+
// expected-warning@+1{{OpenACC construct 'cache' not yet implemented, pragma ignored}}
112112
#pragma acc cache(Arrs.MemArr[3:].array[4])
113113
}
114114
func<S, 5>();

0 commit comments

Comments
 (0)