aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Semantics/pointer-assignment.cpp
diff options
context:
space:
mode:
authorPeter Klausler <pklausler@nvidia.com>2022-07-08 13:38:31 -0700
committerPeter Klausler <pklausler@nvidia.com>2022-07-13 14:56:50 -0700
commit62d874f203078896b4f059f7aa4f106e8cbab4da (patch)
tree46d5bcc1e3ee279f669320df24e2c773fdd67357 /flang/lib/Semantics/pointer-assignment.cpp
parent202b327f5d293a6f795a01933835b5ad53d8ed42 (diff)
downloadllvm-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.cpp7
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;