[flang-commits] [PATCH] D125115: [flang] Refine handling of short character actual arguments
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Fri May 6 11:47:02 PDT 2022
klausler created this revision.
klausler added a reviewer: jeanPerier.
klausler added a project: Flang.
Herald added a subscriber: jdoerfert.
Herald added a project: All.
klausler requested review of this revision.
Actual arguments whose lengths are less than the expected length
of their corresponding dummy argument are errors; but this needs
to be refined. Short actual arguments that are variables remain
errors, but those that are expressions can be (again) extended on
the right with blanks.
https://reviews.llvm.org/D125115
Files:
flang/lib/Semantics/check-call.cpp
flang/test/Semantics/call03.f90
Index: flang/test/Semantics/call03.f90
===================================================================
--- flang/test/Semantics/call03.f90
+++ flang/test/Semantics/call03.f90
@@ -121,7 +121,7 @@
end subroutine
subroutine ch2(x)
- character(2), intent(in out) :: x
+ character(2), intent(in) :: x
end subroutine
subroutine pdtdefault (derivedArg)
!ERROR: Type parameter 'n' lacks a value and has no default
@@ -151,8 +151,10 @@
type(pdtWithDefault(3)) :: defaultVar3
type(pdtWithDefault(4)) :: defaultVar4
character :: ch1
- !ERROR: Actual length '1' is less than expected length '2'
+ !ERROR: Actual argument variable length '1' is less than expected length '2'
call ch2(ch1)
+ !WARN: Actual argument expression length '0' is less than expected length '2'
+ call ch2("")
call pdtdefault(vardefault)
call pdtdefault(var3)
call pdtdefault(var4) ! error
Index: flang/lib/Semantics/check-call.cpp
===================================================================
--- flang/lib/Semantics/check-call.cpp
+++ flang/lib/Semantics/check-call.cpp
@@ -89,8 +89,9 @@
}
}
-// When scalar CHARACTER actual arguments are known to be short,
-// we extend them on the right with spaces and a warning.
+// When a scalar CHARACTER actual argument is known to be short,
+// we extend it on the right with spaces and a warning if it is an
+// expression, and emit an error if it is a variable.
static void CheckCharacterActual(evaluate::Expr<evaluate::SomeType> &actual,
const characteristics::TypeAndShape &dummyType,
characteristics::TypeAndShape &actualType,
@@ -104,15 +105,19 @@
auto actualLength{
ToInt64(Fold(context, common::Clone(*actualType.LEN())))};
if (dummyLength && actualLength && *actualLength < *dummyLength) {
- messages.Say(
- "Actual length '%jd' is less than expected length '%jd'"_err_en_US,
- *actualLength, *dummyLength);
-#if 0 // We used to just emit a warning, and padded the actual argument
- auto converted{ConvertToType(dummyType.type(), std::move(actual))};
- CHECK(converted);
- actual = std::move(*converted);
- actualType.set_LEN(SubscriptIntExpr{*dummyLength});
-#endif
+ if (evaluate::IsVariable(actual)) {
+ messages.Say(
+ "Actual argument variable length '%jd' is less than expected length '%jd'"_err_en_US,
+ *actualLength, *dummyLength);
+ } else {
+ messages.Say(
+ "Actual argument expression length '%jd' is less than expected length '%jd'"_warn_en_US,
+ *actualLength, *dummyLength);
+ auto converted{ConvertToType(dummyType.type(), std::move(actual))};
+ CHECK(converted);
+ actual = std::move(*converted);
+ actualType.set_LEN(SubscriptIntExpr{*dummyLength});
+ }
}
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D125115.427699.patch
Type: text/x-patch
Size: 2916 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20220506/ea6472fa/attachment-0001.bin>
More information about the flang-commits
mailing list