aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorerichkeane <ekeane@nvidia.com>2023-12-08 09:32:01 -0800
committererichkeane <ekeane@nvidia.com>2023-12-08 09:32:49 -0800
commit731361cd1540d0e729633833e6f3a670443c4b84 (patch)
tree0559d8c37696136f60c5634a64bfcfdb21b66970
parent965fe352a770134968538cf9a0818016b7c3c7f6 (diff)
downloadllvm-731361cd1540d0e729633833e6f3a670443c4b84.zip
llvm-731361cd1540d0e729633833e6f3a670443c4b84.tar.gz
llvm-731361cd1540d0e729633833e6f3a670443c4b84.tar.bz2
[OpenACC] Fix bug with directive name being a 'special token'
If the 'directive name' is a special token instead of an identifier, we end up asserting. This fixes that.
-rw-r--r--clang/lib/Parse/ParseOpenACC.cpp9
-rw-r--r--clang/test/ParserOpenACC/parse-constructs.c11
2 files changed, 14 insertions, 6 deletions
diff --git a/clang/lib/Parse/ParseOpenACC.cpp b/clang/lib/Parse/ParseOpenACC.cpp
index 83a91d44f..f7f0967 100644
--- a/clang/lib/Parse/ParseOpenACC.cpp
+++ b/clang/lib/Parse/ParseOpenACC.cpp
@@ -206,7 +206,7 @@ OpenACCDirectiveKind ParseOpenACCDirectiveKind(Parser &P) {
// Just #pragma acc can get us immediately to the end, make sure we don't
// introspect on the spelling before then.
- if (FirstTok.isAnnotation()) {
+ if (FirstTok.isNot(tok::identifier)) {
P.Diag(FirstTok, diag::err_acc_missing_directive);
return OpenACCDirectiveKind::Invalid;
}
@@ -224,11 +224,8 @@ OpenACCDirectiveKind ParseOpenACCDirectiveKind(Parser &P) {
if (ExDirKind >= OpenACCDirectiveKindEx::Invalid) {
switch (ExDirKind) {
case OpenACCDirectiveKindEx::Invalid: {
- if (!FirstTok.is(tok::identifier))
- P.Diag(FirstTok, diag::err_expected) << tok::identifier;
- else
- P.Diag(FirstTok, diag::err_acc_invalid_directive)
- << 0 << FirstTok.getIdentifierInfo();
+ P.Diag(FirstTok, diag::err_acc_invalid_directive)
+ << 0 << FirstTok.getIdentifierInfo();
return OpenACCDirectiveKind::Invalid;
}
case OpenACCDirectiveKindEx::Enter:
diff --git a/clang/test/ParserOpenACC/parse-constructs.c b/clang/test/ParserOpenACC/parse-constructs.c
index b745f54..83d9bd6 100644
--- a/clang/test/ParserOpenACC/parse-constructs.c
+++ b/clang/test/ParserOpenACC/parse-constructs.c
@@ -7,6 +7,17 @@ void func() {
#pragma acc
for(;;){}
+ // expected-error@+4{{expected OpenACC directive}}
+ // expected-error@+3{{expected clause-list or newline in OpenACC directive}}
+ // expected-warning@+2{{OpenACC clause parsing not yet implemented}}
+ // expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
+#pragma acc(whatever) routine
+
+ // expected-error@+3{{expected OpenACC directive}}
+ // expected-warning@+2{{OpenACC clause parsing not yet implemented}}
+ // expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
+#pragma acc) routine
+
// expected-error@+2{{invalid OpenACC directive 'invalid'}}
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
#pragma acc invalid