From 247bad1671a8229929a584ff0db788cf9e56e02a Mon Sep 17 00:00:00 2001 From: Jean Perier Date: Fri, 30 Jun 2023 20:26:59 +0200 Subject: [PATCH] [flang][hlfir] probe ultimate intrinsic module procedure name HLFIR lowering was currently hitting errors like "not yet implemented: intrinsic: z0$iso_c_binding$c_associated_c_ptr". These error were caused by HLFIR lowering using the name with the full context instead of the ultimate one. I do not want to change proc.GetName() because I think it may be best if it retains the full context for its usages in semantics, so I fixed the helper to get the name in lowering to HLFIR. Differential Revision: https://reviews.llvm.org/D154230 --- flang/lib/Lower/ConvertCall.cpp | 6 +++++- .../test/Lower/HLFIR/intrinsic-module-procedures.f90 | 11 +++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/flang/lib/Lower/ConvertCall.cpp b/flang/lib/Lower/ConvertCall.cpp index 46fc480bb1b5f..626d9ef0f706e 100644 --- a/flang/lib/Lower/ConvertCall.cpp +++ b/flang/lib/Lower/ConvertCall.cpp @@ -583,7 +583,11 @@ struct CallContext { fir::FirOpBuilder &getBuilder() { return converter.getFirOpBuilder(); } - std::string getProcedureName() const { return procRef.proc().GetName(); } + std::string getProcedureName() const { + if (const Fortran::semantics::Symbol *sym = procRef.proc().GetSymbol()) + return sym->GetUltimate().name().ToString(); + return procRef.proc().GetName(); + } /// Is this a call to an elemental procedure with at least one array argument? bool isElementalProcWithArrayArgs() const { diff --git a/flang/test/Lower/HLFIR/intrinsic-module-procedures.f90 b/flang/test/Lower/HLFIR/intrinsic-module-procedures.f90 index e7d8536871e55..6406d00bebb59 100644 --- a/flang/test/Lower/HLFIR/intrinsic-module-procedures.f90 +++ b/flang/test/Lower/HLFIR/intrinsic-module-procedures.f90 @@ -21,3 +21,14 @@ subroutine foo(cptr, x) ! CHECK: %[[VAL_8:.*]] = fir.box_addr %[[VAL_4]] : (!fir.box) -> !fir.ref ! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (!fir.ref) -> i64 ! CHECK: fir.store %[[VAL_9]] to %[[VAL_7]] : !fir.ref + +subroutine test_renaming(p) + use iso_c_binding, only: c_associated_alias => c_associated, c_ptr + type(c_ptr) p + print *, c_associated_alias(p) +end subroutine + +! CHECK-LABEL: func.func @_QPtest_renaming +! CHECK: %[[C_PTR_TARG:.*]] = fir.load %{{.*}} : !fir.ref +! CHECK: %[[NULL:.*]] = arith.constant 0 : i64 +! CHECK: arith.cmpi ne, %[[C_PTR_TARG]], %[[NULL]] : i64