Skip to content

Commit c286150

Browse files
erichkeanegoogle-yfyang
authored andcommitted
[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.
1 parent 2665be1 commit c286150

File tree

3 files changed

+93
-1
lines changed

3 files changed

+93
-1
lines changed

clang/include/clang/Basic/DiagnosticParseKinds.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1456,6 +1456,9 @@ def err_acc_unexpected_directive
14561456
def err_acc_invalid_directive
14571457
: Error<"invalid OpenACC directive %select{%1|'%1 %2'}0">;
14581458
def err_acc_invalid_clause : Error<"invalid OpenACC clause %0">;
1459+
def warn_acc_unsupported_extension_clause
1460+
: Warning<"unsupported OpenACC extension clause %0">,
1461+
InGroup<DiagGroup<"unknown-acc-extension-clause">>;
14591462
def err_acc_missing_directive : Error<"expected OpenACC directive">;
14601463
def err_acc_invalid_open_paren
14611464
: Error<"expected clause-list or newline in OpenACC directive">;

clang/lib/Parse/ParseOpenACC.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,15 @@ bool Parser::ParseOpenACCGangArgList(
939939
return false;
940940
}
941941

942+
namespace {
943+
bool isUnsupportedExtensionClause(Token Tok) {
944+
if (!Tok.is(tok::identifier))
945+
return false;
946+
947+
return Tok.getIdentifierInfo()->getName().starts_with("__");
948+
}
949+
} // namespace
950+
942951
Parser::OpenACCClauseParseResult
943952
Parser::ParseOpenACCClause(ArrayRef<const OpenACCClause *> ExistingClauses,
944953
OpenACCDirectiveKind DirKind) {
@@ -949,7 +958,21 @@ Parser::ParseOpenACCClause(ArrayRef<const OpenACCClause *> ExistingClauses,
949958

950959
OpenACCClauseKind Kind = getOpenACCClauseKind(getCurToken());
951960

952-
if (Kind == OpenACCClauseKind::Invalid) {
961+
if (isUnsupportedExtensionClause(getCurToken())) {
962+
Diag(getCurToken(), diag::warn_acc_unsupported_extension_clause)
963+
<< getCurToken().getIdentifierInfo();
964+
965+
// Extension methods optionally contain balanced token sequences, so we are
966+
// going to parse this.
967+
ConsumeToken(); // Consume the clause name.
968+
BalancedDelimiterTracker Parens(*this, tok::l_paren,
969+
tok::annot_pragma_openacc_end);
970+
// Consume the optional parens and tokens inside of them.
971+
if (!Parens.consumeOpen())
972+
Parens.skipToEnd();
973+
974+
return OpenACCCanContinue();
975+
} else if (Kind == OpenACCClauseKind::Invalid) {
953976
Diag(getCurToken(), diag::err_acc_invalid_clause)
954977
<< getCurToken().getIdentifierInfo();
955978
return OpenACCCannotContinue();

clang/test/ParserOpenACC/extensions.c

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// RUN: %clang_cc1 %s -verify -fopenacc
2+
// RUN: not %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
3+
4+
void foo(int Var) {
5+
// expected-warning@+1{{unsupported OpenACC extension clause '__extension'}}
6+
#pragma acc parallel copy(Var) __extension copyin(Var)
7+
;
8+
// CHECK: OpenACCComputeConstruct
9+
// CHECK-NEXT: copy clause
10+
// CHECK-NEXT: DeclRefExpr
11+
// CHECK-NEXT: copyin clause
12+
// CHECK-NEXT: DeclRefExpr
13+
// CHECK-NEXT: NullStmt
14+
15+
// expected-warning@+1{{unsupported OpenACC extension clause '__extension'}}
16+
#pragma acc parallel copy(Var) __extension(stuff) copyin(Var)
17+
;
18+
// CHECK: OpenACCComputeConstruct
19+
// CHECK-NEXT: copy clause
20+
// CHECK-NEXT: DeclRefExpr
21+
// CHECK-NEXT: copyin clause
22+
// CHECK-NEXT: DeclRefExpr
23+
// CHECK-NEXT: NullStmt
24+
25+
// expected-warning@+1{{unsupported OpenACC extension clause '__extension'}}
26+
#pragma acc parallel copy(Var) __extension(")") copyin(Var)
27+
;
28+
// CHECK: OpenACCComputeConstruct
29+
// CHECK-NEXT: copy clause
30+
// CHECK-NEXT: DeclRefExpr
31+
// CHECK-NEXT: copyin clause
32+
// CHECK-NEXT: DeclRefExpr
33+
// CHECK-NEXT: NullStmt
34+
35+
// expected-warning@+1{{unsupported OpenACC extension clause '__extension'}}
36+
#pragma acc parallel copy(Var) __extension(()) copyin(Var)
37+
;
38+
// CHECK: OpenACCComputeConstruct
39+
// CHECK-NEXT: copy clause
40+
// CHECK-NEXT: DeclRefExpr
41+
// CHECK-NEXT: copyin clause
42+
// CHECK-NEXT: DeclRefExpr
43+
// CHECK-NEXT: NullStmt
44+
45+
// expected-warning@+2{{unsupported OpenACC extension clause '__extension'}}
46+
// expected-error@+1{{expected identifier}}
47+
#pragma acc parallel copy(Var) __extension()) copyin(Var)
48+
;
49+
// CHECK: OpenACCComputeConstruct
50+
// CHECK-NEXT: copy clause
51+
// CHECK-NEXT: DeclRefExpr
52+
// Cannot recover from a bad paren, so we give up here.
53+
// CHECK-NEXT: NullStmt
54+
55+
// expected-warning@+3{{unsupported OpenACC extension clause '__extension'}}
56+
// expected-error@+2{{expected ')'}}
57+
// expected-note@+1{{to match this '('}}
58+
#pragma acc parallel copy(Var) __extension(() copyin(Var)
59+
;
60+
// CHECK: OpenACCComputeConstruct
61+
// CHECK-NEXT: copy clause
62+
// CHECK-NEXT: DeclRefExpr
63+
// Cannot recover from a bad paren, so we give up here.
64+
// CHECK-NEXT: NullStmt
65+
66+
}

0 commit comments

Comments
 (0)