[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:
@@ -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)};
|
||||
|
||||
10
flang/test/Semantics/OpenMP/reduction13.f90
Normal file
10
flang/test/Semantics/OpenMP/reduction13.f90
Normal 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
|
||||
Reference in New Issue
Block a user