re PR middle-end/64246 (ICE building libada for Windows due to NULL loop header)
authorRichard Biener <rguenther@suse.de>
Mon, 15 Dec 2014 12:20:10 +0000 (12:20 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 15 Dec 2014 12:20:10 +0000 (12:20 +0000)
2014-12-15  Richard Biener  <rguenther@suse.de>

PR middle-end/64246
* cfgloop.c (mark_loop_for_removal): Make safe against multiple
invocations on the same loop.

* gnat.dg/opt46.adb: New testcase.
* gnat.dg/opt46.ads: Likewise.
* gnat.dg/opt46_pkg.adb: Likewise.
* gnat.dg/opt46_pkg.ads: Likewise.

From-SVN: r218746

gcc/ChangeLog
gcc/cfgloop.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt46.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt46.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt46_pkg.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt46_pkg.ads [new file with mode: 0644]

index 60811d5ae0df4f958afd022b73631f30ca159e0c..6683625fdff9d23d876338eac14e199b36cab827 100644 (file)
@@ -1,3 +1,9 @@
+2014-12-15  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/64246
+       * cfgloop.c (mark_loop_for_removal): Make safe against multiple
+       invocations on the same loop.
+
 2014-12-15  Marek Polacek  <polacek@redhat.com>
 
        PR middle-end/64292
index 5c5cedc5a8cbe1465cdf07d2a07e177babdce9fd..40fb5a1cec01563783bdfdbd9fa231136d668abb 100644 (file)
@@ -1928,9 +1928,10 @@ bb_loop_depth (const_basic_block bb)
 void
 mark_loop_for_removal (loop_p loop)
 {
+  if (loop->header == NULL)
+    return;
   loop->former_header = loop->header;
   loop->header = NULL;
   loop->latch = NULL;
   loops_state_set (LOOPS_NEED_FIXUP);
 }
-
index 2cbe5c04ed0ae7e18b441b06603a1abd52b41c25..8ed52f9666062dc92511ce67b1ba013607fbda87 100644 (file)
@@ -1,3 +1,11 @@
+2014-12-15  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/64246
+       * gnat.dg/opt46.adb: New testcase.
+       * gnat.dg/opt46.ads: Likewise.
+       * gnat.dg/opt46_pkg.adb: Likewise.
+       * gnat.dg/opt46_pkg.ads: Likewise.
+
 2014-12-15  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/64210
diff --git a/gcc/testsuite/gnat.dg/opt46.adb b/gcc/testsuite/gnat.dg/opt46.adb
new file mode 100644 (file)
index 0000000..64e0b63
--- /dev/null
@@ -0,0 +1,45 @@
+-- { dg-do compile }
+-- { dg-options "-O" }
+
+with Ada.Unchecked_Deallocation;
+
+with Opt46_Pkg;
+
+package body Opt46 is
+
+   type Pattern is abstract tagged null record;
+
+   type Pattern_Access is access Pattern'Class;
+
+   procedure Free is new Ada.Unchecked_Deallocation
+     (Pattern'Class, Pattern_Access);
+
+   type Action is abstract tagged null record;
+
+   type Action_Access is access Action'Class;
+
+   procedure Free is new Ada.Unchecked_Deallocation
+     (Action'Class, Action_Access);
+
+   type Pattern_Action is record
+      Pattern : Pattern_Access;
+      Action  : Action_Access;
+   end record;
+
+   package Pattern_Action_Table is new Opt46_Pkg (Pattern_Action, Natural, 1);
+
+   type Session_Data is record
+      Filters : Pattern_Action_Table.Instance;
+   end record;
+
+   procedure Close (Session : Session_Type) is
+      Filters : Pattern_Action_Table.Instance renames Session.Data.Filters;
+   begin
+      for F in 1 .. Pattern_Action_Table.Last (Filters) loop
+         Free (Filters.Table (F).Pattern);
+         Free (Filters.Table (F).Action);
+      end loop;
+
+   end Close;
+
+end Opt46;
diff --git a/gcc/testsuite/gnat.dg/opt46.ads b/gcc/testsuite/gnat.dg/opt46.ads
new file mode 100644 (file)
index 0000000..5a5175d
--- /dev/null
@@ -0,0 +1,16 @@
+package Opt46 is
+
+   type Session_Type is limited private;
+
+   procedure Close (Session : Session_Type);
+
+private
+
+   type Session_Data;
+   type Session_Data_Access is access Session_Data;
+
+   type Session_Type is record
+      Data : Session_Data_Access;
+   end record;
+
+end Opt46;
diff --git a/gcc/testsuite/gnat.dg/opt46_pkg.adb b/gcc/testsuite/gnat.dg/opt46_pkg.adb
new file mode 100644 (file)
index 0000000..26f67cc
--- /dev/null
@@ -0,0 +1,8 @@
+package body Opt46_Pkg is
+
+   function Last (T : Instance) return Table_Index_Type is
+   begin
+      return Table_Index_Type (T.P.Last_Val);
+   end Last;
+
+end Opt46_Pkg;
diff --git a/gcc/testsuite/gnat.dg/opt46_pkg.ads b/gcc/testsuite/gnat.dg/opt46_pkg.ads
new file mode 100644 (file)
index 0000000..1309315
--- /dev/null
@@ -0,0 +1,31 @@
+generic
+   type Table_Component_Type is private;
+   type Table_Index_Type     is range <>;
+
+   Table_Low_Bound : Table_Index_Type;
+
+package Opt46_Pkg is
+
+   type Table_Type is
+     array (Table_Index_Type range <>) of Table_Component_Type;
+   subtype Big_Table_Type is
+     Table_Type (Table_Low_Bound .. Table_Index_Type'Last);
+
+   type Table_Ptr is access all Big_Table_Type;
+
+   type Table_Private is private;
+
+   type Instance is record
+      Table : aliased Table_Ptr := null;
+      P : Table_Private;
+   end record;
+
+   function Last (T : Instance) return Table_Index_Type;
+
+private
+
+   type Table_Private is record
+      Last_Val : Integer;
+   end record;
+
+end Opt46_Pkg;