[flang-commits] [flang] [flang] Reject PARAMETER constants in NAMELIST groups (PR #178960)

Miguel Saldivar via flang-commits flang-commits at lists.llvm.org
Fri Feb 27 16:01:19 PST 2026


https://github.com/Saldivarcher updated https://github.com/llvm/llvm-project/pull/178960

>From 3b654b6477ac34179557ae254bd46d52164acf22 Mon Sep 17 00:00:00 2001
From: Miguel Saldivar <miguel.saldivar at hpe.com>
Date: Fri, 30 Jan 2026 14:42:45 -0600
Subject: [PATCH] [flang] Reject PARAMETER constants in NAMELIST groups

The Fortran standard does not allow `PARAMETERS` within a
`namelist-group-object`, it should only allow variables.
An error should be emitted when a `PARAMETER` is found within a
`namelist-group-object`.
---
 flang/docs/Extensions.md                      | 12 ++++++++
 .../include/flang/Support/Fortran-features.h  |  2 +-
 flang/lib/Semantics/check-namelist.cpp        |  8 +++++
 flang/test/Semantics/namelist02.f90           | 29 +++++++++++++++++++
 4 files changed, 50 insertions(+), 1 deletion(-)
 create mode 100644 flang/test/Semantics/namelist02.f90

diff --git a/flang/docs/Extensions.md b/flang/docs/Extensions.md
index 028e3ea80623f..a997980ca18e7 100644
--- a/flang/docs/Extensions.md
+++ b/flang/docs/Extensions.md
@@ -484,6 +484,18 @@ end
 * A pointer component that has no default initialization or explicit value
   in a structure constructor is defaulted to `NULL()`.
 * An assumed-rank entity is an acceptable `NAMELIST` group item.
+* A named constant (`PARAMETER`) may appear as a `namelist-group-object` in a
+  `NAMELIST` statement.  The Fortran standard requires namelist group objects
+  to be variables, but this usage is accepted by Flang as an extension.
+  When `-pedantic` is enabled, Flang emits a warning for this case.
+  For example:
+```
+program p
+  implicit none
+  integer, parameter :: k = 3
+  namelist /g/ k
+end program
+```
 
 ### Extensions supported when enabled by options
 
diff --git a/flang/include/flang/Support/Fortran-features.h b/flang/include/flang/Support/Fortran-features.h
index e5cf915e9f78b..cbcb3592f04c3 100644
--- a/flang/include/flang/Support/Fortran-features.h
+++ b/flang/include/flang/Support/Fortran-features.h
@@ -82,7 +82,7 @@ ENUM_CLASS(UsageWarning, Portability, PointerToUndefinable,
     HostAssociatedIntentOutInSpecExpr, NonVolatilePointerToVolatile,
     RealConstantWidening, VolatileOrAsynchronousTemporary, UnusedVariable,
     UsedUndefinedVariable, BadValueInDeadCode, AssumedTypeSizeDummy,
-    MisplacedIgnoreTKR)
+    MisplacedIgnoreTKR, NamelistParameter)
 
 using LanguageFeatures = EnumSet<LanguageFeature, LanguageFeature_enumSize>;
 using UsageWarnings = EnumSet<UsageWarning, UsageWarning_enumSize>;
diff --git a/flang/lib/Semantics/check-namelist.cpp b/flang/lib/Semantics/check-namelist.cpp
index c2804c5d874e9..eedc1a66b563e 100644
--- a/flang/lib/Semantics/check-namelist.cpp
+++ b/flang/lib/Semantics/check-namelist.cpp
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "check-namelist.h"
+#include "flang/Semantics/tools.h"
 
 namespace Fortran::semantics {
 
@@ -28,6 +29,13 @@ void NamelistChecker::Leave(const parser::NamelistStmt &nmlStmt) {
                 "PUBLIC namelist"_err_en_US,
                 nmlObjSymbol->name());
           }
+          // `namelist-group-object` may only contain variables.
+          if (IsNamedConstant(*nmlObjSymbol)) {
+            context_.Warn(common::UsageWarning::NamelistParameter,
+                nmlObjName.source,
+                "A namelist group object '%s' should not be a PARAMETER"_port_en_US,
+                nmlObjSymbol->name());
+          }
         }
       }
     }
diff --git a/flang/test/Semantics/namelist02.f90 b/flang/test/Semantics/namelist02.f90
new file mode 100644
index 0000000000000..efe1f0204abd1
--- /dev/null
+++ b/flang/test/Semantics/namelist02.f90
@@ -0,0 +1,29 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic -Werror
+
+module m
+  implicit none
+  integer, parameter :: mc = 42
+end module
+
+! Local named constant
+program p
+  use m
+  implicit none
+  integer, parameter :: k = 3
+  !PORTABILITY: A namelist group object 'k' should not be a PARAMETER [-Wnamelist-parameter]
+  namelist /g/ k
+  ! USE-associated named constant
+  !PORTABILITY: A namelist group object 'mc' should not be a PARAMETER [-Wnamelist-parameter]
+  namelist /g2/ mc
+end program
+
+! Host-associated named constant
+subroutine host
+  implicit none
+  integer, parameter :: hc = 10
+  contains
+    subroutine inner
+      !PORTABILITY: A namelist group object 'hc' should not be a PARAMETER [-Wnamelist-parameter]
+      namelist /g3/ hc
+    end subroutine
+end subroutine



More information about the flang-commits mailing list