[Ada] Crash on use of generic formal package
authorJustin Squirek <squirek@adacore.com>
Wed, 14 Nov 2018 11:41:46 +0000 (11:41 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 14 Nov 2018 11:41:46 +0000 (11:41 +0000)
This patch fixes an issue whereby a complicated set of generic formal
packages in conjunction with use_clauses may cause a crash during
visibility checking due to a homonym being out of scope during the
checking stage.

2018-11-14  Justin Squirek  <squirek@adacore.com>

gcc/ada/

* sem_ch8.adb (Use_One_Package): Add test for out-of-scope
homonyms.

gcc/testsuite/

* gnat.dg/generic_pkg.adb: New testcase.

From-SVN: r266126

gcc/ada/ChangeLog
gcc/ada/sem_ch8.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/generic_pkg.adb [new file with mode: 0644]

index 6be83416933d05a1dbedc985eacd033a303b2c8f..d4dcd8c41d6aa6e77a5e7287328e01e5e45f0618 100644 (file)
@@ -1,3 +1,8 @@
+2018-11-14  Justin Squirek  <squirek@adacore.com>
+
+       * sem_ch8.adb (Use_One_Package): Add test for out-of-scope
+       homonyms.
+
 2018-11-14  Ed Schonberg  <schonberg@adacore.com>
 
        * exp_ch3.adb: (Expand_N_Object_Declaration): If the expression
index fd0e444657fd70ce783423c0902bc1c00c550562..a1bcbffea7f41a9f7c21abf4e5daf4143c4f34c5 100644 (file)
@@ -9685,12 +9685,17 @@ package body Sem_Ch8 is
             --  current one would have been visible, so make the other one
             --  not use_visible.
 
+            --  In certain pathological cases it is possible that unrelated
+            --  homonyms from distinct formal packages may exist in an
+            --  uninstalled scope. We must test for that here.
+
             elsif Present (Current_Instance)
               and then Is_Potentially_Use_Visible (Prev)
               and then not Is_Overloadable (Prev)
               and then Scope (Id) /= Scope (Prev)
               and then Used_As_Generic_Actual (Scope (Prev))
               and then Used_As_Generic_Actual (Scope (Id))
+              and then Is_List_Member (Scope (Prev))
               and then not In_Same_List (Current_Use_Clause (Scope (Prev)),
                                          Current_Use_Clause (Scope (Id)))
             then
index 6c45c142312afe5be4fbbd5de5b674c4b440c027..c4d7657d7d1e0a981b6cdc655b89ecd87db58534 100644 (file)
@@ -1,3 +1,7 @@
+2018-11-14  Justin Squirek  <squirek@adacore.com>
+
+       * gnat.dg/generic_pkg.adb: New testcase.
+
 2018-11-14  Ed Schonberg  <schonberg@adacore.com>
 
        * gnat.dg/limited_aggr.adb, gnat.dg/limited_aggr.ads: New
diff --git a/gcc/testsuite/gnat.dg/generic_pkg.adb b/gcc/testsuite/gnat.dg/generic_pkg.adb
new file mode 100644 (file)
index 0000000..80f3e59
--- /dev/null
@@ -0,0 +1,37 @@
+--  { dg-do compile }
+
+procedure Generic_Pkg is
+   generic
+      type T_horizontal is new float;
+   package vectors_2D is end;
+
+   generic
+      with package C is new vectors_2d (<>);
+      with package D is new vectors_2d (<>);
+   package poshelp is end;
+
+   generic
+      with package Helper is new poshelp (<>);
+   package timevars is
+      use Helper.C;
+   end;
+
+   generic
+      with package C is new vectors_2d (<>);
+      with package D is new vectors_2d (<>);
+      with package Helper is new poshelp (C, D);
+   package Spagett is end;
+
+   generic
+      with package C is new vectors_2d (<>);
+      with package D is new vectors_2d (<>);
+      with package Helper is new poshelp (C, D);
+   package Touch is
+      use Helper;
+      package My_Spagett is new Spagett (C, D, Helper);
+      package timevars_Pkg is new timevars (Helper);
+   end;
+
+begin
+  null;
+end;