]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
compiler: use bool for comma-ok if not already boolean
authorIan Lance Taylor <iant@golang.org>
Fri, 24 Jun 2022 00:11:05 +0000 (17:11 -0700)
committerIan Lance Taylor <iant@golang.org>
Fri, 24 Jun 2022 18:24:57 +0000 (11:24 -0700)
If a comma-ok variable already has a type, and that type is not a
boolean type, then set the type of the temporary variable to bool.
Otherwise we may try to convert an unnamed bool type to an interface
type, which will fail. But we don't want to always use bool, because
the type of the comma-ok variable may be a named bool type, in
which case the assignment would fail (or need an explicit conversion).

The test case is https://go.dev/cl/404496.

Fixes golang/go#52535

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/413894

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/statements.cc

index f882812d219b1fbd89ef8190b5a66641d7e65ca4..e20212e990aa9a254579c98d460e7da4650642cb 100644 (file)
@@ -1,4 +1,4 @@
-6b314f7947b4b31a86c09d166fe6664cd9968824
+6a7ba754e5d98efe0875f1f41f40098e976e7958
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index b3db843365e1be40da9113332274a5e9dc773035..b442830b0b7109368691bb50a9a1c96af0c71e15 100644 (file)
@@ -1594,9 +1594,9 @@ Tuple_map_assignment_statement::do_lower(Gogo* gogo, Named_object*,
 
   // var present_temp bool
   Temporary_statement* present_temp =
-    Statement::make_temporary((this->present_->type()->is_sink_type())
-                             ? Type::make_boolean_type()
-                             : this->present_->type(),
+    Statement::make_temporary((this->present_->type()->is_boolean_type()
+                              ? this->present_->type()
+                              : Type::lookup_bool_type()),
                              NULL, loc);
   b->add_statement(present_temp);
 
@@ -1789,9 +1789,9 @@ Tuple_receive_assignment_statement::do_lower(Gogo*, Named_object*,
 
   // var closed_temp bool
   Temporary_statement* closed_temp =
-    Statement::make_temporary((this->closed_->type()->is_sink_type())
-                             ? Type::make_boolean_type()
-                             : this->closed_->type(),
+    Statement::make_temporary((this->closed_->type()->is_boolean_type()
+                              ? this->closed_->type()
+                              : Type::lookup_bool_type()),
                              NULL, loc);
   b->add_statement(closed_temp);
 
@@ -1965,6 +1965,8 @@ Tuple_type_guard_assignment_statement::do_lower(Gogo*, Named_object*,
       b->add_statement(s);
 
       res = Expression::make_call_result(call, 1);
+      if (!this->ok_->type()->is_boolean_type())
+       res = Expression::make_cast(Type::lookup_bool_type(), res, loc);
       s = Statement::make_assignment(this->ok_, res, loc);
       b->add_statement(s);
     }
@@ -2001,7 +2003,9 @@ Tuple_type_guard_assignment_statement::lower_to_object_type(
   Temporary_statement* ok_temp = NULL;
   if (!this->ok_->is_sink_expression())
     {
-      ok_temp = Statement::make_temporary(this->ok_->type(),
+      ok_temp = Statement::make_temporary((this->ok_->type()->is_boolean_type()
+                                          ? this->ok_->type()
+                                          : Type::lookup_bool_type()),
                                          NULL, loc);
       b->add_statement(ok_temp);
     }