[flang-commits] [flang] [flang] Allow polymorphic actual to implicit interface (PR #70873)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Tue Oct 31 16:32:24 PDT 2023
https://github.com/klausler created https://github.com/llvm/llvm-project/pull/70873
Semantics is emitting an error when an actual argument to a procedure that has an implicit interface has a polymorphic type. This is too general; while TYPE(*) and CLASS(*) unlimited polymorphic items require the presence of an explicit procedure interface, CLASS(T) data can be passed over an implicit interface to a procedure expecting a corresponding dummy argument with TYPE(T), so long as T is not parameterized.
(Making this work in the case of an actual CLASS(T) array may well require additional changes in lowering to copy data to/from a temporary buffer to ensure contiguity when the actual type of the array is an extension of T.)
>From a66830b9f3ac8346a7d3b98bee690599728e8866 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Tue, 31 Oct 2023 16:09:36 -0700
Subject: [PATCH] [flang] Allow polymorphic actual to implicit interface
Semantics is emitting an error when an actual argument to a
procedure that has an implicit interface has a polymorphic
type. This is too general; while TYPE(*) and CLASS(*)
unlimited polymorphic items require the presence of an explicit
procedure interface, CLASS(T) data can be passed over an
implicit interface to a procedure expecting a corresponding
dummy argument with TYPE(T), so long as T is not parameterized.
(Making this work in the case of an actual CLASS(T) array may
well require additional changes in lowering to copy data to/from
a temporary buffer to ensure contiguity when the actual type of
the array is an extension of T.)
---
flang/lib/Semantics/check-call.cpp | 8 ++++----
flang/test/Semantics/call13.f90 | 9 ++++-----
flang/test/Semantics/call40.f90 | 2 +-
flang/test/Semantics/label18.f90# | 18 ------------------
4 files changed, 9 insertions(+), 28 deletions(-)
delete mode 100644 flang/test/Semantics/label18.f90#
diff --git a/flang/lib/Semantics/check-call.cpp b/flang/lib/Semantics/check-call.cpp
index bf80dbecab009d9..cd1f66f471aba57 100644
--- a/flang/lib/Semantics/check-call.cpp
+++ b/flang/lib/Semantics/check-call.cpp
@@ -38,14 +38,14 @@ static void CheckImplicitInterfaceArg(evaluate::ActualArgument &arg,
if (auto type{arg.GetType()}) {
if (type->IsAssumedType()) {
messages.Say(
- "Assumed type argument requires an explicit interface"_err_en_US);
- } else if (type->IsPolymorphic()) {
+ "Assumed type actual argument requires an explicit interface"_err_en_US);
+ } else if (type->IsUnlimitedPolymorphic()) {
messages.Say(
- "Polymorphic argument requires an explicit interface"_err_en_US);
+ "Unlimited polymorphic actual argument requires an explicit interface"_err_en_US);
} else if (const DerivedTypeSpec * derived{GetDerivedTypeSpec(type)}) {
if (!derived->parameters().empty()) {
messages.Say(
- "Parameterized derived type argument requires an explicit interface"_err_en_US);
+ "Parameterized derived type actual argument requires an explicit interface"_err_en_US);
}
}
}
diff --git a/flang/test/Semantics/call13.f90 b/flang/test/Semantics/call13.f90
index a5ef1ca34a66d16..8b203e4b715d50b 100644
--- a/flang/test/Semantics/call13.f90
+++ b/flang/test/Semantics/call13.f90
@@ -24,13 +24,12 @@ subroutine s(assumedRank, coarray, class, classStar, typeStar)
call implicit11(assumedRank) ! 15.4.2.2(3)(c)
!ERROR: Coarray argument requires an explicit interface
call implicit12(coarray) ! 15.4.2.2(3)(d)
- !ERROR: Parameterized derived type argument requires an explicit interface
+ !ERROR: Parameterized derived type actual argument requires an explicit interface
call implicit13(pdtx) ! 15.4.2.2(3)(e)
- !ERROR: Polymorphic argument requires an explicit interface
- call implicit14(class) ! 15.4.2.2(3)(f)
- !ERROR: Polymorphic argument requires an explicit interface
+ call implicit14(class) ! ok
+ !ERROR: Unlimited polymorphic actual argument requires an explicit interface
call implicit15(classStar) ! 15.4.2.2(3)(f)
- !ERROR: Assumed type argument requires an explicit interface
+ !ERROR: Assumed type actual argument requires an explicit interface
call implicit16(typeStar) ! 15.4.2.2(3)(f)
!ERROR: TYPE(*) dummy argument may only be used as an actual argument
if (typeStar) then
diff --git a/flang/test/Semantics/call40.f90 b/flang/test/Semantics/call40.f90
index 492fcdd1256af52..c248be6937e21b3 100644
--- a/flang/test/Semantics/call40.f90
+++ b/flang/test/Semantics/call40.f90
@@ -16,7 +16,7 @@ subroutine val_errors(array, string, polymorphic, derived)
!ERROR: %VAL argument must be a scalar numerical or logical expression
call foo3(%val(derived))
!ERROR: %VAL argument must be a scalar numerical or logical expression
- !ERROR: Assumed type argument requires an explicit interface
+ !ERROR: Assumed type actual argument requires an explicit interface
call foo4(%val(polymorphic))
end subroutine
diff --git a/flang/test/Semantics/label18.f90# b/flang/test/Semantics/label18.f90#
deleted file mode 100644
index 47b2a61dbc4b5dc..000000000000000
--- a/flang/test/Semantics/label18.f90#
+++ /dev/null
@@ -1,18 +0,0 @@
-! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic
-program main
- if (.true.) then
- do j = 1, 2
- goto 1 ! ok; used to cause looping in label resolution
- end do
- else
- goto 1 ! ok
-1 end if
- if (.true.) then
- do j = 1, 2
- !WARNING: Label '1' is in a construct that should not be used as a branch target here
- goto 1
- end do
- end if
- !WARNING: Label '1' is in a construct that should not be used as a branch target here
- goto 1
-end
More information about the flang-commits
mailing list