From a72e670bd177c7f84cabd3d7b07d50cdce2842c7 Mon Sep 17 00:00:00 2001 From: Kiran Chandramohan Date: Tue, 26 Nov 2024 12:27:52 +0000 Subject: [PATCH] [Flang][OpenMP] Fix a crash for declare target in an interface This is a point fix for the crash in #116426. --- flang/lib/Lower/OpenMP/OpenMP.cpp | 16 +++++++++------- .../Lower/OpenMP/declare-target-interface.f90 | 11 +++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 flang/test/Lower/OpenMP/declare-target-interface.f90 diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index a2779213a1a15..7afb7edc82210 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -487,13 +487,15 @@ static void getDeclareTargetInfo( } else if (const auto *clauseList{ parser::Unwrap(spec.u)}) { List clauses = makeClauses(*clauseList, semaCtx); - if (clauses.empty() && - (!eval.getOwningProcedure()->isMainProgram() || - eval.getOwningProcedure()->getMainProgramSymbol())) { - // Case: declare target, implicit capture of function - symbolAndClause.emplace_back( - mlir::omp::DeclareTargetCaptureClause::to, - eval.getOwningProcedure()->getSubprogramSymbol()); + if (clauses.empty()) { + Fortran::lower::pft::FunctionLikeUnit *owningProc = + eval.getOwningProcedure(); + if (owningProc && (!owningProc->isMainProgram() || + owningProc->getMainProgramSymbol())) { + // Case: declare target, implicit capture of function + symbolAndClause.emplace_back(mlir::omp::DeclareTargetCaptureClause::to, + owningProc->getSubprogramSymbol()); + } } ClauseProcessor cp(converter, semaCtx, clauses); diff --git a/flang/test/Lower/OpenMP/declare-target-interface.f90 b/flang/test/Lower/OpenMP/declare-target-interface.f90 new file mode 100644 index 0000000000000..e92d1905c7ad0 --- /dev/null +++ b/flang/test/Lower/OpenMP/declare-target-interface.f90 @@ -0,0 +1,11 @@ +!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s +!RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-is-device %s -o - | FileCheck %s + +!CHECK: module attributes +module iface +interface + subroutine a() + !$omp declare target + end subroutine +end interface +end module