diff options
author | Peter Klausler <pklausler@nvidia.com> | 2022-07-08 13:38:31 -0700 |
---|---|---|
committer | Peter Klausler <pklausler@nvidia.com> | 2022-07-13 14:56:50 -0700 |
commit | 62d874f203078896b4f059f7aa4f106e8cbab4da (patch) | |
tree | 46d5bcc1e3ee279f669320df24e2c773fdd67357 /flang/lib/Semantics/pointer-assignment.cpp | |
parent | 202b327f5d293a6f795a01933835b5ad53d8ed42 (diff) | |
download | llvm-62d874f203078896b4f059f7aa4f106e8cbab4da.zip llvm-62d874f203078896b4f059f7aa4f106e8cbab4da.tar.gz llvm-62d874f203078896b4f059f7aa4f106e8cbab4da.tar.bz2 |
[flang] Refine semantic checks for procedure pointer assignment
Some procedure pointers and EXTERNAL procedures have neither
explicit interfaces nor result types; these procedures are obviously
not known to be functions, but they could be, so semantics must not
assume that they are necessarily subroutines. Refine the procedure
pointer / dummy procedure compatibility check to handle these more
ambiguous cases and not elicit inappropriate error messages.
Differential Revision: https://reviews.llvm.org/D129674
Diffstat (limited to 'flang/lib/Semantics/pointer-assignment.cpp')
-rw-r--r-- | flang/lib/Semantics/pointer-assignment.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/flang/lib/Semantics/pointer-assignment.cpp b/flang/lib/Semantics/pointer-assignment.cpp index d55fa16..cfb5159 100644 --- a/flang/lib/Semantics/pointer-assignment.cpp +++ b/flang/lib/Semantics/pointer-assignment.cpp @@ -257,9 +257,10 @@ bool PointerAssignmentChecker::Check(const evaluate::Designator<T> &d) { // Common handling for procedure pointer right-hand sides bool PointerAssignmentChecker::Check( parser::CharBlock rhsName, bool isCall, const Procedure *rhsProcedure) { - if (std::optional<MessageFixedText> msg{ - evaluate::CheckProcCompatibility(isCall, procedure_, rhsProcedure)}) { - Say(std::move(*msg), description_, rhsName); + std::string whyNot; + if (std::optional<MessageFixedText> msg{evaluate::CheckProcCompatibility( + isCall, procedure_, rhsProcedure, whyNot)}) { + Say(std::move(*msg), description_, rhsName, whyNot); return false; } return true; |