[flang][Semantics][OpenMP] Fix ICE for unknown reduction starting with . (#94398)

In this case the union inside of the `parser::DefinedOperator` contains
a string name instead of the expected
`parser::DefinedOperator::IntrinsicOperator`. This led to a
`std::abort`.

This patch adapts the code so that if it contains a string name we emit
a semantic error.
This commit is contained in:
Tom Eccles
2024-06-05 11:26:34 +01:00
committed by GitHub
parent 05e1b5340b
commit 2c31bc7c04
2 changed files with 19 additions and 3 deletions

View File

@@ -2321,9 +2321,15 @@ bool OmpStructureChecker::CheckReductionOperators(
common::visit(
common::visitors{
[&](const parser::DefinedOperator &dOpr) {
const auto &intrinsicOp{
std::get<parser::DefinedOperator::IntrinsicOperator>(dOpr.u)};
ok = CheckIntrinsicOperator(intrinsicOp);
if (const auto *intrinsicOp{
std::get_if<parser::DefinedOperator::IntrinsicOperator>(
&dOpr.u)}) {
ok = CheckIntrinsicOperator(*intrinsicOp);
} else {
context_.Say(GetContext().clauseSource,
"Invalid reduction operator in REDUCTION clause."_err_en_US,
ContextDirectiveAsFortran());
}
},
[&](const parser::ProcedureDesignator &procD) {
const parser::Name *name{std::get_if<parser::Name>(&procD.u)};

View File

@@ -0,0 +1,10 @@
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 4.5
! 2.15.3.6 Reduction Clause
program omp_reduction
integer :: k
! misspelling. Should be "min"
!ERROR: Invalid reduction operator in REDUCTION clause.
!$omp parallel reduction(.min.:k)
!$omp end parallel
end program omp_reduction