+2012-03-15 Robert Dewar <dewar@adacore.com>
+
+ * sem_ch5.adb: Minor reformatting.
+
+2012-03-15 Ed Schonberg <schonberg@adacore.com>
+
+ * exp_ch3.adb (Expand_N_Object_Declaration): When rewriting the
+ declaration of a class-wide object, retain the Ekind to prevent
+ subsequent misuse of constants.
+
+2012-03-15 Yannick Moy <moy@adacore.com>
+
+ * gnat_rm.texi, gnat_ugn.texi: Minor correction of invariant
+ terminology.
+
+2012-03-15 Hristian Kirtchev <kirtchev@adacore.com>
+
+ * exp_util.adb (Initialized_By_Ctrl_Function): Add code to
+ process the case when a function call appears in object.operation
+ format.
+
+2012-03-15 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_ch6.ads, sem_ch6.adb (Check_Subtype_Conformant): add
+ Get_Inst formal, so that conformance within an instantiation
+ follows renamings of formals. This is similar to what is already
+ done in Check_Mode_conformant.
+ * sem_ch12.adb (Vailidate_Access_Subprogram_Instance): check that
+ formal and actual are subtype conformant. Previously only mode
+ conformance was required.
+
2012-03-15 Robert Dewar <dewar@adacore.com>
* par-ch6.adb, einfo.ads, sem_eval.adb, sem_eval.ads,
-- object renaming declaration ---because these identifiers
-- were previously added by Enter_Name to the current scope.
-- We must preserve the homonym chain of the source entity
- -- as well.
+ -- as well. We must also preserve the kind of the entity,
+ -- which may be a constant.
Set_Chars (Defining_Identifier (N), Chars (Def_Id));
Set_Homonym (Defining_Identifier (N), Homonym (Def_Id));
+ Set_Ekind (Defining_Identifier (N), Ekind (Def_Id));
Exchange_Entities (Defining_Identifier (N), Def_Id);
end;
end if;
----------------------------------
function Initialized_By_Ctrl_Function (N : Node_Id) return Boolean is
- Expr : constant Node_Id := Original_Node (Expression (N));
+ Expr : Node_Id := Original_Node (Expression (N));
+
begin
+ if Nkind (Expr) = N_Function_Call then
+ Expr := Name (Expr);
+ end if;
+
+ -- The function call may appear in object.operation format. Strip
+ -- all prefixes and retrieve the function name.
+
+ loop
+ if Nkind (Expr) = N_Selected_Component then
+ Expr := Selector_Name (Expr);
+ else
+ exit;
+ end if;
+ end loop;
+
return
- Nkind (Expr) = N_Function_Call
- and then Needs_Finalization (Etype (Expr));
+ Nkind_In (Expr, N_Expanded_Name, N_Identifier)
+ and then Ekind (Entity (Expr)) = E_Function
+ and then Needs_Finalization (Etype (Entity (Expr)));
end Initialized_By_Ctrl_Function;
----------------------
@end smallexample
@noindent
-This pragma provides exactly the same capabilities as the Invariant aspect
-defined in AI05-0146-1, and in the Ada 2012 Reference Manual. The Invariant
-aspect is fully implemented in Ada 2012 mode, but since it requires the use
-of the aspect syntax, which is not available exception in 2012 mode, it is
-not possible to use the Invariant aspect in earlier versions of Ada. However
-the Invariant pragma may be used in any version of Ada.
+This pragma provides exactly the same capabilities as the Type_Invariant aspect
+defined in AI05-0146-1, and in the Ada 2012 Reference Manual. The
+Type_Invariant aspect is fully implemented in Ada 2012 mode, but since it
+requires the use of the aspect syntax, which is not available except in 2012
+mode, it is not possible to use the Type_Invariant aspect in earlier versions
+of Ada. However the Invariant pragma may be used in any version of Ada. Also
+note that the aspect Invariant is a synonym in GNAT for the aspect
+Type_Invariant, but there is no pragma Type_Invariant.
The pragma must appear within the visible part of the package specification,
after the type to which its Entity argument appears. As with the Invariant
invariant pragma for the same entity.
For further details on the use of this pragma, see the Ada 2012 documentation
-of the Invariant aspect.
+of the Type_Invariant aspect.
@node Pragma Keep_Names
@unnumberedsec Pragma Keep_Names
@item @code{Favor_Top_Level} @tab -- GNAT
@item @code{Inline} @tab
@item @code{Inline_Always} @tab -- GNAT
-@item @code{Invariant} @tab
+@item @code{Invariant} @tab -- GNAT
@item @code{Machine_Radix} @tab
@item @code{No_Return} @tab
@item @code{Object_Size} @tab -- GNAT
@item @code{Suppress} @tab
@item @code{Suppress_Debug_Info} @tab -- GNAT
@item @code{Test_Case} @tab -- GNAT
+@item @code{Type_Invariant} @tab
@item @code{Unchecked_Union} @tab
@item @code{Universal_Aliasing} @tab -- GNAT
@item @code{Unmodified} @tab -- GNAT
@noindent
Type invariants may be specified for private types using the aspect notation.
- Aspect @code{Invariant} may be specified for any private type,
- @code{Invariant'Class} can
+ Aspect @code{Type_Invariant} may be specified for any private type,
+ @code{Type_Invariant'Class} can
only be specified for tagged types, and is inherited by any descendent of the
tagged types. The invariant is a boolean expression that is tested for being
true in the following situations: conversions to the private type, object
[@b{in}] @b{out}
parameters and returned result on return from any primitive operation for
the type that is visible to a client.
+ GNAT defines the synonyms @code{Invariant} for @code{Type_Invariant} and
+ @code{Invariant'Class} for @code{Type_Invariant'Class}.
@noindent
RM References: 13.03.03 (00)
@end smallexample
If the @code{zero cost} exception mechanism is used, and the platform
-doesn't support automatic registration of exception tables (e.g.@: HP-UX,
+doesn't support automatic registration of exception tables (e.g.@: HP-UX
or AIX), the simple approach described above will not work and
a pre-linking phase using GNAT will be necessary.
@emph{List inherited aspects.}
@cindex @option{-gnatw.l} (@command{gcc})
This switch causes the compiler to list inherited invariants,
-preconditions, and postconditions from Invariant'Class, Pre'Class, and
-Post'Class aspects. Also list inherited subtype predicates.
+preconditions, and postconditions from Type_Invariant'Class, Invariant'Class,
+Pre'Class, and Post'Class aspects. Also list inherited subtype predicates.
These messages are not automatically turned on by the use of @option{-gnatwa}.
@item -gnatw.L
-- --
-- S p e c --
-- --
--- Copyright (C) 1998-2011, Free Software Foundation, Inc. --
+-- Copyright (C) 1998-2012, Free Software Foundation, Inc. --
-- --
-- GNARL is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
Abandon_Instantiation (Actual);
end if;
- Check_Mode_Conformant
+ -- In Ada 2012, actuals for access_to_subprograms must be subtype
+ -- conformant with the generic formal. Previous to AI05-288 only mode
+ -- conformance was required.
+
+ Check_Subtype_Conformant
(Designated_Type (Act_T),
Designated_Type (A_Gen_T),
Actual,
Check_Controlled_Array_Attribute (DS);
- -- The index is not processed during the analysis of a
- -- quantified expression but delayed to its expansion where the
- -- quantified expression is transformed into an expression with
- -- actions.
+ -- The index is not processed during analysis of a quantified
+ -- expression but delayed to its expansion where the quantified
+ -- expression is transformed into an expression with actions.
if Nkind (Parent (N)) /= N_Quantified_Expression
or else Operating_Mode = Check_Semantics
(New_Id : Entity_Id;
Old_Id : Entity_Id;
Err_Loc : Node_Id := Empty;
- Skip_Controlling_Formals : Boolean := False)
+ Skip_Controlling_Formals : Boolean := False;
+ Get_Inst : Boolean := False)
is
Result : Boolean;
pragma Warnings (Off, Result);
begin
Check_Conformance
(New_Id, Old_Id, Subtype_Conformant, True, Result, Err_Loc,
- Skip_Controlling_Formals => Skip_Controlling_Formals);
+ Skip_Controlling_Formals => Skip_Controlling_Formals,
+ Get_Inst => Get_Inst);
end Check_Subtype_Conformant;
---------------------------
type Conformance_Type is
(Type_Conformant, Mode_Conformant, Subtype_Conformant, Fully_Conformant);
- pragma Ordered (Conformance_Type);
+ -- pragma Ordered (Conformance_Type);
-- Conformance type used in conformance checks between specs and bodies,
-- and for overriding. The literals match the RM definitions of the
-- corresponding terms. This is an ordered type, since each conformance
(New_Id : Entity_Id;
Old_Id : Entity_Id;
Err_Loc : Node_Id := Empty;
- Skip_Controlling_Formals : Boolean := False);
+ Skip_Controlling_Formals : Boolean := False;
+ Get_Inst : Boolean := False);
-- Check that two callable entities (subprograms, entries, literals)
-- are subtype conformant, post error message if not (RM 6.3.1(16)),
-- the flag being placed on the Err_Loc node if it is specified, and