From 28947b2cebfc7eba531437462f6da1c65677da23 Mon Sep 17 00:00:00 2001 From: Peter Klausler Date: Fri, 21 Nov 2025 10:24:58 -0800 Subject: [PATCH] [flang] Handle assumed-type dummy arguments in ExtractDataRef Assumed-type dummy argument symbols s are never packaged in DataRefs since the only way they can be used in Fortran is by forwarded as actual arguments to other calls. When an ActualArgument comprising a forwarded assumed-type dummy argument is presented to ExtractDataRef, it fails, because ExtractDataRef for ActualArgument only handles actual argument expressions (including variable references). Add support for actual arguments that are assumed-type dummy arguments. Fixes https://github.com/llvm/llvm-project/issues/168978. --- flang/lib/Evaluate/tools.cpp | 6 +++++- flang/test/Evaluate/bug168978.f90 | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 flang/test/Evaluate/bug168978.f90 diff --git a/flang/lib/Evaluate/tools.cpp b/flang/lib/Evaluate/tools.cpp index 117b2249a9179..a0035ae330e35 100644 --- a/flang/lib/Evaluate/tools.cpp +++ b/flang/lib/Evaluate/tools.cpp @@ -63,7 +63,11 @@ Expr Parenthesize(Expr &&expr) { std::optional ExtractDataRef( const ActualArgument &arg, bool intoSubstring, bool intoComplexPart) { - return ExtractDataRef(arg.UnwrapExpr(), intoSubstring, intoComplexPart); + if (const Symbol *assumedType{arg.GetAssumedTypeDummy()}) { + return DataRef{*assumedType}; + } else { + return ExtractDataRef(arg.UnwrapExpr(), intoSubstring, intoComplexPart); + } } std::optional ExtractSubstringBase(const Substring &substring) { diff --git a/flang/test/Evaluate/bug168978.f90 b/flang/test/Evaluate/bug168978.f90 new file mode 100644 index 0000000000000..ffe77500aeba5 --- /dev/null +++ b/flang/test/Evaluate/bug168978.f90 @@ -0,0 +1,6 @@ +!RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s +subroutine sub(dd) + type(*)::dd(..) + !CHECK: PRINT *, size(lbound(dd)) + print *, size(lbound(dd)) ! do not fold +end