Index: flang/lib/Semantics/expression.cpp =================================================================== --- flang/lib/Semantics/expression.cpp +++ flang/lib/Semantics/expression.cpp @@ -596,23 +596,24 @@ if (!kindParam) { return defaultKind; } - return common::visit( + std::int64_t kind{common::visit( common::visitors{ - [](std::uint64_t k) { return static_cast(k); }, + [](std::uint64_t k) { return static_cast(k); }, [&](const parser::Scalar< parser::Integer>> &n) { if (MaybeExpr ie{Analyze(n)}) { - if (std::optional i64{ToInt64(*ie)}) { - int iv = *i64; - if (iv == *i64) { - return iv; - } - } + return ToInt64(*ie).value_or(defaultKind); } - return defaultKind; + return static_cast(defaultKind); }, }, - kindParam->u); + kindParam->u)}; + if (kind != static_cast(kind)) { + Say("Unsupported type kind value (%jd)"_err_en_US, + static_cast(kind)); + kind = defaultKind; + } + return static_cast(kind); } // Common handling of parser::IntLiteralConstant and SignedIntLiteralConstant @@ -657,7 +658,7 @@ } ExpressionAnalyzer &analyzer; parser::CharBlock digits; - int kind; + std::int64_t kind; bool isDefaultKind; bool isNegated; }; Index: flang/test/Semantics/kinds02.f90 =================================================================== --- flang/test/Semantics/kinds02.f90 +++ flang/test/Semantics/kinds02.f90 @@ -82,6 +82,8 @@ character(len=*), parameter :: cvar10 = 4_"abcd" !ERROR: CHARACTER(KIND=8) is not a supported type character(len=*), parameter :: cvar11 = 8_"abcd" +!ERROR: Unsupported type kind value (5000000000) +print *, 123_5000000000 end program subroutine s(a, b)