compiler: add break label in 1,2-case select statement lowering
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 10 Jul 2019 17:56:40 +0000 (17:56 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 10 Jul 2019 17:56:40 +0000 (17:56 +0000)
    CL 184998 added optimizations for one- and two-case select
    statements. But it didn't handle break statement in the select
    case correctly. Specifically, it didn't add the label definition,
    so it could result in a dangling goto. This CL fixes this, by
    adding the label definition.

    A test case is CL 185520.

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

From-SVN: r273359

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

index 410afb0bab17b9da54461b6049c7699891fa854b..582ded36f3e09052011740dd4e24f110c40f1809 100644 (file)
@@ -1,4 +1,4 @@
-7a8e10be0ddb8909ce25a264d03b24cee4df60cc
+170ecdf6b2eab8aac2b8c852fa95d3c36d6bf604
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 1e88fabecf98474807be2763144a0085fbc14899..b0b576f8cbed42845d36ec2cbebf4689e58f46a0 100644 (file)
@@ -5855,6 +5855,10 @@ Select_statement::lower_one_case(Block* b)
     Statement::make_block_statement(scase.statements(), scase.location());
   b->add_statement(bs);
 
+  Statement* label =
+    Statement::make_unnamed_label_statement(this->break_label());
+  b->add_statement(label);
+
   this->is_lowered_ = true;
   return Statement::make_block_statement(b, loc);
 }
@@ -5958,6 +5962,10 @@ Select_statement::lower_two_case(Block* b)
     Statement::make_if_statement(call, bchan, defcase.statements(), loc);
   b->add_statement(ifs);
 
+  Statement* label =
+    Statement::make_unnamed_label_statement(this->break_label());
+  b->add_statement(label);
+
   this->is_lowered_ = true;
   return Statement::make_block_statement(b, loc);
 }