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::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( - &proc.dummyArguments[j].u) - : nullptr}; - dataDummy && + const auto *dataDummy{j < proc.dummyArguments.size() + ? std::get_if( + &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