Fix checking failure in IPA-SRA
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 4 Dec 2020 09:04:56 +0000 (10:04 +0100)
committerEric Botcazou <ebotcazou@adacore.com>
Fri, 4 Dec 2020 09:07:42 +0000 (10:07 +0100)
This is a regression present on the mainline and 10 branch: on the one
hand, IPA-SRA does *not* disqualify accesses with zero size but, on the
other hand, it checks that accesses present in the tree have a (strictly)
positive size, thus trivially yielding an ICE in some cases.

gcc/ChangeLog:
* ipa-sra.c (verify_access_tree_1): Relax assertion on the size.

gcc/testsuite/ChangeLog:
* gnat.dg/opt91.ads, gnat.dg/opt91.adb: New test.
* gnat.dg/opt91_pkg.ads, gnat.dg/opt91_pkg.adb: New helper.

gcc/ipa-sra.c
gcc/testsuite/gnat.dg/opt91.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt91.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt91_pkg.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt91_pkg.ads [new file with mode: 0644]

index 82acc6a21cbf088b5b430d77bed565de28ca30f9..7adc4b688f3292c79c43ec778225d29ac5f0935e 100644 (file)
@@ -1480,7 +1480,7 @@ verify_access_tree_1 (gensum_param_access *access, HOST_WIDE_INT parent_offset,
 {
   while (access)
     {
-      gcc_assert (access->offset >= 0 && access->size > 0);
+      gcc_assert (access->offset >= 0 && access->size >= 0);
 
       if (parent_size != 0)
        {
diff --git a/gcc/testsuite/gnat.dg/opt91.adb b/gcc/testsuite/gnat.dg/opt91.adb
new file mode 100644 (file)
index 0000000..b0132f8
--- /dev/null
@@ -0,0 +1,11 @@
+-- { dg-do compile }
+-- { dg-options "-O2 -fchecking=1" }
+
+package body Opt91 is
+
+   function Custom_Image (Self : True_Relation_Rec) return String is
+   begin
+      return "<True>";
+   end;
+
+end Opt91;
diff --git a/gcc/testsuite/gnat.dg/opt91.ads b/gcc/testsuite/gnat.dg/opt91.ads
new file mode 100644 (file)
index 0000000..b31aa8d
--- /dev/null
@@ -0,0 +1,10 @@
+with Opt91_Pkg; use Opt91_Pkg;
+
+package Opt91 is
+
+   type True_Relation_Rec is null record;
+   function Custom_Image (Self : True_Relation_Rec) return String;
+
+   package True_Relation is new Pure_Relation (Ty => True_Relation_Rec);
+
+end Opt91;
diff --git a/gcc/testsuite/gnat.dg/opt91_pkg.adb b/gcc/testsuite/gnat.dg/opt91_pkg.adb
new file mode 100644 (file)
index 0000000..5b95fb2
--- /dev/null
@@ -0,0 +1,12 @@
+package body Opt91_Pkg is
+
+   package body Pure_Relation is
+
+      overriding function Custom_Image (Self : Rel) return String is
+      begin
+         return Custom_Image (Self.Rel);
+      end Custom_Image;
+
+   end Pure_Relation;
+
+end Opt91_Pkg;
diff --git a/gcc/testsuite/gnat.dg/opt91_pkg.ads b/gcc/testsuite/gnat.dg/opt91_pkg.ads
new file mode 100644 (file)
index 0000000..9bfd0f0
--- /dev/null
@@ -0,0 +1,19 @@
+package Opt91_Pkg is
+
+   type Base_Relation is abstract tagged null record;
+
+   function Custom_Image (Self : Base_Relation) return String is abstract;
+
+   generic
+      type Ty is private;
+      with function Custom_Image (Self : Ty) return String is <>;
+   package Pure_Relation is
+
+      type Rel is new Base_Relation with record
+         Rel : Ty;
+      end record;
+
+      overriding function Custom_Image (Self : Rel) return String;
+   end Pure_Relation;
+
+end Opt91_Pkg;