[Ada] Missing error on non-limited derived type with limited component
authorEd Schonberg <schonberg@adacore.com>
Wed, 26 Sep 2018 09:17:41 +0000 (09:17 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 26 Sep 2018 09:17:41 +0000 (09:17 +0000)
This patch fixes a missing error on a type extension with limited
components, when the parent type is a derived limited interface. This
may allow the unit to improperly compile, but may lead to bind-time
errors when compiling a client of that unit.

Compiling p.adb must yield:

 keys.ads:8:06: extension of nonlimited type cannot have limited components
 keys.ads:8:06: limitedness is not inherited from limited interface
 keys.ads:8:06: add "limited" to type indication

----
with Keys;
procedure P is
begin
  null;
end;
----
with GNAT.Semaphores;
package Keys is

  type Ref0 is limited interface;
  type Ref2 is limited interface and Ref0;

  type Object is new Ref2 with record
     Lock : aliased GNAT.Semaphores.Binary_Semaphore
       (True, GNAT.Semaphores.Default_Ceiling);
  end record;

end;

2018-09-26  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_ch3.adb (Is_Onown_Limited): A derived type whose parent P
is a derived limited record is not itself limited if P is a
derived limited interface.

From-SVN: r264616

gcc/ada/ChangeLog
gcc/ada/sem_ch3.adb

index 05530af8aa7b137ec6cc89a4702e8600f4c210bc..88eb18e2b5e55d38209458132e9e3fb099ae180f 100644 (file)
@@ -1,3 +1,9 @@
+2018-09-26  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch3.adb (Is_Onown_Limited): A derived type whose parent P
+       is a derived limited record is not itself limited if P is a
+       derived limited interface.
+
 2018-09-26  Eric Botcazou  <ebotcazou@adacore.com>
 
        * sem_ch7.adb (Has_Referencer): Remove Top_Level parameter and
index cc84f9c3f2dc391ef6bde731118d3b5347972dae..8b13cd018068fecf6f58e48f7085754516a69abf 100644 (file)
@@ -1928,9 +1928,12 @@ package body Sem_Ch3 is
             return True;
 
          --  Else the type may have a limited interface progenitor, but a
-         --  limited record parent.
+         --  limited record parent that is not an interface.
 
-         elsif R /= P and then Is_Limited_Record (P) then
+         elsif R /= P
+            and then Is_Limited_Record (P)
+            and then not Is_Interface (P)
+         then
             return True;
 
          else