[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