From 7ac56a2a1b3621a0c5adbbb311a13c2552702919 Mon Sep 17 00:00:00 2001 From: Peter Klausler Date: Tue, 15 Apr 2025 16:41:52 -0700 Subject: [PATCH] [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 | 14 ++++++++++++++ flang/test/Semantics/OpenACC/bug135810-2.f90 | 12 ++++++++++++ 3 files changed, 33 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( // 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(Parser{}) || - construct(scalarLogicalExpr)) +TYPE_PARSER( + construct(Parser{}) / lookAhead(")"_tok) || + construct(scalarLogicalExpr / lookAhead(")"_tok)) || + construct( + recovery(fail>( + "logical expression or object list expected"_err_en_US), + SkipTo<')'>{} >> pure>()))) // Modifier for copyin, copyout, cache and create TYPE_PARSER(construct( diff --git a/flang/test/Semantics/OpenACC/bug135810-1.f90 b/flang/test/Semantics/OpenACC/bug135810-1.f90 new file mode 100644 index 0000000000000..a4e1bba174ce7 --- /dev/null +++ b/flang/test/Semantics/OpenACC/bug135810-1.f90 @@ -0,0 +1,14 @@ +! RUN: %python %S/../test_errors.py %s %flang -fopenacc +integer function square(x, y) + implicit none + 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 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