[Ada] Crash on constrained container in generalized indexing operation
authorEd Schonberg <schonberg@adacore.com>
Mon, 16 Dec 2019 10:34:42 +0000 (10:34 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 16 Dec 2019 10:34:42 +0000 (10:34 +0000)
2019-12-16  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_ch4.adb (Try_Container_Indexing): In the case of a derived
container type, use the base type to look for candidate indexing
operations, because the object may be a constrained subtype or
itype with no explicit declaration.  Candidate indexing
operations are found in the same scope and list of declarations
as the declaration of the base type.

From-SVN: r279432

gcc/ada/ChangeLog
gcc/ada/sem_ch4.adb

index 79d204255dd24b87c200f6c7e41a3ec8af0d3faf..5533c1cca533e2ea47a6fe95193db3bd1733ac1d 100644 (file)
@@ -1,3 +1,12 @@
+2019-12-16  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch4.adb (Try_Container_Indexing): In the case of a derived
+       container type, use the base type to look for candidate indexing
+       operations, because the object may be a constrained subtype or
+       itype with no explicit declaration.  Candidate indexing
+       operations are found in the same scope and list of declarations
+       as the declaration of the base type.
+
 2019-12-16  Ed Schonberg  <schonberg@adacore.com>
 
        * scng.adb (Scan): In Ada2020, a left-bracket indicates the
index 80be4d6636882cfa5a1af33b333324ae88003aa2..0158623d496b8c8dd32a5e42fa862c2ed556ed36 100644 (file)
@@ -8289,13 +8289,16 @@ package body Sem_Ch4 is
       --  Note that predefined containers are typically all derived from one of
       --  the Controlled types. The code below is motivated by containers that
       --  are derived from other types with a Reference aspect.
+      --  Note as well that we need to examine the base type, given that
+      --  the container object may be a constrained subtype or itype which
+      --  does not have an explicit declaration,
 
       elsif Is_Derived_Type (C_Type)
         and then Etype (First_Formal (Entity (Func_Name))) /= Pref_Typ
       then
          Func_Name :=
            Find_Indexing_Operations
-             (T           => C_Type,
+             (T           => Base_Type (C_Type),
               Nam         => Chars (Func_Name),
               Is_Constant => Is_Constant_Indexing);
       end if;