-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[flang] Improve error message on bad complex literal. #124331
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
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 llvm#124201.
@llvm/pr-subscribers-flang-semantics Author: Peter Klausler (klausler) ChangesA 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 #124201. Full diff: https://github.com/llvm/llvm-project/pull/124331.diff 2 Files Affected:
diff --git a/flang/lib/Evaluate/tools.cpp b/flang/lib/Evaluate/tools.cpp
index 2d0e1996632fc2..16b02607190973 100644
--- a/flang/lib/Evaluate/tools.cpp
+++ b/flang/lib/Evaluate/tools.cpp
@@ -212,6 +212,11 @@ ConvertRealOperandsResult ConvertRealOperands(
return {AsSameKindExprs<TypeCategory::Real>(
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 c9d408ee0e111f..d268eafa685896 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
|
@@ -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') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there already a test for creating COMPLEX from one BOZ component?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't know.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM.
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 #124201.