[flang-commits] [flang] [flang][Semantics] Avoid crash when pointer init follows PARAMETER with same name (PR #211604)
via flang-commits
flang-commits at lists.llvm.org
Thu Jul 23 19:00:15 PDT 2026
https://github.com/shivaramaarao updated https://github.com/llvm/llvm-project/pull/211604
>From 297b80c48f2e197faf2bd5dd36113d7216f34494 Mon Sep 17 00:00:00 2001
From: Shivarama Rao <shivarama.rao at amd.com>
Date: Thu, 23 Jul 2026 21:39:40 +0530
Subject: [PATCH] [flang][Semantics] Avoid crash when pointer init follows
PARAMETER on same name
Replace CHECK(!details->init()) in pointer initialization with a proper diagnostic
message when a symbol was already initialized as a named constant.
fixes issue #209980
---
flang/lib/Semantics/resolve-names.cpp | 39 ++++++++++++++++++---------
flang/test/Semantics/pointer03.f90 | 7 +++++
2 files changed, 34 insertions(+), 12 deletions(-)
create mode 100644 flang/test/Semantics/pointer03.f90
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 996c05d0e193b..f51c6879695ec 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -9757,12 +9757,20 @@ void DeclarationVisitor::Initialization(const parser::Name &name,
"Pointer initializer must be intrinsic NULL()"_err_en_US);
} else if (IsPointer(ultimate)) {
if (auto *object{ultimate.detailsIf<ObjectEntityDetails>()}) {
- CHECK(!object->init());
- object->set_init(std::move(*nullInit));
+ if (object->init()) {
+ Say(name, "'%s' was previously initialized"_err_en_US);
+ context().SetError(ultimate);
+ } else {
+ object->set_init(std::move(*nullInit));
+ }
} else if (auto *procPtr{
ultimate.detailsIf<ProcEntityDetails>()}) {
- CHECK(!procPtr->init());
- procPtr->set_init(nullptr);
+ if (procPtr->init()) {
+ Say(name, "'%s' was previously initialized"_err_en_US);
+ context().SetError(ultimate);
+ } else {
+ procPtr->set_init(nullptr);
+ }
}
} else {
Say(name,
@@ -9796,18 +9804,25 @@ void DeclarationVisitor::PointerInitialization(
if (MaybeExpr expr{EvaluateExpr(target)}) {
// Validation is done in declaration checking.
if (auto *details{ultimate.detailsIf<ObjectEntityDetails>()}) {
- CHECK(!details->init());
- details->set_init(std::move(*expr));
- ultimate.set(Symbol::Flag::InDataStmt, false);
+ if (details->init()) {
+ Say(name, "'%s' was previously initialized"_err_en_US);
+ context().SetError(ultimate);
+ } else {
+ details->set_init(std::move(*expr));
+ ultimate.set(Symbol::Flag::InDataStmt, false);
+ }
} else if (auto *details{ultimate.detailsIf<ProcEntityDetails>()}) {
// something like "REAL, EXTERNAL, POINTER :: p => t"
- if (evaluate::IsNullProcedurePointer(&*expr)) {
- CHECK(!details->init());
+ if (details->init()) {
+ Say(name, "'%s' was previously initialized"_err_en_US);
+ context().SetError(ultimate);
+ } else if (evaluate::IsNullProcedurePointer(&*expr)) {
details->set_init(nullptr);
- } else if (const Symbol *
- targetSymbol{evaluate::UnwrapWholeSymbolDataRef(*expr)}) {
- CHECK(!details->init());
+ ultimate.set(Symbol::Flag::InDataStmt, false);
+ } else if (const Symbol *targetSymbol{
+ evaluate::UnwrapWholeSymbolDataRef(*expr)}) {
details->set_init(*targetSymbol);
+ ultimate.set(Symbol::Flag::InDataStmt, false);
} else {
Say(name,
"Procedure pointer '%s' must be initialized with a procedure name or NULL()"_err_en_US);
diff --git a/flang/test/Semantics/pointer03.f90 b/flang/test/Semantics/pointer03.f90
new file mode 100644
index 0000000000000..f4e2b0933206f
--- /dev/null
+++ b/flang/test/Semantics/pointer03.f90
@@ -0,0 +1,7 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+module m
+ integer :: t
+ parameter(i=1)
+ !ERROR: 'i' was previously initialized
+ integer, pointer :: i => t
+end module
More information about the flang-commits
mailing list