Revert r263947.
authorMartin Liska <mliska@suse.cz>
Mon, 22 Oct 2018 13:09:33 +0000 (15:09 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Mon, 22 Oct 2018 13:09:33 +0000 (13:09 +0000)
2018-10-22  Martin Liska  <mliska@suse.cz>

  PR tree-optimization/87686
Revert
2018-08-29  Martin Liska  <mliska@suse.cz>

* tree-switch-conversion.c (switch_conversion::expand):
Strenghten assumption about gswitch statements.
2018-10-22  Martin Liska  <mliska@suse.cz>

  PR tree-optimization/87686
* g++.dg/tree-ssa/pr87686.C: New test.

From-SVN: r265388

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/pr87686.C [new file with mode: 0644]
gcc/tree-switch-conversion.c

index 736904fb679b85d350f5387e29ff0367cad68d4d..8bf143438d5210f0ee616a402e7f0ee7e48c15ab 100644 (file)
@@ -1,3 +1,12 @@
+2018-10-22  Martin Liska  <mliska@suse.cz>
+
+  PR tree-optimization/87686
+       Revert
+       2018-08-29  Martin Liska  <mliska@suse.cz>
+
+       * tree-switch-conversion.c (switch_conversion::expand):
+       Strenghten assumption about gswitch statements.
+
 2018-10-22  Martin Liska  <mliska@suse.cz>
 
        * ipa-icf.c (sem_item::compare_attributes): Remove.
index 27433018294ccc314f6804d0e6c3a6c4eae34a10..b803f72cc9b94bd64db722c2c5b26bf4b9db155e 100644 (file)
@@ -1,3 +1,8 @@
+2018-10-22  Martin Liska  <mliska@suse.cz>
+
+  PR tree-optimization/87686
+       * g++.dg/tree-ssa/pr87686.C: New test.
+
 2018-10-22  Jakub Jelinek  <jakub@redhat.com>
 
        * g++.target/i386/i386.exp: Use g++-dg-runtest to iterate
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr87686.C b/gcc/testsuite/g++.dg/tree-ssa/pr87686.C
new file mode 100644 (file)
index 0000000..65160a7
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+class a {
+public:
+  enum b { c, g, d, e } f;
+  a(b h) : f(h) {}
+  a i() {
+    switch (f) {
+    case d:
+      return c;
+    case e:
+      return g;
+    }
+  } /* { dg-warning "control reaches end of non-void function" } */
+};
+struct k {
+  a j;
+  k l() { j.i(); } /*  { dg-warning "no return statement in function returning non-void" } */
+};
+void m(k h) { h.l(); }
index 64169a6cd3d725e683773299c02fd9ff1efa3cba..ac2aa58525719b4d4edd6803499e38328a7669df 100644 (file)
@@ -913,7 +913,14 @@ switch_conversion::expand (gswitch *swtch)
   /* Group case labels so that we get the right results from the heuristics
      that decide on the code generation approach for this switch.  */
   m_cfg_altered |= group_case_labels_stmt (swtch);
-  gcc_assert (gimple_switch_num_labels (swtch) >= 2);
+
+  /* If this switch is now a degenerate case with only a default label,
+     there is nothing left for us to do.  */
+  if (gimple_switch_num_labels (swtch) < 2)
+    {
+      m_reason = "switch is a degenerate case";
+      return;
+    }
 
   collect (swtch);