This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Ada] Implement new Ada 2005 features (e.g. interfaces)


Tested on i686-linux, committed on mainline.

A set of changes to implement many new Ada 2005 features as
described in the AIs mentioned below.
--
Give support to Ada 2005 interfaces (AI-251). A detailed description is
available at:
   http://www.ada-auth.org/cgi-bin/cvsweb.cgi/AIs/AI-00251.TXT
---
Complete the implementation of AI-260-02 which is a
simple extension of the predefined package Ada.Tags to have a Parent_Tag
operation and a constant No_Tag that is the default value of tags.
The existing operations Expanded_Name and External_Tag are now defined
to raise Tag_Error when passed a tag whose value is No_Tag (as is the
new function Parent_Tag). The GNAT implementation already defined
Parent_Tag as a private operation, which was exported for use by
s-finimp. Now that the function is visible, s-finimp no longer needs
to import it.
---
Part of implementation of AI-406
Meeting C++ half-way... Anonymous access types can now be used in object
declarations. The following compiles properly in Ada2005:
--
package Pack is
   type TT is record
      value : integer;
   end record;
   Thing : aliased TT;
   type ATT is access all TT;
   type AATT is access all ATT;
   X: aliased access TT := new TT' (Thing);
   Y: aliased constant access TT := Thing'access;
   Z: constant access TT := Y;
   Maybe : boolean := X.all = Y.all;
   Also  : Boolean := X = Y;
   R: access TT renames X;
   Ptr : aliased ATT := ATT (X);
   AX: AATT := Ptr'access;
end pack;
--
Part of implementation of AI-248, 348, 363, 397
--
Part of implementation of AI-218
This AI extends the syntax of several constructs that declare subprograms,
with an overriding indicator. Must_Override is an indication that the
subprogram must override an inherited operation at the point of the
declaration. Must_Not_Override is an indication that the subprogram does
not override an inherited operation either at the point of declaration or
later in the program, as may happen if an operation is inherited by the
elaboration of a full view, when the subprogram declaration itself appears
in the visible part.
--
Part of implementation of AI-230 and AI-385
This set of changes is mainly aimed at completing the work for applying
proper accessibility checks on operations that assign values to components
and stand-alone objects with an anonymous access type (for AI-230 and
AI-385). Both static and run-time checks are needed, and these are ensured
by inserting implicit conversions of certain operands to the anonymous
access types. Specifically, such conversions are applied in the case of
assignment statements and aggregate component associations. The cases of
assignments done as part of object declaration and component default
initialization do not require these conversions, because accessibility
checks cannot fail in those contexts. The test for performing static checks
in Valid_Conversion was revised to check the recently added flag Is_Local_
Anonymous_Access rather than testing that the type is not anonymous, since
checks are now needed for the new anonymous object and component cases.
There were also changes to set the flag on access discriminants of a
nonlimited type, a new case in Ada 2005, and to avoid doing the special
access discriminant checks in Valid_Conversion for the nonlimited case.
Other revisions done with this set of changes are to allow an access
definition to be given for a deferred constant (with a check that the
full declaration matches), and addition of "Ada 05" warnings for objects
declared as "constant access" and "aliased [constant] access".
--
Implementation of AI-246
This AI fixes a language gap that allowed unsafe conversions between
limited arrays whose components may have incompatible representation
clauses. The problem was addressed by the ARG a number of years ago, but
to insure compatibility with old ACATS tests, GNAT treated the case as
a warning, not an error.

2005-06-14  Gary Dismukes  <dismukes@adacore.com>
	    Javier Miranda  <miranda@adacore.com>
	    Ed Schonberg  <schonberg@adacore.com>
	    Hristian Kirtchev  <kirtchev@adacore.com>

	* exp_ch4.adb (Expand_Allocator_Expression): When an initialized
	allocator's designated type is a class-wide type, and compiling for
	Ada 2005, emit a run-time check that the accessibility level of the
	type given in the allocator's expression is not deeper than the level
	of the allocator's access type.

	(Tagged_Membership): Modified to gives support to abstract interface
	types.

	* a-tags.ads, a-tags.adb (type Type_Specific_Data): Add component
	Access_Level.
	(Descendant_Tag): New predefined function
	(Is_Descendant_At_Same_Level): New predefined function
	(Get_Access_Level): New private function
	(Set_Access_Level): New private procedure
	(IW_Membership): New function. Given the tag of an object and the tag
	associated with an interface, evaluate if the object implements the
	interface.
	(Register_Interface_Tag): New procedure used to initialize the table of
	interfaces used by the IW_Membership function.
	(Set_Offset_To_Top): Initialize the Offset_To_Top field in the prologue
	of the dispatch table.
	(Inherit_TSD): Modified to copy the table of ancestor tags plus the
	table of interfaces of the parent.
	(Expanded_Name): Raise Tag_Error if the passed tag equals No_Tag.
	(External_Tag): Raise Tag_Error if the passed tag equals No_Tag.
	(Parent_Tag): Return No_Tag in the case of a root-level tagged type,
	and raise Tag_Error if the passed tag equalis No_Tag, to conform with
	Ada 2005 semantics for the new predefined function.

	* exp_attr.adb (Expand_N_Attribute, case Attribute_Input): Generate
	call to Descendant_Tag rather than Internal_Tag.
	(Expand_N_Attribute, case Attribute_Output): Emit a check to ensure that
	the accessibility level of the attribute's Item parameter is not deeper
	than the level of the attribute's prefix type. Tag_Error is raised if
	the check fails. The check is only emitted for Ada_05.
	(Find_Stream_Subprogram): If a TSS exists on the type itself for the
	requested stream attribute, use it.
	(Expand_N_Attribute_Reference): If the designated type is an interface
	then rewrite the referenced object as a conversion to force the
	displacement of the pointer to the secondary dispatch table.
	(Expand_N_Attribute_Reference, case 'Constrained): Return false if this
	is a dereference of an object with a constrained partial view.

	* exp_ch5.adb (Expand_N_Return_Statement): When a function's result
	type is a class-wide type, emit a run-time check that the accessibility
	level of the returned object is not deeper than the level of the
	function's master (only when compiling for Ada 2005).

	* exp_disp.ads, exp_disp.adb (Ada_Actions, Action_Is_Proc,
	Action_Nb_Arg): Add entries for new Get_Access_Level and
	Set_Access_Level routines in these tables.
	(Make_DT): Generate a call to set the accessibility level of the
	tagged type in its TSD.
	(Make_DT): Code cleanup. The functionality of generating all the
	secondary dispatch tables has been moved to freeze_record_type.
	(Make_Abstract_Interface_DT): Minor code cleanup.
	(Set_All_DT_Position): Code cleanup. As part of the code cleanup
	this subprogram implements a new algorithm that provides the
	same functionality and it is more clear in case of primitives
	associated with abstract interfaces.
	(Set_All_Interfaces_DTC_Entity): Removed. As part of the code
	clean up, the functionality of this subprogram is now provided
	by Set_All_DT_Position.
	(Write_DT): New subprogram: a debugging procedure designed to be called
	within gdb to display the dispatch tables associated with a tagged
	type.
	(Collect_All_Interfaces): New subprogram that collects the whole list
	of interfaces that are directly or indirectly implemented by a tagged
	type.
	(Default_Prim_Op_Position): New subprogram that returns the fixed
	position in the dispatch table of the default primitive operations.
	(Expand_Interface_Actuals): New subprogram to generate code that
	displaces all the actuals corresponding to class-wide interfaces to
	reference the interface tag of the actual object.
	(Expand_Interface_Conversion): New subprogram. Reference the base of
	the object to give access to the interface tag associated with the
	secondary dispatch table.
	(Expand_Interface_Thunk): New subprogram that generates the code of the
	thunk. This is required for compatibility with the C+ ABI.
	(Make_Abstract_Interface_DT): New subprogram that generate the
	declarations for the secondary dispatch tables associated with an
	abstract interface.
	(Set_All_Interfaces_DTC_Entity): New subprogram that sets the DTC_Entity
	attribute for each primitive operation covering interface subprograms
	(Expand_Dispatching_Call, Fill_DT_Entry, Make_DT, Set_All_DT_Position):
	These subprograms were upgraded to give support to abstract interfaces

	* rtsfind.ads (type RE_Id): Add RE_Descendant_Tag,
	RE_Is_Descendant_At_Same_Level, RE_Get_Access_Level, and
	RE_Set_Access_Level.
	(RE_Unit_Table): Add entries for new Ada.Tags operations.
	Add support to call the followig new run-time subprograms:
	IW_Membership, Register_Interface_Tag, and Set_Offset_To_Top

	* sem_ch3.adb (Constant_Redeclaration): Allow a deferred constant to
	match its full declaration when both have an access definition with
	statically matching designated subtypes.
	(Analyze_Component_Declaration): Delete commented out code that was
	incorrectly setting the scope of an anonymous access component's type.
	(Process_Discriminants): Set Is_Local_Anonymous_Access for the type of
	an access discriminant when the containing type is nonlimited.
	(Make_Incomplete_Type_Declaration): Create an incomplete type
	declaration for a record type that includes self-referential access
	components.
	(Check_Anonymous_Access_Types): Before full analysis of a record type
	declaration, create anonymous access types for each self-referential
	access component.
	(Analyze_Component_Declaration, Array_Type_Declaration): Indicate that
	an access component in this context is a Local_Anonymous_Access, for
	proper accessibility checks.
	(Access_Definition): Set properly the scope of the anonymous access type
	created for a stand-alone access object.
	(Find_Type_Of_Object): An object declaration may be given with an access
	definition.
	(Complete_Subprograms_Derivation): New subprogram used to complete
	type derivation of private tagged types implementing interfaces.
	In this case some interface primitives may have been overriden
	with the partial-view and, instead of re-calculating them, they
	are included in the list of primitive operations of the full-view.
	(Build_Derived_Record_Type): Modified to give support to private
	types implemening interfaces.
	(Access_Definition): Reject ALL on anonymous access types.
	(Build_Derived_Record_Type): In the case of Ada 2005, allow a tagged
	type derivation to occur at a deeper accessibility level than the
	parent type.
	For the case of derivation within a generic body however, disallow the
	derivation if the derived type has an ancestor that is a formal type
	declared in the formal part of an enclosing generic.
	(Analyze_Object_Declaration): For protected objects, remove the check
	that they cannot contain interrupt handlers if not declared at library
	level.
	(Add_Interface_Tag_Components): New subprogram to add the tag components
	corresponding to all the abstract interface types implemented by a
	record type or a derived record type.
	(Analyze_Private_Extension_Declaration, Build_Derived_Record_Type,
	Derived_Type_Declaration, Find_Type_Name, Inherit_Components,
	Process_Full_View, Record_Type_Declaration): Modified to give
	support to abstract interface types
	(Collect_Interfaces): New subprogram that collects the list of
	interfaces that are not already implemented by the ancestors
	(Process_Full_View): Set flag Has_Partial_Constrained_View appropriately
	when partial view has no discriminants and full view has defaults.
	(Constrain_Access): Reject a constraint on a general access type
	if the discriminants of the designated type have defaults.
	(Access_Subprogram_Declaration): Associate the Itype node with the inner
	full-type declaration or subprogram spec. This is required to handle
	nested anonymous declarations.
	(Analyze_Private_Extension_Declaration, Build_Derived_Record_Type,
	Derived_Type_Declaration, Find_Type_Name, Inherit_Components,
	Process_Full_View, Record_Type_Declaration): Modified to give
	support to abstract interface types
	(Derive_Subprograms): Addition of a new formal to indicate if
	we are in the case of an abstact-interface derivation
	(Find_Type_Of_Subtype_Indic): Moved from the body of the package
	to the specification because it is requied to analyze all the
	identifiers found in a list of interfaces

	* debug.adb: Complete documentation of flag "-gnatdZ"

	* exp_ch3.adb: Implement config version of persistent_bss pragma
	(Check_Stream_Attributes): Use Stream_Attribute_Available instead of
	testing for TSS presence to properly enforce visibility rules.
	(Freeze_Record_Type): Code cleanup. Modified to call the subprogram
	Make_Abstract_Interfaces_DT to generate the secondary tables
	associated with abstract interfaces.
	(Build_Init_Procedure): Modified to initialize all the tags
	corresponding.
	(Component_Needs_Simple_Initialization): Similar to other tags,
	interface tags do not need initialization.
	(Freeze_Record_Type): Modified to give support to abstract interface
	types.
	(Expand_N_Object_Declaration): Do not generate an initialization for
	a scalar temporary marked as internal.

	* exp_ch6.adb (Add_Simple_Call_By_Copy_Code): Handle properly an
	in-out parameter that is a component in an initialization procedure,
	whose constraint might depend on discriminants, and that may be
	misaligned because of packing or representation clauses.
	(Is_Legal_Copy): New predicate to determine whether a possibly
	misaligned in-out actual can actually be passed by copy/return. This
	is an error in case the type is by_reference, and a warning if this is
	the consequence of a DEC import pragma on the subprogram.
	(Expand_Call, Freeze_Subprogram): Modified to give support to abstract
	interface types
	(Expand_Inlined_Call): Mark temporary generated for the return value as
	internal, so that no useless scalar normalization is generated for it.
	(Expand_N_Subprogram_Declaration): Save unanalyzed body so calls to
	null procedure can always be inlined.
	(Expand_N_Subprogram_Declaration): If this is the declaration of a null
	procedure, generate an explicit empty body for it.

	* exp_util.ads, exp_util.adb (Find_Interface_ADT): New subprogram.
	Given a type implementing an interface, returns the corresponding
	access_disp_table value.
	(Find_Interface_Tag): New subprogram. Given a type implementing an
	interface, returns the record component containing the tag of the
	interface.
	(Find_Interface_Tag): New overloaded subprogram. Subsidiary to the
	previous ones that return the corresponding tag and access_disp_table
	entities.
	(Is_Predefined_Dispatching_Operation): Determines if a subprogram
	is a predefined primitive operation.
	(Expand_Subtype_From_Expr): If the expression is a selected component
	within an initialization procedure, compute its actual subtype, because
	the component may depend on the discriminants of the enclosing record.

	* i-cpp.ads, i-cpp.adb: 
	This package has been left available for compatibility with previous
	versions of the frontend. As part of the new layout this is now a
	dummy package that uses declarations available at a-tags.ads

	* par-ch3.adb (P_Identifier_Declarations): Give an error for use of
	"constant access" and "aliased [constant] access" when not compiling
	with -gnat05.
	Suppress Ada 2005 keyword warning if -gnatwY used
	(P_Identifier_Declarations): Add support for object declarations with
	access definitions.
	(Private_Extension_Declaration): Complete the documentation
	(P_Derived_Type_Def_Or_Private_Ext_Decl): Fill the inteface_list
	attribute in case of private extension declaration
	(P_Type_Declaration): Mark as "abstract" the type declarations
	corresponding with protected, synchronized and task interfaces
	(P_Declarative_Items): "not" and "overriding" are overriding indicators
	for a subprogram or instance declaration.

	* sem_ch12.adb (Analyze_Subprogram_Instantiation): Verify that an
	instantiation that is a dispatching operation has controlling access
	parameters that are null excluding.
	Save and restore Ada_Version_Explicit, for implementation of AI-362
	(Validate_Derived_Type_Instance): Add check for abstract interface
	types.
	(Analyze_Formal_Package): Establish Instantiation source for the copy of
	the generic that is created to represent the formal package.
	(Analyze_Package_Instantiation): Instantiate body immediately if the
	package is a predefined unit that contains inlined subprograms, and
	we are compiling for a Configurable_Run_Time.
	(Instantiate_Formal_Subprogram): Indicate that null default subprogram
	If the program has a null default, generate an empty body for it.

	* sem_ch6.adb, sem_ch9.adb (Analyze_Subprograms_Declaration): Update
	error message condition, null procedures are correctly detected now.
	(New_Overloaded_Entity): Bypass trivial overriding indicator check
	for subprograms in the context of protected types. Instead, the
	indicator is examined in Sem_Ch9 while analysing the subprogram
	declaration.
	(Check_Overriding_Indicator): Check consistency of overriding indicator
	on subprogram stubs as well.
	(Analyze_Subprogram_Declaration): Diagnose null procedures declared at
	the library level.
	(Analize_Subprogram_Specification): When analyzing a subprogram in which
	the type of the first formal is a concurrent type, replace this type
	by the corresponding record type.
	(Analyze_Subprogram_Body): Undo the previous work.
	(Analyze_Procedure_Call): If the call has the form Object.Op, the
	analysis of the prefix ends up analyzing the call itself, after which
	we are done.
	(Has_Interface_Formals): New subprogram subsidiary to analyze
	subprogram_specification that returns true if some non
	class-wide interface subprogram is found
	(New_Overloaded_Entity): Modified to give support to abstract
	interface types
	(Conforming_Types): In Ada 2005 mode, conformance checking of anonymous
	access to subprograms must be recursive.
	(Is_Unchecked_Conversion): Improve the test that recognizes
	instantiations of Unchecked_Conversion, and allows them in bodies that
	are to be inlined by the front-end. When the body comes from an
	instantiation, a reference to Unchecked_Conversion will be an
	Expanded_Name, even though the body has not been analyzed yet.
	Replace Is_Overriding and Not_Overriding in subprogram_indication with
	Must_Override and Must_Not_Override, to better express intent of AI.
	(Analyze_Subprogram_Body): If an overriding indicator is given, check
	that it is consistent with the overrinding status of the subprogram
	at this point.
	(Analyze_Subprogram_Declaration): Indicate that a null procedure is
	always inlined.
	If the subprogram is a null procedure, indicate that it does not need
	a completion.

	* sem_disp.adb (Check_Controlling_Type): Give support to entities
	available through limited-with clauses.
	(Check_Dispatching_Operation): A stub acts like a body, and therefore is
	allowed as the last primitive of a tagged type if it has no previous
	spec.
	(Override_Dispatching_Operation, Check_Dispatching_Operation): Modified
	to give support to abstract interface types

	* sem_res.adb (Valid_Conversion): Perform an accessibility level check
	in the case where the target type is an anonymous access type of an
	object or component (that is, when Is_Local_Anonymous_Access is true).
	Prevent the special checks for conversions of access discriminants in
	the case where the discriminant belongs to a nonlimited type, since
	such discriminants have their accessibility level defined in the same
	way as a normal component of an anonymous access type.
	(Resolve_Allocator): When an allocator's designated type is a class-wide
	type, check that the accessibility level of type given in the
	allocator's expression or subtype indication is not statically deeper
	than the level of the allocator's access type.
	(Check_Discriminant_Use): Diagnose discriminant given by an expanded
	name in a discriminant constraint of a record component.
	(Resolve_Explicit_Dereference): Do not check whether the type is
	incomplete when the dereference is a use of an access discriminant in
	an initialization procedure.
	(Resolve_Type_Conversion): Handle conversions to abstract interface
	types.
	(Valid_Tagged_Conversion): The conversion of a tagged type to an
	abstract interface type is always valid.
	(Valid_Conversion): Modified to give support to abstract interface types
	(Resolve_Actuals): Enable full error reporting on view conversions
	between unrelated by_reference array types.
	The rule for view conversions of arrays with aliased components is
	weakened in Ada 2005.
	Call to obsolescent subprogram is now considered to be a violation of
	pragma Restrictions (No_Obsolescent_Features).
	(Check_Direct_Boolean_Operator): If the boolean operation has been
	constant-folded, there is nothing to check.
	(Resolve_Comparison_Op, Resolve_Equality_Op, Resolve_Boolean_Op): Defer
	check on possible violation of restriction No_Direct_Boolean_Operators
	until after expansion of operands, to prevent spurious errors when
	operation is constant-folded.

	* sem_type.ads, sem_type.adb (Covers, Intersect_Types, Specific_Type,
	Has_Compatible_Type): Modified to give support to abstract interface
	types.
	(Interface_Present_In_Ancestor): New function to theck if some ancestor
	of a given type implements a given interface

	* sem_ch4.adb (Analyze_Call): Handle properly an indirect call whose
	prefix is a parameterless function that returns an access_to_procedure.
	(Transform_Object_Operation): Handle properly function calls of the
	form Obj.Op (X), which prior to analysis appear as indexed components.
	(Analyze_One_Call): Complete the error notification to help new Ada
	2005 users.
	(Analyze_Allocator): For an allocator without an initial value, where
	the designated type has a constrained partial view, a discriminant
	constraint is illegal.

Attachment: difs.13.bz2
Description: Binary data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]