[flang-commits] [flang] [flang] Improve OpenACC SELF clause parser (PR #135883)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Wed Apr 16 08:35:01 PDT 2025
https://github.com/klausler updated https://github.com/llvm/llvm-project/pull/135883
>From fce2f801db2ace2c278a2a74726746883261a2c6 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Tue, 15 Apr 2025 16:41:52 -0700
Subject: [PATCH 1/2] [flang] Improve OpenACC SELF clause parser
The current parser can fail on "self(x * 2)" by recognizing just
"x" as a one-element list of object names and then failing at a
higher level because it never reached the right parenthesis.
Add lookahead checks and error recovery.
Fixes https://github.com/llvm/llvm-project/issues/135810.
---
flang/lib/Parser/openacc-parsers.cpp | 9 +++++++--
flang/test/Semantics/OpenACC/bug135810-1.f90 | 9 +++++++++
flang/test/Semantics/OpenACC/bug135810-2.f90 | 12 ++++++++++++
3 files changed, 28 insertions(+), 2 deletions(-)
create mode 100644 flang/test/Semantics/OpenACC/bug135810-1.f90
create mode 100644 flang/test/Semantics/OpenACC/bug135810-2.f90
diff --git a/flang/lib/Parser/openacc-parsers.cpp b/flang/lib/Parser/openacc-parsers.cpp
index fb731ee52cbba..5e0a56b1d374c 100644
--- a/flang/lib/Parser/openacc-parsers.cpp
+++ b/flang/lib/Parser/openacc-parsers.cpp
@@ -126,8 +126,13 @@ TYPE_PARSER(construct<AccDefaultClause>(
// SELF clause is either a simple optional condition for compute construct
// or a synonym of the HOST clause for the update directive 2.14.4 holding
// an object list.
-TYPE_PARSER(construct<AccSelfClause>(Parser<AccObjectList>{}) ||
- construct<AccSelfClause>(scalarLogicalExpr))
+TYPE_PARSER(
+ construct<AccSelfClause>(Parser<AccObjectList>{}) / lookAhead(")"_tok) ||
+ construct<AccSelfClause>(scalarLogicalExpr / lookAhead(")"_tok)) ||
+ construct<AccSelfClause>(
+ recovery(fail<std::optional<ScalarLogicalExpr>>(
+ "logical expression or object list expected"_err_en_US),
+ SkipTo<')'>{} >> pure<std::optional<ScalarLogicalExpr>>())))
// Modifier for copyin, copyout, cache and create
TYPE_PARSER(construct<AccDataModifier>(
diff --git a/flang/test/Semantics/OpenACC/bug135810-1.f90 b/flang/test/Semantics/OpenACC/bug135810-1.f90
new file mode 100644
index 0000000000000..c40f4720b4f06
--- /dev/null
+++ b/flang/test/Semantics/OpenACC/bug135810-1.f90
@@ -0,0 +1,9 @@
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
+integer function square(x)
+ implicit none
+ integer, intent(in) :: x
+!ERROR: Must have LOGICAL type, but is INTEGER(4)
+ !$acc parallel self(x * 2)
+ !$acc end parallel
+ square = x * x
+end function square
diff --git a/flang/test/Semantics/OpenACC/bug135810-2.f90 b/flang/test/Semantics/OpenACC/bug135810-2.f90
new file mode 100644
index 0000000000000..8ed608b0b4cc9
--- /dev/null
+++ b/flang/test/Semantics/OpenACC/bug135810-2.f90
@@ -0,0 +1,12 @@
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
+integer function square(x)
+ implicit none
+ integer, intent(in) :: x
+!ERROR: logical expression or object list expected
+ !$acc parallel self(,)
+ !$acc end parallel
+!ERROR: logical expression or object list expected
+ !$acc parallel self(.true., )
+ !$acc end parallel
+ square = x * x
+end function square
>From 4825e9a7b7936a332d8004d93c8387fdf2434512 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Wed, 16 Apr 2025 08:34:48 -0700
Subject: [PATCH 2/2] more tests
---
flang/test/Semantics/OpenACC/bug135810-1.f90 | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/flang/test/Semantics/OpenACC/bug135810-1.f90 b/flang/test/Semantics/OpenACC/bug135810-1.f90
index c40f4720b4f06..a4e1bba174ce7 100644
--- a/flang/test/Semantics/OpenACC/bug135810-1.f90
+++ b/flang/test/Semantics/OpenACC/bug135810-1.f90
@@ -1,9 +1,14 @@
! RUN: %python %S/../test_errors.py %s %flang -fopenacc
-integer function square(x)
+integer function square(x, y)
implicit none
- integer, intent(in) :: x
+ integer, intent(in) :: x, y
+ !$acc parallel self(x * 2 > x) ! ok
+ !$acc end parallel
!ERROR: Must have LOGICAL type, but is INTEGER(4)
!$acc parallel self(x * 2)
!$acc end parallel
+!ERROR: SELF clause on the PARALLEL directive only accepts optional scalar logical expression
+ !$acc parallel self(x, y)
+ !$acc end parallel
square = x * x
end function square
More information about the flang-commits
mailing list