mirror of git://gcc.gnu.org/git/gcc.git
[multiple changes]
2012-10-05 Thomas Quinot <quinot@adacore.com> * sem_dim.adb, errout.adb, errout.ads (Analyze_Dimension_Call): Add guard against abnormal tree resulting from a previously diagnosed illegality. 2012-10-05 Hristian Kirtchev <kirtchev@adacore.com> * freeze.adb (Freeze_Expression): Rename local variable Cspc to Spec and update all refs to it. Do not freeze an entity outside a subprogram body when the original context is an expression function. 2012-10-05 Robert Dewar <dewar@adacore.com> * gnat1drv.adb (Adjust_Global_Switches): Default for overflow checking is suppressed, even if backend overflow/divide checks are enabled. 2012-10-05 Ed Schonberg <schonberg@adacore.com> * einfo.adb (Set_Invariant_Procedure, Set_Predicate_Function): chain properly subprograms on Subprograms_For_Type list. * sem_ch13.ads; (Build_Invariant_Procedure_Declaration): new procedure, to create declaration for invariant procedure independently of the construction of the body, so that it can be called within expression functions. * sem_ch13.adb (Build_Invariant_Procedure): code cleanup. The declaration may already have been generated at the point an explicit invariant aspect is encountered. * sem_prag.adb; (Analyze_Pragma, case Invariant): create declaration for invariant procedure. * sem_ch7.adb (Analyze_Package_Specification): clean up call to build invariant procedure. (Preserve_Full_Attributes): propagate information about invariants if they appear on a completion, 2012-10-05 Pascal Obry <obry@adacore.com> * gnat_ugn.texi: Update documentation to lift Microsoft C restriction. From-SVN: r192128
This commit is contained in:
parent
967fb65e80
commit
95081e99e2
|
|
@ -1,3 +1,43 @@
|
||||||
|
2012-10-05 Thomas Quinot <quinot@adacore.com>
|
||||||
|
|
||||||
|
* sem_dim.adb, errout.adb, errout.ads (Analyze_Dimension_Call): Add
|
||||||
|
guard against abnormal tree resulting from a previously diagnosed
|
||||||
|
illegality.
|
||||||
|
|
||||||
|
2012-10-05 Hristian Kirtchev <kirtchev@adacore.com>
|
||||||
|
|
||||||
|
* freeze.adb (Freeze_Expression): Rename local variable Cspc to Spec
|
||||||
|
and update all refs to it. Do not freeze an entity outside a subprogram
|
||||||
|
body when the original context is an expression function.
|
||||||
|
|
||||||
|
2012-10-05 Robert Dewar <dewar@adacore.com>
|
||||||
|
|
||||||
|
* gnat1drv.adb (Adjust_Global_Switches): Default for overflow checking
|
||||||
|
is suppressed, even if backend overflow/divide checks are enabled.
|
||||||
|
|
||||||
|
2012-10-05 Ed Schonberg <schonberg@adacore.com>
|
||||||
|
|
||||||
|
* einfo.adb (Set_Invariant_Procedure, Set_Predicate_Function):
|
||||||
|
chain properly subprograms on Subprograms_For_Type list.
|
||||||
|
* sem_ch13.ads; (Build_Invariant_Procedure_Declaration): new
|
||||||
|
procedure, to create declaration for invariant procedure
|
||||||
|
independently of the construction of the body, so that it can
|
||||||
|
be called within expression functions.
|
||||||
|
* sem_ch13.adb (Build_Invariant_Procedure): code cleanup. The
|
||||||
|
declaration may already have been generated at the point an
|
||||||
|
explicit invariant aspect is encountered.
|
||||||
|
* sem_prag.adb; (Analyze_Pragma, case Invariant): create declaration
|
||||||
|
for invariant procedure.
|
||||||
|
* sem_ch7.adb (Analyze_Package_Specification): clean up call to
|
||||||
|
build invariant procedure.
|
||||||
|
(Preserve_Full_Attributes): propagate information about invariants
|
||||||
|
if they appear on a completion,
|
||||||
|
|
||||||
|
2012-10-05 Pascal Obry <obry@adacore.com>
|
||||||
|
|
||||||
|
* gnat_ugn.texi: Update documentation to lift Microsoft C
|
||||||
|
restriction.
|
||||||
|
|
||||||
2012-10-05 Robert Dewar <dewar@adacore.com>
|
2012-10-05 Robert Dewar <dewar@adacore.com>
|
||||||
|
|
||||||
* sem_util.adb (Has_One_Matching_Field): Handle case of lone
|
* sem_util.adb (Has_One_Matching_Field): Handle case of lone
|
||||||
|
|
|
||||||
|
|
@ -7113,6 +7113,7 @@ package body Einfo is
|
||||||
|
|
||||||
S := Subprograms_For_Type (Id);
|
S := Subprograms_For_Type (Id);
|
||||||
Set_Subprograms_For_Type (Id, V);
|
Set_Subprograms_For_Type (Id, V);
|
||||||
|
Set_Subprograms_For_Type (V, S);
|
||||||
|
|
||||||
while Present (S) loop
|
while Present (S) loop
|
||||||
if Has_Invariants (S) then
|
if Has_Invariants (S) then
|
||||||
|
|
@ -7121,8 +7122,6 @@ package body Einfo is
|
||||||
S := Subprograms_For_Type (S);
|
S := Subprograms_For_Type (S);
|
||||||
end if;
|
end if;
|
||||||
end loop;
|
end loop;
|
||||||
|
|
||||||
Set_Subprograms_For_Type (Id, V);
|
|
||||||
end Set_Invariant_Procedure;
|
end Set_Invariant_Procedure;
|
||||||
|
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
@ -7137,6 +7136,7 @@ package body Einfo is
|
||||||
|
|
||||||
S := Subprograms_For_Type (Id);
|
S := Subprograms_For_Type (Id);
|
||||||
Set_Subprograms_For_Type (Id, V);
|
Set_Subprograms_For_Type (Id, V);
|
||||||
|
Set_Subprograms_For_Type (V, S);
|
||||||
|
|
||||||
while Present (S) loop
|
while Present (S) loop
|
||||||
if Has_Predicates (S) then
|
if Has_Predicates (S) then
|
||||||
|
|
@ -7145,8 +7145,6 @@ package body Einfo is
|
||||||
S := Subprograms_For_Type (S);
|
S := Subprograms_For_Type (S);
|
||||||
end if;
|
end if;
|
||||||
end loop;
|
end loop;
|
||||||
|
|
||||||
Set_Subprograms_For_Type (Id, V);
|
|
||||||
end Set_Predicate_Function;
|
end Set_Predicate_Function;
|
||||||
|
|
||||||
-----------------
|
-----------------
|
||||||
|
|
|
||||||
|
|
@ -198,6 +198,21 @@ package body Errout is
|
||||||
-- spec for precise definition of the conversion that is performed by this
|
-- spec for precise definition of the conversion that is performed by this
|
||||||
-- routine in OpenVMS mode.
|
-- routine in OpenVMS mode.
|
||||||
|
|
||||||
|
--------------------
|
||||||
|
-- Cascaded_Error --
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
procedure Cascaded_Error is
|
||||||
|
begin
|
||||||
|
-- An anomaly has been detected which is assumed to be a consequence of
|
||||||
|
-- a previous error. Raise an exception if no serious error has been
|
||||||
|
-- found so far.
|
||||||
|
|
||||||
|
if Serious_Errors_Detected = 0 then
|
||||||
|
raise Program_Error;
|
||||||
|
end if;
|
||||||
|
end Cascaded_Error;
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
-- Change_Error_Text --
|
-- Change_Error_Text --
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
|
||||||
|
|
@ -727,6 +727,13 @@ package Errout is
|
||||||
-- This routine can only be called during semantic analysis. It may not
|
-- This routine can only be called during semantic analysis. It may not
|
||||||
-- be called during parsing.
|
-- be called during parsing.
|
||||||
|
|
||||||
|
procedure Cascaded_Error;
|
||||||
|
-- When an anomaly is detected, many semantic routines silently bail out,
|
||||||
|
-- assuming that the anomaly was caused by a previously detected error.
|
||||||
|
-- This routine should be called in these cases, and will raise an
|
||||||
|
-- exception if no serious error has been detected. This ensure that the
|
||||||
|
-- anomaly is never allowed to go unnoticed.
|
||||||
|
|
||||||
procedure Change_Error_Text (Error_Id : Error_Msg_Id; New_Msg : String);
|
procedure Change_Error_Text (Error_Id : Error_Msg_Id; New_Msg : String);
|
||||||
-- The error message text of the message identified by Id is replaced by
|
-- The error message text of the message identified by Id is replaced by
|
||||||
-- the given text. This text may contain insertion characters in the
|
-- the given text. This text may contain insertion characters in the
|
||||||
|
|
|
||||||
|
|
@ -5156,44 +5156,64 @@ package body Freeze is
|
||||||
-- subprogram body that we are inside.
|
-- subprogram body that we are inside.
|
||||||
|
|
||||||
if In_Exp_Body (Parent_P) then
|
if In_Exp_Body (Parent_P) then
|
||||||
|
|
||||||
-- However, we *do* want to freeze at this point if we have
|
|
||||||
-- an entity to freeze, and that entity is declared *inside*
|
|
||||||
-- the body of the expander generated procedure. This case
|
|
||||||
-- is recognized by the scope of the type, which is either
|
|
||||||
-- the spec for some enclosing body, or (in the case of
|
|
||||||
-- init_procs, for which there are no separate specs) the
|
|
||||||
-- current scope.
|
|
||||||
|
|
||||||
declare
|
declare
|
||||||
Subp : constant Node_Id := Parent (Parent_P);
|
Subp : constant Node_Id := Parent (Parent_P);
|
||||||
Cspc : Entity_Id;
|
Spec : Entity_Id;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
if Nkind (Subp) = N_Subprogram_Body then
|
-- Freeze the entity only when it is declared inside the
|
||||||
Cspc := Corresponding_Spec (Subp);
|
-- body of the expander generated procedure. This case
|
||||||
|
-- is recognized by the scope of the entity or its type,
|
||||||
|
-- which is either the spec for some enclosing body, or
|
||||||
|
-- (in the case of init_procs, for which there are no
|
||||||
|
-- separate specs) the current scope.
|
||||||
|
|
||||||
if (Present (Typ) and then Scope (Typ) = Cspc)
|
if Nkind (Subp) = N_Subprogram_Body then
|
||||||
|
Spec := Corresponding_Spec (Subp);
|
||||||
|
|
||||||
|
if (Present (Typ) and then Scope (Typ) = Spec)
|
||||||
or else
|
or else
|
||||||
(Present (Nam) and then Scope (Nam) = Cspc)
|
(Present (Nam) and then Scope (Nam) = Spec)
|
||||||
then
|
then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
elsif Present (Typ)
|
elsif Present (Typ)
|
||||||
and then Scope (Typ) = Current_Scope
|
and then Scope (Typ) = Current_Scope
|
||||||
and then Current_Scope = Defining_Entity (Subp)
|
and then Defining_Entity (Subp) = Current_Scope
|
||||||
then
|
then
|
||||||
exit;
|
exit;
|
||||||
end if;
|
end if;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
|
-- An expression function may act as a completion of
|
||||||
|
-- a function declaration. As such, it can reference
|
||||||
|
-- entities declared between the two views:
|
||||||
|
|
||||||
|
-- Hidden []; -- 1
|
||||||
|
-- function F return ...;
|
||||||
|
-- private
|
||||||
|
-- function Hidden return ...;
|
||||||
|
-- function F return ... is (Hidden); -- 2
|
||||||
|
|
||||||
|
-- Refering to the example above, freezing the expression
|
||||||
|
-- of F (2) would place Hidden's freeze node (1) in the
|
||||||
|
-- wrong place. Avoid explicit freezing and let the usual
|
||||||
|
-- scenarios do the job - for example, reaching the end
|
||||||
|
-- of the private declarations.
|
||||||
|
|
||||||
|
if Nkind (Original_Node (Subp)) =
|
||||||
|
N_Expression_Function
|
||||||
|
then
|
||||||
|
null;
|
||||||
|
|
||||||
|
-- Freeze outside the body
|
||||||
|
|
||||||
|
else
|
||||||
|
Parent_P := Parent (Parent_P);
|
||||||
|
Freeze_Outside := True;
|
||||||
|
end if;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
-- If not that exception to the exception, then this is
|
|
||||||
-- where we delay the freeze till outside the body.
|
|
||||||
|
|
||||||
Parent_P := Parent (Parent_P);
|
|
||||||
Freeze_Outside := True;
|
|
||||||
|
|
||||||
-- Here if normal case where we are in handled statement
|
-- Here if normal case where we are in handled statement
|
||||||
-- sequence and want to do the insertion right there.
|
-- sequence and want to do the insertion right there.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -328,12 +328,17 @@ procedure Gnat1drv is
|
||||||
Exception_Mechanism := Back_End_Exceptions;
|
Exception_Mechanism := Back_End_Exceptions;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
-- Set proper status for overflow checks. If already set (by -gnato or
|
-- Set proper status for overflow checks
|
||||||
-- -gnatp) then we have nothing to do.
|
|
||||||
|
-- If already set (by - gnato or -gnatp) then we have nothing to do
|
||||||
|
|
||||||
if Opt.Suppress_Options.Overflow_Checks_General /= Not_Set then
|
if Opt.Suppress_Options.Overflow_Checks_General /= Not_Set then
|
||||||
null;
|
null;
|
||||||
|
|
||||||
|
-- Otherwise set appropriate default mode. Note: at present we set
|
||||||
|
-- SUPPRESSED in all three of the following cases. They are separated
|
||||||
|
-- because in the future we may make different choices.
|
||||||
|
|
||||||
-- By default suppress overflow checks in -gnatg mode
|
-- By default suppress overflow checks in -gnatg mode
|
||||||
|
|
||||||
elsif GNAT_Mode then
|
elsif GNAT_Mode then
|
||||||
|
|
@ -341,16 +346,18 @@ procedure Gnat1drv is
|
||||||
Suppress_Options.Overflow_Checks_Assertions := Suppressed;
|
Suppress_Options.Overflow_Checks_Assertions := Suppressed;
|
||||||
|
|
||||||
-- If we have backend divide and overflow checks, then by default
|
-- If we have backend divide and overflow checks, then by default
|
||||||
-- overflow checks are minimized, which is a reasonable setting.
|
-- overflow checks are suppressed. Historically this code used to
|
||||||
|
-- activate overflow checks, although no target currently has these
|
||||||
|
-- flags set, so this was dead code anyway.
|
||||||
|
|
||||||
elsif Targparm.Backend_Divide_Checks_On_Target
|
elsif Targparm.Backend_Divide_Checks_On_Target
|
||||||
and
|
and
|
||||||
Targparm.Backend_Overflow_Checks_On_Target
|
Targparm.Backend_Overflow_Checks_On_Target
|
||||||
then
|
then
|
||||||
Suppress_Options.Overflow_Checks_General := Minimized;
|
Suppress_Options.Overflow_Checks_General := Suppressed;
|
||||||
Suppress_Options.Overflow_Checks_Assertions := Minimized;
|
Suppress_Options.Overflow_Checks_Assertions := Suppressed;
|
||||||
|
|
||||||
-- Otherwise for now, default is checks are suppressed. This is likely
|
-- Otherwise for now, default is checks are suppressed. This is subject
|
||||||
-- to change in the future, but for now this is the compatible behavior
|
-- to change in the future, but for now this is the compatible behavior
|
||||||
-- with previous versions of GNAT.
|
-- with previous versions of GNAT.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28212,9 +28212,15 @@ success. It should be possible to use @code{GetLastError} and
|
||||||
features are not used, but it is not guaranteed to work.
|
features are not used, but it is not guaranteed to work.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
It is not possible to link against Microsoft libraries except for
|
It is not possible to link against Microsoft C++ libraries except for
|
||||||
import libraries. Interfacing must be done by the mean of DLLs.
|
import libraries. Interfacing must be done by the mean of DLLs.
|
||||||
|
|
||||||
|
@item
|
||||||
|
It is possible to link against Microsoft C libraries. Yet the preferred
|
||||||
|
solution is to use C/C++ compiler that comes with @value{EDITION}, since it
|
||||||
|
doesn't require having two different development environments and makes the
|
||||||
|
inter-language debugging experience smoother.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
When the compilation environment is located on FAT32 drives, users may
|
When the compilation environment is located on FAT32 drives, users may
|
||||||
experience recompilations of the source files that have not changed if
|
experience recompilations of the source files that have not changed if
|
||||||
|
|
@ -28302,14 +28308,14 @@ application that contains a mix of Ada and C/C++, the choice of your
|
||||||
Windows C/C++ development environment conditions your overall
|
Windows C/C++ development environment conditions your overall
|
||||||
interoperability strategy.
|
interoperability strategy.
|
||||||
|
|
||||||
If you use @command{gcc} to compile the non-Ada part of your application,
|
If you use @command{gcc} or Microsoft C to compile the non-Ada part of
|
||||||
there are no Windows-specific restrictions that affect the overall
|
your application, there are no Windows-specific restrictions that
|
||||||
interoperability with your Ada code. If you do want to use the
|
affect the overall interoperability with your Ada code. If you do want
|
||||||
Microsoft tools for your non-Ada code, you have two choices:
|
to use the Microsoft tools for your C++ code, you have two choices:
|
||||||
|
|
||||||
@enumerate
|
@enumerate
|
||||||
@item
|
@item
|
||||||
Encapsulate your non-Ada code in a DLL to be linked with your Ada
|
Encapsulate your C++ code in a DLL to be linked with your Ada
|
||||||
application. In this case, use the Microsoft or whatever environment to
|
application. In this case, use the Microsoft or whatever environment to
|
||||||
build the DLL and use GNAT to build your executable
|
build the DLL and use GNAT to build your executable
|
||||||
(@pxref{Using DLLs with GNAT}).
|
(@pxref{Using DLLs with GNAT}).
|
||||||
|
|
|
||||||
|
|
@ -4902,6 +4902,48 @@ package body Sem_Ch13 is
|
||||||
end if;
|
end if;
|
||||||
end Analyze_Record_Representation_Clause;
|
end Analyze_Record_Representation_Clause;
|
||||||
|
|
||||||
|
-------------------------------------------
|
||||||
|
-- Build_Invariant_Procedure_Declaration --
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
function Build_Invariant_Procedure_Declaration
|
||||||
|
(Typ : Entity_Id) return Node_Id
|
||||||
|
is
|
||||||
|
Loc : constant Source_Ptr := Sloc (Typ);
|
||||||
|
Object_Entity : constant Entity_Id :=
|
||||||
|
Make_Defining_Identifier (Loc, New_Internal_Name ('I'));
|
||||||
|
Spec : Node_Id;
|
||||||
|
SId : Entity_Id;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Set_Etype (Object_Entity, Typ);
|
||||||
|
|
||||||
|
-- Check for duplicate definiations.
|
||||||
|
|
||||||
|
if Has_Invariants (Typ)
|
||||||
|
and then Present (Invariant_Procedure (Typ))
|
||||||
|
then
|
||||||
|
return Empty;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
SId := Make_Defining_Identifier (Loc,
|
||||||
|
Chars => New_External_Name (Chars (Typ), "Invariant"));
|
||||||
|
Set_Has_Invariants (SId);
|
||||||
|
Set_Has_Invariants (Typ);
|
||||||
|
Set_Ekind (SId, E_Procedure);
|
||||||
|
Set_Invariant_Procedure (Typ, SId);
|
||||||
|
|
||||||
|
Spec :=
|
||||||
|
Make_Procedure_Specification (Loc,
|
||||||
|
Defining_Unit_Name => SId,
|
||||||
|
Parameter_Specifications => New_List (
|
||||||
|
Make_Parameter_Specification (Loc,
|
||||||
|
Defining_Identifier => Object_Entity,
|
||||||
|
Parameter_Type => New_Occurrence_Of (Typ, Loc))));
|
||||||
|
|
||||||
|
return Make_Subprogram_Declaration (Loc, Specification => Spec);
|
||||||
|
end Build_Invariant_Procedure_Declaration;
|
||||||
|
|
||||||
-------------------------------
|
-------------------------------
|
||||||
-- Build_Invariant_Procedure --
|
-- Build_Invariant_Procedure --
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
@ -4936,12 +4978,11 @@ package body Sem_Ch13 is
|
||||||
-- "inherited" to the exception message and generating an informational
|
-- "inherited" to the exception message and generating an informational
|
||||||
-- message about the inheritance of an invariant.
|
-- message about the inheritance of an invariant.
|
||||||
|
|
||||||
Object_Name : constant Name_Id := New_Internal_Name ('I');
|
Object_Name : Name_Id;
|
||||||
-- Name for argument of invariant procedure
|
-- Name for argument of invariant procedure
|
||||||
|
|
||||||
Object_Entity : constant Node_Id :=
|
Object_Entity : Node_Id;
|
||||||
Make_Defining_Identifier (Loc, Object_Name);
|
-- The entity of the formal for the procedure
|
||||||
-- The procedure declaration entity for the argument
|
|
||||||
|
|
||||||
--------------------
|
--------------------
|
||||||
-- Add_Invariants --
|
-- Add_Invariants --
|
||||||
|
|
@ -5140,7 +5181,29 @@ package body Sem_Ch13 is
|
||||||
Stmts := No_List;
|
Stmts := No_List;
|
||||||
PDecl := Empty;
|
PDecl := Empty;
|
||||||
PBody := Empty;
|
PBody := Empty;
|
||||||
Set_Etype (Object_Entity, Typ);
|
SId := Empty;
|
||||||
|
|
||||||
|
-- If the aspect specification exists for some view of the type, the
|
||||||
|
-- declaration for the procedure has been created.
|
||||||
|
|
||||||
|
if Has_Invariants (Typ) then
|
||||||
|
SId := Invariant_Procedure (Typ);
|
||||||
|
end if;
|
||||||
|
|
||||||
|
if Present (SId) then
|
||||||
|
PDecl := Unit_Declaration_Node (SId);
|
||||||
|
|
||||||
|
else
|
||||||
|
PDecl := Build_Invariant_Procedure_Declaration (Typ);
|
||||||
|
end if;
|
||||||
|
|
||||||
|
-- Recover formal of procedure, for use in the calls to invariant
|
||||||
|
-- functions (including inherited ones).
|
||||||
|
|
||||||
|
Object_Entity :=
|
||||||
|
Defining_Identifier
|
||||||
|
(First (Parameter_Specifications (Specification (PDecl))));
|
||||||
|
Object_Name := Chars (Object_Entity);
|
||||||
|
|
||||||
-- Add invariants for the current type
|
-- Add invariants for the current type
|
||||||
|
|
||||||
|
|
@ -5174,38 +5237,7 @@ package body Sem_Ch13 is
|
||||||
|
|
||||||
if Stmts /= No_List then
|
if Stmts /= No_List then
|
||||||
|
|
||||||
-- Build procedure declaration
|
Spec := Copy_Separate_Tree (Specification (PDecl));
|
||||||
|
|
||||||
SId :=
|
|
||||||
Make_Defining_Identifier (Loc,
|
|
||||||
Chars => New_External_Name (Chars (Typ), "Invariant"));
|
|
||||||
Set_Has_Invariants (SId);
|
|
||||||
Set_Invariant_Procedure (Typ, SId);
|
|
||||||
|
|
||||||
Spec :=
|
|
||||||
Make_Procedure_Specification (Loc,
|
|
||||||
Defining_Unit_Name => SId,
|
|
||||||
Parameter_Specifications => New_List (
|
|
||||||
Make_Parameter_Specification (Loc,
|
|
||||||
Defining_Identifier => Object_Entity,
|
|
||||||
Parameter_Type => New_Occurrence_Of (Typ, Loc))));
|
|
||||||
|
|
||||||
PDecl := Make_Subprogram_Declaration (Loc, Specification => Spec);
|
|
||||||
|
|
||||||
-- Build procedure body
|
|
||||||
|
|
||||||
SId :=
|
|
||||||
Make_Defining_Identifier (Loc,
|
|
||||||
Chars => New_External_Name (Chars (Typ), "Invariant"));
|
|
||||||
|
|
||||||
Spec :=
|
|
||||||
Make_Procedure_Specification (Loc,
|
|
||||||
Defining_Unit_Name => SId,
|
|
||||||
Parameter_Specifications => New_List (
|
|
||||||
Make_Parameter_Specification (Loc,
|
|
||||||
Defining_Identifier =>
|
|
||||||
Make_Defining_Identifier (Loc, Object_Name),
|
|
||||||
Parameter_Type => New_Occurrence_Of (Typ, Loc))));
|
|
||||||
|
|
||||||
PBody :=
|
PBody :=
|
||||||
Make_Subprogram_Body (Loc,
|
Make_Subprogram_Body (Loc,
|
||||||
|
|
@ -5216,14 +5248,18 @@ package body Sem_Ch13 is
|
||||||
Statements => Stmts));
|
Statements => Stmts));
|
||||||
|
|
||||||
-- Insert procedure declaration and spec at the appropriate points.
|
-- Insert procedure declaration and spec at the appropriate points.
|
||||||
|
-- If declaration is already analyzed, it was processed by the
|
||||||
|
-- generated pragma.
|
||||||
|
|
||||||
if Present (Private_Decls) then
|
if Present (Private_Decls) then
|
||||||
|
|
||||||
-- The spec goes at the end of visible declarations, but they have
|
-- The spec goes at the end of visible declarations, but they have
|
||||||
-- already been analyzed, so we need to explicitly do the analyze.
|
-- already been analyzed, so we need to explicitly do the analyze.
|
||||||
|
|
||||||
Append_To (Visible_Decls, PDecl);
|
if not Analyzed (PDecl) then
|
||||||
Analyze (PDecl);
|
Append_To (Visible_Decls, PDecl);
|
||||||
|
Analyze (PDecl);
|
||||||
|
end if;
|
||||||
|
|
||||||
-- The body goes at the end of the private declarations, which we
|
-- The body goes at the end of the private declarations, which we
|
||||||
-- have not analyzed yet, so we do not need to perform an explicit
|
-- have not analyzed yet, so we do not need to perform an explicit
|
||||||
|
|
@ -5523,6 +5559,7 @@ package body Sem_Ch13 is
|
||||||
Make_Defining_Identifier (Loc,
|
Make_Defining_Identifier (Loc,
|
||||||
Chars => New_External_Name (Chars (Typ), "Predicate"));
|
Chars => New_External_Name (Chars (Typ), "Predicate"));
|
||||||
Set_Has_Predicates (SId);
|
Set_Has_Predicates (SId);
|
||||||
|
Set_Ekind (SId, E_Function);
|
||||||
Set_Predicate_Function (Typ, SId);
|
Set_Predicate_Function (Typ, SId);
|
||||||
|
|
||||||
-- The predicate function is shared between views of a type.
|
-- The predicate function is shared between views of a type.
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,14 @@ package Sem_Ch13 is
|
||||||
-- order is specified and there is at least one component clause. Adjusts
|
-- order is specified and there is at least one component clause. Adjusts
|
||||||
-- component positions according to either Ada 95 or Ada 2005 (AI-133).
|
-- component positions according to either Ada 95 or Ada 2005 (AI-133).
|
||||||
|
|
||||||
|
function Build_Invariant_Procedure_Declaration
|
||||||
|
(Typ : Entity_Id) return Node_Id;
|
||||||
|
-- If a type declaration has a specified invariant aspect, build the
|
||||||
|
-- declaration for the procedure at once, so that calls to it can be
|
||||||
|
-- generated before the body of the invariant procedure is built. This
|
||||||
|
-- is needed in the presence of public expression functions that return
|
||||||
|
-- the type in question.
|
||||||
|
|
||||||
procedure Build_Invariant_Procedure (Typ : Entity_Id; N : Node_Id);
|
procedure Build_Invariant_Procedure (Typ : Entity_Id; N : Node_Id);
|
||||||
-- Typ is a private type with invariants (indicated by Has_Invariants being
|
-- Typ is a private type with invariants (indicated by Has_Invariants being
|
||||||
-- set for Typ, indicating the presence of pragma Invariant entries on the
|
-- set for Typ, indicating the presence of pragma Invariant entries on the
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@
|
||||||
-- handling of private and full declarations, and the construction of dispatch
|
-- handling of private and full declarations, and the construction of dispatch
|
||||||
-- tables for tagged types.
|
-- tables for tagged types.
|
||||||
|
|
||||||
|
with Aspects; use Aspects;
|
||||||
with Atree; use Atree;
|
with Atree; use Atree;
|
||||||
with Debug; use Debug;
|
with Debug; use Debug;
|
||||||
with Einfo; use Einfo;
|
with Einfo; use Einfo;
|
||||||
|
|
@ -1387,7 +1388,21 @@ package body Sem_Ch7 is
|
||||||
and then Nkind (Parent (E)) = N_Full_Type_Declaration
|
and then Nkind (Parent (E)) = N_Full_Type_Declaration
|
||||||
and then Has_Aspects (Parent (E))
|
and then Has_Aspects (Parent (E))
|
||||||
then
|
then
|
||||||
Build_Invariant_Procedure (E, N);
|
declare
|
||||||
|
ASN : Node_Id;
|
||||||
|
begin
|
||||||
|
ASN := First (Aspect_Specifications (Parent (E)));
|
||||||
|
while Present (ASN) loop
|
||||||
|
if Chars (Identifier (ASN)) = Name_Invariant
|
||||||
|
or else Chars (Identifier (ASN)) = Name_Type_Invariant
|
||||||
|
then
|
||||||
|
Build_Invariant_Procedure (E, N);
|
||||||
|
exit;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
Next (ASN);
|
||||||
|
end loop;
|
||||||
|
end;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
Next_Entity (E);
|
Next_Entity (E);
|
||||||
|
|
@ -2143,6 +2158,14 @@ package body Sem_Ch7 is
|
||||||
|
|
||||||
Set_Freeze_Node (Priv, Freeze_Node (Full));
|
Set_Freeze_Node (Priv, Freeze_Node (Full));
|
||||||
|
|
||||||
|
-- Propagate information of type invariants, which may be specified
|
||||||
|
-- for the full view.
|
||||||
|
|
||||||
|
if Has_Invariants (Full) and not Has_Invariants (Priv) then
|
||||||
|
Set_Has_Invariants (Priv);
|
||||||
|
Set_Subprograms_For_Type (Priv, Subprograms_For_Type (Full));
|
||||||
|
end if;
|
||||||
|
|
||||||
if Is_Tagged_Type (Priv)
|
if Is_Tagged_Type (Priv)
|
||||||
and then Is_Tagged_Type (Full)
|
and then Is_Tagged_Type (Full)
|
||||||
and then not Error_Posted (Full)
|
and then not Error_Posted (Full)
|
||||||
|
|
|
||||||
|
|
@ -1629,6 +1629,15 @@ package body Sem_Dim is
|
||||||
Formal := First_Formal (Nam);
|
Formal := First_Formal (Nam);
|
||||||
|
|
||||||
while Present (Formal) loop
|
while Present (Formal) loop
|
||||||
|
|
||||||
|
-- A missing corresponding actual indicates that the analysis of
|
||||||
|
-- the call was aborted due to a previous error.
|
||||||
|
|
||||||
|
if No (Actual) then
|
||||||
|
Cascaded_Error;
|
||||||
|
return;
|
||||||
|
end if;
|
||||||
|
|
||||||
Formal_Typ := Etype (Formal);
|
Formal_Typ := Etype (Formal);
|
||||||
Dims_Of_Formal := Dimensions_Of (Formal_Typ);
|
Dims_Of_Formal := Dimensions_Of (Formal_Typ);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10329,6 +10329,7 @@ package body Sem_Prag is
|
||||||
when Pragma_Invariant => Invariant : declare
|
when Pragma_Invariant => Invariant : declare
|
||||||
Type_Id : Node_Id;
|
Type_Id : Node_Id;
|
||||||
Typ : Entity_Id;
|
Typ : Entity_Id;
|
||||||
|
PDecl : Node_Id;
|
||||||
|
|
||||||
Discard : Boolean;
|
Discard : Boolean;
|
||||||
pragma Unreferenced (Discard);
|
pragma Unreferenced (Discard);
|
||||||
|
|
@ -10380,8 +10381,13 @@ package body Sem_Prag is
|
||||||
|
|
||||||
-- Note that the type has at least one invariant, and also that
|
-- Note that the type has at least one invariant, and also that
|
||||||
-- it has inheritable invariants if we have Invariant'Class.
|
-- it has inheritable invariants if we have Invariant'Class.
|
||||||
|
-- Build the corresponding invariant procedure declaration, so
|
||||||
|
-- that calls to it can be generated before the body is built
|
||||||
|
-- (for example wihin an expression function).
|
||||||
|
|
||||||
Set_Has_Invariants (Typ);
|
PDecl := Build_Invariant_Procedure_Declaration (Typ);
|
||||||
|
Insert_After (N, PDecl);
|
||||||
|
Analyze (PDecl);
|
||||||
|
|
||||||
if Class_Present (N) then
|
if Class_Present (N) then
|
||||||
Set_Has_Inheritable_Invariants (Typ);
|
Set_Has_Inheritable_Invariants (Typ);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue