From 08c364280a790cb2a80fff86beb5ea69782ce667 Mon Sep 17 00:00:00 2001 From: Peter Klausler Date: Mon, 27 Jan 2025 09:00:10 -0800 Subject: [PATCH] [flang] Improve error message on bad complex literal. (#124331) A complex literal constant can have one BOZ component, since the type and value of the literal can be determined by converting the BOZ value to the type of the other component. But a complex literal constant with two BOZ components doesn't have a well-defined type. The error message was confusing in the case; emit a better one. Fixes https://github.com/llvm/llvm-project/issues/124201. --- flang/lib/Evaluate/tools.cpp | 5 +++++ flang/test/Semantics/complex01.f90 | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/flang/lib/Evaluate/tools.cpp b/flang/lib/Evaluate/tools.cpp index 2d0e1996632f..16b026071909 100644 --- a/flang/lib/Evaluate/tools.cpp +++ b/flang/lib/Evaluate/tools.cpp @@ -212,6 +212,11 @@ ConvertRealOperandsResult ConvertRealOperands( return {AsSameKindExprs( ConvertTo(ry, std::move(bx)), std::move(ry))}; }, + [&](BOZLiteralConstant &&, + BOZLiteralConstant &&) -> ConvertRealOperandsResult { + messages.Say("operands cannot both be BOZ"_err_en_US); + return std::nullopt; + }, [&](auto &&, auto &&) -> ConvertRealOperandsResult { // C718 messages.Say( "operands must be INTEGER, UNSIGNED, REAL, or BOZ"_err_en_US); diff --git a/flang/test/Semantics/complex01.f90 b/flang/test/Semantics/complex01.f90 index c9d408ee0e11..d268eafa6858 100644 --- a/flang/test/Semantics/complex01.f90 +++ b/flang/test/Semantics/complex01.f90 @@ -1,5 +1,5 @@ ! RUN: %python %S/test_errors.py %s %flang_fc1 -! C718 Each named constant in a complex literal constant shall be of type +! C718 Each named constant in a complex literal constant shall be of type ! integer or real. subroutine s() integer :: ivar = 35 @@ -30,4 +30,6 @@ subroutine s() complex :: cvar11 = (cconst, 1.0) !ERROR: operands must be INTEGER, UNSIGNED, REAL, or BOZ complex :: cvar12 = (lconst, 1.0) + !ERROR: operands cannot both be BOZ + complex :: cvar13 = (z'3f700000', z'00000000') end subroutine s