aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Semantics/pointer-assignment.cpp
diff options
context:
space:
mode:
authorPeter Klausler <pklausler@nvidia.com>2022-10-24 16:59:55 -0700
committerPeter Klausler <pklausler@nvidia.com>2022-10-30 17:54:22 -0700
commitbd28a0a51181ad33dc9030fb887d26cd6b238c1f (patch)
treec3554d66d87dc3750f6134e9b8678df743f4fd12 /flang/lib/Semantics/pointer-assignment.cpp
parentdbfa4a0aa561809db4376103278fa8e824d91a6c (diff)
downloadllvm-bd28a0a51181ad33dc9030fb887d26cd6b238c1f.zip
llvm-bd28a0a51181ad33dc9030fb887d26cd6b238c1f.tar.gz
llvm-bd28a0a51181ad33dc9030fb887d26cd6b238c1f.tar.bz2
[flang] Catch attempts to do anything with statement functions other than call them
A statement function in Fortran may be called, but it may not be the target of a procedure pointer or passed as an actual argument.
Diffstat (limited to 'flang/lib/Semantics/pointer-assignment.cpp')
-rw-r--r--flang/lib/Semantics/pointer-assignment.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/flang/lib/Semantics/pointer-assignment.cpp b/flang/lib/Semantics/pointer-assignment.cpp
index 69e80e5..54e36f5 100644
--- a/flang/lib/Semantics/pointer-assignment.cpp
+++ b/flang/lib/Semantics/pointer-assignment.cpp
@@ -279,6 +279,17 @@ bool PointerAssignmentChecker::Check(parser::CharBlock rhsName, bool isCall,
}
bool PointerAssignmentChecker::Check(const evaluate::ProcedureDesignator &d) {
+ if (const Symbol * symbol{d.GetSymbol()}) {
+ if (const auto *subp{
+ symbol->GetUltimate().detailsIf<SubprogramDetails>()}) {
+ if (subp->stmtFunction()) {
+ evaluate::SayWithDeclaration(context_.messages(), *symbol,
+ "Statement function '%s' may not be the target of a pointer assignment"_err_en_US,
+ symbol->name());
+ return false;
+ }
+ }
+ }
if (auto chars{Procedure::Characterize(d, context_)}) {
return Check(d.GetName(), false, &*chars, d.GetSpecificIntrinsic());
} else {