This patch fixes some errors in the handling of dynamic predicates applied to
private types.
Compiling and executing the following:
gnatmake -q -gnata main
main
must yield:
Endevour
Ariane5
Failure to launch
---
with gnat.io;
with ada.assertions;
procedure Main is
package SpaceShuttles is
type SpaceShuttle (Name : not null access constant String) is
tagged private
with
Dynamic_Predicate => SpaceShuttle.name.all'length > 6;
function Make (Ptr : not null access constant String) return
SpaceShuttle;
private
type SpaceShuttle (Name : not null access constant String) is
tagged null record;
end SpaceShuttles;
package body SpaceShuttles is
function Make (Ptr : not null access constant String) return
SpaceShuttle
is
begin
return (Name => Ptr);
end Make;
end SpaceShuttles;
use SpaceShuttles;
Name : aliased constant String := "Endevour";
Endevour : SpaceShuttles.SpaceShuttle(Name'Access);
Her : aliased constant String := "Ariane5";
Ariane : SpaceShuttle := Make (Her'access);
begin
gnat.io.Put_Line(Endevour.name.all);
gnat.io.Put_Line(Ariane.name.all);
declare
Dud : aliased constant String := "Ariane";
Failure : SpaceShuttle := Make (Dud'access);
begin
null;
end;
exception
when Ada.Assertions.Assertion_Error =>
gnat.io.put_line ("Failure to launch");
end Main;
Tested on x86_64-pc-linux-gnu, committed on trunk
2014-02-06 Ed Schonberg <[email protected]>
* sem_ch3.adb (Process_Full_View): Fix typo in the order of
parameters when propagating predicate function to full view.
(Find_Type_Of_Object): Freeze base type of object type to catch
premature use of discriminated private type without a full view.
Index: sem_ch3.adb
===================================================================
--- sem_ch3.adb (revision 207533)
+++ sem_ch3.adb (working copy)
@@ -15772,8 +15772,12 @@
and then No (Expression (P))
then
null;
+
+ -- Here we freeze the base type of object type to catch premature use
+ -- of discriminated private type without a full view.
+
else
- Insert_Actions (Obj_Def, Freeze_Entity (T, P));
+ Insert_Actions (Obj_Def, Freeze_Entity (Base_Type (T), P));
end if;
-- Ada 2005 AI-406: the object definition in an object declaration
@@ -18675,7 +18679,7 @@
end;
end if;
- -- Ada 2005 AI 161: Check preelaboratable initialization consistency
+ -- Ada 2005 AI 161: Check preelaborable initialization consistency
if Known_To_Have_Preelab_Init (Priv_T) then
@@ -18737,10 +18741,16 @@
Set_Has_Inheritable_Invariants (Full_T);
end if;
- -- Propagate predicates to full type
+ -- Propagate predicates to full type, and predicate function if already
+ -- defined. It is not clear that this can actually happen? the partial
+ -- view cannot be frozen yet, and the predicate function has not been
+ -- built. Still it is a cheap check and seems safer to make it.
if Has_Predicates (Priv_T) then
- Set_Predicate_Function (Priv_T, Predicate_Function (Full_T));
+ if Present (Predicate_Function (Priv_T)) then
+ Set_Predicate_Function (Full_T, Predicate_Function (Priv_T));
+ end if;
+
Set_Has_Predicates (Full_T);
end if;
end Process_Full_View;