]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix emission of exception dispatch (PR middle-end/82154).
authorMartin Liska <mliska@suse.cz>
Wed, 13 Sep 2017 19:12:08 +0000 (21:12 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Wed, 13 Sep 2017 19:12:08 +0000 (19:12 +0000)
2017-09-13  Martin Liska  <mliska@suse.cz>

PR middle-end/82154
* stmt.c (expand_sjlj_dispatch_table): Use CASE_LOW when
CASE_HIGH is NULL_TREE.
2017-09-13  Martin Liska  <mliska@suse.cz>

PR middle-end/82154
* g++.dg/torture/pr82154.C: New test.

From-SVN: r252728

gcc/ChangeLog
gcc/stmt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr82154.C [new file with mode: 0644]

index 7bba8a938faa14660a1f629e141a7260e54c63db..959e04e895ae2ccd1913b8514360486710d39dab 100644 (file)
@@ -1,3 +1,9 @@
+2017-09-13  Martin Liska  <mliska@suse.cz>
+
+       PR middle-end/82154
+       * stmt.c (expand_sjlj_dispatch_table): Use CASE_LOW when
+       CASE_HIGH is NULL_TREE.
+
 2017-09-13  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index 39d29ff3da9adb81d776172853e63be67a06a113..92bd209ad64f0f0a17b96b70d84d0cb6667651be 100644 (file)
@@ -1063,8 +1063,10 @@ expand_sjlj_dispatch_table (rtx dispatch_index,
       for (int i = ncases - 1; i >= 0; --i)
        {
          tree elt = dispatch_table[i];
-         case_list.safe_push (simple_case_node (CASE_LOW (elt),
-                                                CASE_HIGH (elt),
+         tree high = CASE_HIGH (elt);
+         if (high == NULL_TREE)
+           high = CASE_LOW (elt);
+         case_list.safe_push (simple_case_node (CASE_LOW (elt), high,
                                                 CASE_LABEL (elt)));
        }
 
index 71e2b36360453e6ed9746617085509e62f3b7bc6..4084e1c39e88c0804b07cef9c4155d10df9bafd5 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-13  Martin Liska  <mliska@suse.cz>
+
+       PR middle-end/82154
+       * g++.dg/torture/pr82154.C: New test.
+
 2017-09-13  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/61362
diff --git a/gcc/testsuite/g++.dg/torture/pr82154.C b/gcc/testsuite/g++.dg/torture/pr82154.C
new file mode 100644 (file)
index 0000000..f4e1c3e
--- /dev/null
@@ -0,0 +1,50 @@
+// { dg-do compile }
+// { dg-additional-options "-Wno-deprecated" }
+
+namespace a {
+int b;
+class c
+{
+};
+}
+class g
+{
+public:
+  g ();
+};
+using a::b;
+class d
+{
+public:
+  d ();
+  void e ();
+};
+class f
+{
+  d
+  i ()
+  {
+    static d j;
+  }
+  int *k () throw (a::c);
+};
+
+
+int *f::k () throw (a::c)
+{
+  static g h;
+  i ();
+  int l = 2;
+  while (l)
+    {
+      --l;
+      try
+       {
+         operator new (b);
+       }
+      catch (a::c)
+       {
+       }
+    }
+  i ().e ();
+}