diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp index 5e3a5725c18d..54ce45157537 100644 --- a/flang/lib/Semantics/check-omp-structure.cpp +++ b/flang/lib/Semantics/check-omp-structure.cpp @@ -2321,9 +2321,15 @@ bool OmpStructureChecker::CheckReductionOperators( common::visit( common::visitors{ [&](const parser::DefinedOperator &dOpr) { - const auto &intrinsicOp{ - std::get(dOpr.u)}; - ok = CheckIntrinsicOperator(intrinsicOp); + if (const auto *intrinsicOp{ + std::get_if( + &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(&procD.u)}; diff --git a/flang/test/Semantics/OpenMP/reduction13.f90 b/flang/test/Semantics/OpenMP/reduction13.f90 new file mode 100644 index 000000000000..edb153ce20ef --- /dev/null +++ b/flang/test/Semantics/OpenMP/reduction13.f90 @@ -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