From 241a2c498005207d52a3d64884e41953fc00275c Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Fri, 4 Dec 2020 10:04:56 +0100 Subject: [PATCH] Fix checking failure in IPA-SRA 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 | 2 +- gcc/testsuite/gnat.dg/opt91.adb | 11 +++++++++++ gcc/testsuite/gnat.dg/opt91.ads | 10 ++++++++++ gcc/testsuite/gnat.dg/opt91_pkg.adb | 12 ++++++++++++ gcc/testsuite/gnat.dg/opt91_pkg.ads | 19 +++++++++++++++++++ 5 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gnat.dg/opt91.adb create mode 100644 gcc/testsuite/gnat.dg/opt91.ads create mode 100644 gcc/testsuite/gnat.dg/opt91_pkg.adb create mode 100644 gcc/testsuite/gnat.dg/opt91_pkg.ads diff --git a/gcc/ipa-sra.c b/gcc/ipa-sra.c index 82acc6a21cb..7adc4b688f3 100644 --- a/gcc/ipa-sra.c +++ b/gcc/ipa-sra.c @@ -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 index 00000000000..b0132f82d09 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt91.adb @@ -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 ""; + end; + +end Opt91; diff --git a/gcc/testsuite/gnat.dg/opt91.ads b/gcc/testsuite/gnat.dg/opt91.ads new file mode 100644 index 00000000000..b31aa8de350 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt91.ads @@ -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 index 00000000000..5b95fb2e165 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt91_pkg.adb @@ -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 index 00000000000..9bfd0f05b3d --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt91_pkg.ads @@ -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; -- 2.30.2