[clang] 4de69f7 - [OpenACC] Implement ignoring of extension clauses
via cfe-commits
cfe-commits at lists.llvm.org
Thu May 29 11:41:10 PDT 2025
Author: erichkeane
Date: 2025-05-29T11:41:02-07:00
New Revision: 4de69f786e207f3b5269c37df888d23eace674f7
URL: https://github.com/llvm/llvm-project/commit/4de69f786e207f3b5269c37df888d23eace674f7
DIFF: https://github.com/llvm/llvm-project/commit/4de69f786e207f3b5269c37df888d23eace674f7.diff
LOG: [OpenACC] Implement ignoring of extension clauses
OpenACC 3.4 will permit extension clauses, which are clauses that start
with '__', and contain an optional balanced-paren-token-sequence inside
of parens.
This patch ensures we consume these, and emit a warning instead of an
error for unsupported clauses.
Added:
clang/test/ParserOpenACC/extensions.c
Modified:
clang/include/clang/Basic/DiagnosticParseKinds.td
clang/lib/Parse/ParseOpenACC.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 554d70de86902..3aa36ad59d0b9 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1456,6 +1456,9 @@ def err_acc_unexpected_directive
def err_acc_invalid_directive
: Error<"invalid OpenACC directive %select{%1|'%1 %2'}0">;
def err_acc_invalid_clause : Error<"invalid OpenACC clause %0">;
+def warn_acc_unsupported_extension_clause
+ : Warning<"unsupported OpenACC extension clause %0">,
+ InGroup<DiagGroup<"unknown-acc-extension-clause">>;
def err_acc_missing_directive : Error<"expected OpenACC directive">;
def err_acc_invalid_open_paren
: Error<"expected clause-list or newline in OpenACC directive">;
diff --git a/clang/lib/Parse/ParseOpenACC.cpp b/clang/lib/Parse/ParseOpenACC.cpp
index e2c2463200892..3539278c7ff65 100644
--- a/clang/lib/Parse/ParseOpenACC.cpp
+++ b/clang/lib/Parse/ParseOpenACC.cpp
@@ -939,6 +939,15 @@ bool Parser::ParseOpenACCGangArgList(
return false;
}
+namespace {
+bool isUnsupportedExtensionClause(Token Tok) {
+ if (!Tok.is(tok::identifier))
+ return false;
+
+ return Tok.getIdentifierInfo()->getName().starts_with("__");
+}
+} // namespace
+
Parser::OpenACCClauseParseResult
Parser::ParseOpenACCClause(ArrayRef<const OpenACCClause *> ExistingClauses,
OpenACCDirectiveKind DirKind) {
@@ -949,7 +958,21 @@ Parser::ParseOpenACCClause(ArrayRef<const OpenACCClause *> ExistingClauses,
OpenACCClauseKind Kind = getOpenACCClauseKind(getCurToken());
- if (Kind == OpenACCClauseKind::Invalid) {
+ if (isUnsupportedExtensionClause(getCurToken())) {
+ Diag(getCurToken(), diag::warn_acc_unsupported_extension_clause)
+ << getCurToken().getIdentifierInfo();
+
+ // Extension methods optionally contain balanced token sequences, so we are
+ // going to parse this.
+ ConsumeToken(); // Consume the clause name.
+ BalancedDelimiterTracker Parens(*this, tok::l_paren,
+ tok::annot_pragma_openacc_end);
+ // Consume the optional parens and tokens inside of them.
+ if (!Parens.consumeOpen())
+ Parens.skipToEnd();
+
+ return OpenACCCanContinue();
+ } else if (Kind == OpenACCClauseKind::Invalid) {
Diag(getCurToken(), diag::err_acc_invalid_clause)
<< getCurToken().getIdentifierInfo();
return OpenACCCannotContinue();
diff --git a/clang/test/ParserOpenACC/extensions.c b/clang/test/ParserOpenACC/extensions.c
new file mode 100644
index 0000000000000..1cfb3f88fce12
--- /dev/null
+++ b/clang/test/ParserOpenACC/extensions.c
@@ -0,0 +1,66 @@
+// RUN: %clang_cc1 %s -verify -fopenacc
+// RUN: not %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
+
+void foo(int Var) {
+ // expected-warning at +1{{unsupported OpenACC extension clause '__extension'}}
+#pragma acc parallel copy(Var) __extension copyin(Var)
+ ;
+ // CHECK: OpenACCComputeConstruct
+ // CHECK-NEXT: copy clause
+ // CHECK-NEXT: DeclRefExpr
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr
+ // CHECK-NEXT: NullStmt
+
+ // expected-warning at +1{{unsupported OpenACC extension clause '__extension'}}
+#pragma acc parallel copy(Var) __extension(stuff) copyin(Var)
+ ;
+ // CHECK: OpenACCComputeConstruct
+ // CHECK-NEXT: copy clause
+ // CHECK-NEXT: DeclRefExpr
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr
+ // CHECK-NEXT: NullStmt
+
+ // expected-warning at +1{{unsupported OpenACC extension clause '__extension'}}
+#pragma acc parallel copy(Var) __extension(")") copyin(Var)
+ ;
+ // CHECK: OpenACCComputeConstruct
+ // CHECK-NEXT: copy clause
+ // CHECK-NEXT: DeclRefExpr
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr
+ // CHECK-NEXT: NullStmt
+
+ // expected-warning at +1{{unsupported OpenACC extension clause '__extension'}}
+#pragma acc parallel copy(Var) __extension(()) copyin(Var)
+ ;
+ // CHECK: OpenACCComputeConstruct
+ // CHECK-NEXT: copy clause
+ // CHECK-NEXT: DeclRefExpr
+ // CHECK-NEXT: copyin clause
+ // CHECK-NEXT: DeclRefExpr
+ // CHECK-NEXT: NullStmt
+
+ // expected-warning at +2{{unsupported OpenACC extension clause '__extension'}}
+ // expected-error at +1{{expected identifier}}
+#pragma acc parallel copy(Var) __extension()) copyin(Var)
+ ;
+ // CHECK: OpenACCComputeConstruct
+ // CHECK-NEXT: copy clause
+ // CHECK-NEXT: DeclRefExpr
+ // Cannot recover from a bad paren, so we give up here.
+ // CHECK-NEXT: NullStmt
+
+ // expected-warning at +3{{unsupported OpenACC extension clause '__extension'}}
+ // expected-error at +2{{expected ')'}}
+ // expected-note at +1{{to match this '('}}
+#pragma acc parallel copy(Var) __extension(() copyin(Var)
+ ;
+ // CHECK: OpenACCComputeConstruct
+ // CHECK-NEXT: copy clause
+ // CHECK-NEXT: DeclRefExpr
+ // Cannot recover from a bad paren, so we give up here.
+ // CHECK-NEXT: NullStmt
+
+}
More information about the cfe-commits
mailing list