From c448eec8e2b55d20dde69020b639e5d2218820f5 Mon Sep 17 00:00:00 2001 From: agozillon Date: Wed, 12 Nov 2025 17:41:51 -0600 Subject: [PATCH] [Flang] Fix defaultmap(none) being overly aggressive with symbol checks Currently we're picking up and complaining about builtin symbols like Null() when defaultmap(none) is set, so I've relaxed the restriction a bit to allow for procedures and named constants to bypass the restriction. It might be the case that we want to tighten it up again in certain aspects in the future. --- flang/lib/Semantics/resolve-directives.cpp | 9 ++++- .../OpenMP/defaultmap-clause-none.f90 | 37 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index 224c69163b85e..71665355aed1a 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -3070,8 +3070,13 @@ void OmpAttributeVisitor::Post(const parser::Name &name) { // place for the types specified. if (Symbol * found{currScope().FindSymbol(name.source)}) { // If the variable has declare target applied to it (enter or link) it - // is exempt from defaultmap(none) restrictions - if (!symbol->GetUltimate().test(Symbol::Flag::OmpDeclareTarget)) { + // is exempt from defaultmap(none) restrictions. + // We also exempt procedures and named constants from defaultmap(none) + // checking. + if (!symbol->GetUltimate().test(Symbol::Flag::OmpDeclareTarget) && + !(IsProcedure(*symbol) && + !semantics::IsProcedurePointer(*symbol)) && + !IsNamedConstant(*symbol)) { auto &dMap = GetContext().defaultMap; for (auto defaults : dMap) { if (defaults.second == diff --git a/flang/test/Semantics/OpenMP/defaultmap-clause-none.f90 b/flang/test/Semantics/OpenMP/defaultmap-clause-none.f90 index 08e8ebc995097..0b74e3412e472 100644 --- a/flang/test/Semantics/OpenMP/defaultmap-clause-none.f90 +++ b/flang/test/Semantics/OpenMP/defaultmap-clause-none.f90 @@ -94,3 +94,40 @@ subroutine defaultmap_aggregate_none end do !$omp end target end subroutine defaultmap_aggregate_none + +! Verify we do not catch null in defaultmap(none) +subroutine defaultmap_builtin_none + implicit none + integer, pointer :: ptr(:) + + !$omp target defaultmap(none) map(ptr) +!CHECK-NOT: The DEFAULTMAP(NONE) clause requires that 'null' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause + ptr => null() + !$omp end target +end subroutine defaultmap_builtin_none + +module pro + implicit none +contains + + function test_procedure() result(ret) + integer :: ret + ret = 1 + end function test_procedure + +! Verify we do not catch a function symbol in defaultmap(none) +! but do catch procedure pointers +subroutine defaultmap_func_and_procedure_pointer() + implicit none + procedure(test_procedure), pointer :: f1 + integer :: i + + f1 => test_procedure + + !$omp target defaultmap(none) map(i) +!ERROR: The DEFAULTMAP(NONE) clause requires that 'f1' must be listed in a data-sharing attribute, data-mapping attribute, or is_device_ptr clause + i = f1() + i = test_procedure() + !$omp end target +end subroutine defaultmap_func_and_procedure_pointer +end module