From 40d9096fda65dc94fc1b10c091802dcb8f3ab3a5 Mon Sep 17 00:00:00 2001 From: Peter Klausler Date: Mon, 10 Mar 2025 13:20:35 -0700 Subject: [PATCH] [flang] Enforce C15104(5) for coindexed values (#130203) A object's value can't be copied from another image by means of an intrinsic assignment statement if it has a derived type that contains a pointer subobject ultimate component. --- flang/lib/Semantics/assignment.cpp | 14 ++++++++++---- flang/test/Semantics/call12.f90 | 7 +++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/flang/lib/Semantics/assignment.cpp b/flang/lib/Semantics/assignment.cpp index 8de20d3126a6..935f5a03bdb6 100644 --- a/flang/lib/Semantics/assignment.cpp +++ b/flang/lib/Semantics/assignment.cpp @@ -134,10 +134,16 @@ static std::optional GetPointerComponentDesignatorName( // Checks C1594(5,6); false if check fails bool CheckCopyabilityInPureScope(parser::ContextualMessages &messages, const SomeExpr &expr, const Scope &scope) { - if (const Symbol * base{GetFirstSymbol(expr)}) { - if (const char *why{ - WhyBaseObjectIsSuspicious(base->GetUltimate(), scope)}) { - if (auto pointer{GetPointerComponentDesignatorName(expr)}) { + if (auto pointer{GetPointerComponentDesignatorName(expr)}) { + if (const Symbol * base{GetFirstSymbol(expr)}) { + const char *why{WhyBaseObjectIsSuspicious(base->GetUltimate(), scope)}; + if (!why) { + if (auto coarray{evaluate::ExtractCoarrayRef(expr)}) { + base = &coarray->GetLastSymbol(); + why = "coindexed"; + } + } + if (why) { evaluate::SayWithDeclaration(messages, *base, "A pure subprogram may not copy the value of '%s' because it is %s" " and has the POINTER potential subobject component '%s'"_err_en_US, diff --git a/flang/test/Semantics/call12.f90 b/flang/test/Semantics/call12.f90 index cd4006a53b3e..e7c0fd8b9b8c 100644 --- a/flang/test/Semantics/call12.f90 +++ b/flang/test/Semantics/call12.f90 @@ -104,4 +104,11 @@ module m localhp = hasPtr(z%a) end subroutine end function + pure subroutine test2(hpd, hhpd) + use used + type(hasHiddenPtr), intent(in out) :: hpd, hhpd[*] + hpd = hhpd ! ok + !ERROR: A pure subprogram may not copy the value of 'hhpd' because it is coindexed and has the POINTER potential subobject component '%a%p' + hpd = hhpd[1] + end subroutine end module