diff --git a/flang/lib/Lower/OpenMP.cpp b/flang/lib/Lower/OpenMP.cpp --- a/flang/lib/Lower/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP.cpp @@ -35,7 +35,9 @@ absConv.getCurrentLocation()); break; case llvm::omp::Directive::OMPD_taskwait: - TODO(); + absConv.getFirOpBuilder().create( + absConv.getCurrentLocation()); + break; case llvm::omp::Directive::OMPD_taskyield: TODO(); case llvm::omp::Directive::OMPD_target_enter_data: diff --git a/flang/unittests/Lower/OpenMPLoweringTest.cpp b/flang/unittests/Lower/OpenMPLoweringTest.cpp --- a/flang/unittests/Lower/OpenMPLoweringTest.cpp +++ b/flang/unittests/Lower/OpenMPLoweringTest.cpp @@ -41,4 +41,19 @@ EXPECT_EQ(succeeded(barrierOp.verify()), true); } +TEST_F(OpenMPLoweringTest, TaskWait) { + // Construct a dummy parse tree node for `!OMP taskwait`. + struct Fortran::parser::OmpSimpleStandaloneDirective taskWaitDirective( + llvm::omp::Directive::OMPD_taskwait); + + // Check and lower the `!OMP taskwait` node to `TaskwaitOp` operation of + // OpenMPDialect. + EXPECT_EQ(taskWaitDirective.v, llvm::omp::Directive::OMPD_taskwait); + auto taskWaitOp = mlirOpBuilder->create( + mlirOpBuilder->getUnknownLoc()); + + EXPECT_EQ(taskWaitOp.getOperationName(), "omp.taskwait"); + EXPECT_EQ(succeeded(taskWaitOp.verify()), true); +} + // main() from gtest_main