From 8e53268102e205b1b10664b53ad41c31a9257b32 Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Wed, 26 Sep 2018 09:17:41 +0000 Subject: [PATCH] [Ada] Missing error on non-limited derived type with limited component 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 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 | 6 ++++++ gcc/ada/sem_ch3.adb | 7 +++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 05530af8aa7..88eb18e2b5e 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2018-09-26 Ed Schonberg + + * 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 * sem_ch7.adb (Has_Referencer): Remove Top_Level parameter and diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index cc84f9c3f2d..8b13cd01806 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -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 -- 2.30.2