Index: flang/lib/Semantics/check-omp-structure.cpp =================================================================== --- flang/lib/Semantics/check-omp-structure.cpp +++ flang/lib/Semantics/check-omp-structure.cpp @@ -931,7 +931,7 @@ // 3. Checks on clauses which are not in 'struct OmpClause' from parse-tree.h. void OmpStructureChecker::Leave(const parser::OmpClauseList &) { - // 2.7 Loop Construct Restriction + // 2.7.1 Loop Construct Restriction if (llvm::omp::doSet.test(GetContext().directive)) { if (auto *clause{FindClause(llvm::omp::Clause::OMPC_schedule)}) { // only one schedule clause is allowed @@ -1028,6 +1028,17 @@ llvm::omp::Clause::OMPC_copyprivate, {llvm::omp::Clause::OMPC_nowait}); } + // 2.9.3 Taskloop Simd Construct Restriction + if (GetContext().directive == llvm::omp::Directive::OMPD_taskloop_simd) { + if (auto *clause{FindClause(llvm::omp::Clause::OMPC_reduction)}) { + context_.Say(clause->source, + "%s clause is not allowed on the %s directive"_err_en_US, + parser::ToUpperCaseLetters(getClauseName( + llvm::omp::Clause::OMPC_reduction).str()), + parser::ToUpperCaseLetters(GetContext().directiveSource.ToString())); + } + } + CheckRequireAtLeastOneOf(); } Index: flang/test/Semantics/omp-clause-validity01.f90 =================================================================== --- flang/test/Semantics/omp-clause-validity01.f90 +++ flang/test/Semantics/omp-clause-validity01.f90 @@ -7,8 +7,6 @@ ! 2.7.1 Loop construct ! ... -! TODO: all the internal errors - integer :: b = 128 integer :: z, c = 32 integer, parameter :: num = 16 @@ -87,7 +85,7 @@ do i = 1, N z = 2 enddo - !$omp end target data + !$omp end target data !ERROR: SCHEDULE clause is not allowed on the PARALLEL directive !$omp parallel schedule(static) @@ -177,7 +175,7 @@ exit outofparallel end do inner end do outer - !$end omp do + !$omp end do !$omp end parallel end do outofparallel @@ -545,6 +543,7 @@ enddo !$omp end taskloop simd + !ERROR: Unexpected clause specified for !$OMP taskloop simd !$omp taskloop simd reduction(+:a) do i = 1, N a = a + 3.14 Index: flang/test/Semantics/omp-taskloop-simd01.f90 =================================================================== --- flang/test/Semantics/omp-taskloop-simd01.f90 +++ flang/test/Semantics/omp-taskloop-simd01.f90 @@ -1,5 +1,5 @@ ! RUN: %S/test_errors.sh %s %t %flang -fopenmp -! XFAIL: * +! REQUIRES: shell ! OpenMP Version 4.5 ! 2.9.3 taskloop simd Construct