[flang-commits] [flang] 823094e - [flang][semantics] fix IsConstantExpr for intrinsic with optional argument (#161915)

via flang-commits flang-commits at lists.llvm.org
Sat Oct 4 00:55:18 PDT 2025


Author: Andre Kuhlenschmidt
Date: 2025-10-04T00:55:14-07:00
New Revision: 823094e407d74ce1b2a805bbfa4a9cfaf743d23c

URL: https://github.com/llvm/llvm-project/commit/823094e407d74ce1b2a805bbfa4a9cfaf743d23c
DIFF: https://github.com/llvm/llvm-project/commit/823094e407d74ce1b2a805bbfa4a9cfaf743d23c.diff

LOG: [flang][semantics] fix IsConstantExpr for intrinsic with optional argument (#161915)

fixes https://github.com/llvm/llvm-project/issues/161694

Exposes that some sequences of duplicate messages are being printed,
which is fixed in https://github.com/llvm/llvm-project/pull/161916 .

Added: 
    flang/test/Semantics/type-parameter-constant.f90

Modified: 
    flang/lib/Evaluate/check-expression.cpp
    flang/test/Semantics/intrinsics03.f90
    flang/test/Semantics/intrinsics04.f90

Removed: 
    


################################################################################
diff  --git a/flang/lib/Evaluate/check-expression.cpp b/flang/lib/Evaluate/check-expression.cpp
index 8931cbe485ac2..647eebaaa070b 100644
--- a/flang/lib/Evaluate/check-expression.cpp
+++ b/flang/lib/Evaluate/check-expression.cpp
@@ -135,16 +135,22 @@ bool IsConstantExprHelper<INVARIANT>::operator()(
     } else if (proc.IsPure()) {
       std::size_t j{0};
       for (const auto &arg : call.arguments()) {
-        if (const auto *dataDummy{j < proc.dummyArguments.size()
-                    ? std::get_if<characteristics::DummyDataObject>(
-                          &proc.dummyArguments[j].u)
-                    : nullptr};
-            dataDummy &&
+        const auto *dataDummy{j < proc.dummyArguments.size()
+                ? std::get_if<characteristics::DummyDataObject>(
+                      &proc.dummyArguments[j].u)
+                : nullptr};
+        if (dataDummy &&
             dataDummy->attrs.test(
                 characteristics::DummyDataObject::Attr::OnlyIntrinsicInquiry)) {
           // The value of the argument doesn't matter
         } else if (!arg) {
-          return false;
+          if (dataDummy &&
+              dataDummy->attrs.test(
+                  characteristics::DummyDataObject::Attr::Optional)) {
+            // Missing optional arguments are okay.
+          } else {
+            return false;
+          }
         } else if (const auto *expr{arg->UnwrapExpr()};
             !expr || !(*this)(*expr)) {
           return false;

diff  --git a/flang/test/Semantics/intrinsics03.f90 b/flang/test/Semantics/intrinsics03.f90
index a5b13b655cf41..1a4269868a3d4 100644
--- a/flang/test/Semantics/intrinsics03.f90
+++ b/flang/test/Semantics/intrinsics03.f90
@@ -129,6 +129,6 @@ subroutine ichar_tests()
   !Without -Wportability, the warning isn't emitted and the parameter is constant.
   integer, parameter :: a2 = ichar('B ')
   !ERROR: Character in intrinsic function ichar must have length one
-  !ERROR: Must be a constant value
+  !ERROR: Value of named constant 'a3' (ichar("")) cannot be computed as a constant value
   integer, parameter :: a3 = ichar('')
 end subroutine

diff  --git a/flang/test/Semantics/intrinsics04.f90 b/flang/test/Semantics/intrinsics04.f90
index abb8fe321a572..e733067237d17 100644
--- a/flang/test/Semantics/intrinsics04.f90
+++ b/flang/test/Semantics/intrinsics04.f90
@@ -29,6 +29,6 @@ subroutine ichar_tests()
   !WARNING: Character in intrinsic function ichar should have length one [-Wportability]
   integer, parameter :: a2 = ichar('B ')
   !ERROR: Character in intrinsic function ichar must have length one
-  !ERROR: Must be a constant value
+  !ERROR: Value of named constant 'a3' (ichar("")) cannot be computed as a constant value
   integer, parameter :: a3 = ichar('')
 end subroutine

diff  --git a/flang/test/Semantics/type-parameter-constant.f90 b/flang/test/Semantics/type-parameter-constant.f90
new file mode 100644
index 0000000000000..376bffd0233ff
--- /dev/null
+++ b/flang/test/Semantics/type-parameter-constant.f90
@@ -0,0 +1,15 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+type A (p, r)
+  integer, kind :: p, r
+  !ERROR: KIND parameter expression (int(selected_real_kind(six,twenty_three),kind=8)) of intrinsic type REAL did not resolve to a constant value
+  real (selected_real_kind(p, r)) :: data
+end type
+   integer :: six = 6, twenty_three = 23
+   type(a(6,23)) :: a1
+   !ERROR: Value of KIND type parameter 'p' must be constant
+   !ERROR: Value of KIND type parameter 'r' must be constant
+   !WARNING: specification expression refers to local object 'six' (initialized and saved) [-Wsaved-local-in-spec-expr]
+   !WARNING: specification expression refers to local object 'twenty_three' (initialized and saved) [-Wsaved-local-in-spec-expr]
+   type(a(six, twenty_three)) :: a2 
+   print *, a1%data%kind
+end
\ No newline at end of file


        


More information about the flang-commits mailing list