[flang-commits] [flang] [Flang] Diagnose nonvariable STAT= specifiers (PR #219696)
via flang-commits
flang-commits at lists.llvm.org
Sat Aug 29 09:41:12 PDT 2026
https://github.com/keepyixiao created https://github.com/llvm/llvm-project/pull/219696
An image selector STAT= operand can be parsed as a variable but later resolve to a nonpointer function reference. Passing this expression to CoarrayRef::set_stat() violates its invariant and triggers a CHECK.
Verify that the analyzed STAT= expression is a variable before calling set_stat(), and emit a semantic error when it is not.
Add a regression test to resolve94.f90 covering an implicitly typed nonpointer function reference used as a STAT= specifier.
Fixes https://github.com/llvm/llvm-project/issues/208889
>From 9758415c4745adc763f145de8149b0f32c5b8e05 Mon Sep 17 00:00:00 2001
From: yixiao <yixiao at hygon.cn>
Date: Sun, 30 Aug 2026 00:33:15 +0800
Subject: [PATCH] [Flang] Diagnose nonvariable STAT= specifiers
An image selector STAT= operand can be parsed as a variable but later
resolve to a nonpointer function reference. Passing this expression to
CoarrayRef::set_stat() violates its invariant and triggers a CHECK.
Verify that the analyzed STAT= expression is a variable before calling
set_stat(), and emit a semantic error when it is not.
Add a regression test to resolve94.f90 covering an implicitly typed
nonpointer function reference used as a STAT= specifier.
---
flang/lib/Semantics/expression.cpp | 4 ++++
flang/test/Semantics/resolve94.f90 | 2 ++
2 files changed, 6 insertions(+)
diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp
index efbf862a72c51..b5a0b96a69599 100644
--- a/flang/lib/Semantics/expression.cpp
+++ b/flang/lib/Semantics/expression.cpp
@@ -1620,6 +1620,10 @@ MaybeExpr ExpressionAnalyzer::Analyze(const parser::CoindexedNamedObject &x) {
std::get_if<Expr<SomeInteger>>(&expr->u)}) {
if (coarrayRef.stat()) {
Say("coindexed reference has multiple STAT= specifiers"_err_en_US);
+ } else if (!IsVariable(*intExpr)) {
+ // A parser::Variable may resolve to a nonpointer
+ // function reference.
+ Say("STAT= specifier must be a scalar integer variable"_err_en_US);
} else {
coarrayRef.set_stat(Expr<SomeInteger>{*intExpr});
}
diff --git a/flang/test/Semantics/resolve94.f90 b/flang/test/Semantics/resolve94.f90
index 0c08d4cd0094f..4fe9e7190b143 100644
--- a/flang/test/Semantics/resolve94.f90
+++ b/flang/test/Semantics/resolve94.f90
@@ -47,6 +47,8 @@ subroutine s1()
rVar1 = rCoarray[1,2,3,STAT=rVar2]
!ERROR: Must be a scalar value, but is a rank-1 array
rVar1 = rCoarray[1,2,3,STAT=intArray]
+ !ERROR: STAT= specifier must be a scalar integer variable
+ rVar1 = rCoarray[1,2,3,STAT=MASK(2)]
! Error on C929, no specifier can appear more than once
!ERROR: coindexed reference has multiple STAT= specifiers
rVar1 = rCoarray[1,2,3,STAT=iVar1, STAT=iVar2]
More information about the flang-commits
mailing list