+2015-10-26 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_ch12.adb (Analyze_Formal_Package_Declaration): Code clean up.
+ * sem_ch13.adb (Check_Inherited_Indexing): New inner procedure
+ of Check_Indexing_Functions, to verify that a derived type with an
+ Indexing aspect is not inheriting such an aspect from an ancestor.
+ (Check_Indexing_Functions): Call Check_Inherited_Indexing within
+ an instance.
+
2015-10-26 Gary Dismukes <dismukes@adacore.com>
* a-reatim.adb, contracts.adb, contracts.ads: Minor reformatting and
procedure Check_Indexing_Functions is
Indexing_Found : Boolean := False;
+ procedure Check_Inherited_Indexing;
+ -- For a derived type, check that no indexing aspect is specified
+ -- for the type if it is also inherited
+
procedure Check_One_Function (Subp : Entity_Id);
-- Check one possible interpretation. Sets Indexing_Found True if a
-- legal indexing function is found.
-- Diagnose illegal indexing function if not overloaded. In the
-- overloaded case indicate that no legal interpretation exists.
+ ------------------------------
+ -- Check_Inherited_Indexing --
+ ------------------------------
+
+ procedure Check_Inherited_Indexing is
+ Inherited : Node_Id;
+
+ begin
+ if Attr = Name_Constant_Indexing then
+ Inherited :=
+ Find_Aspect (Etype (Ent), Aspect_Constant_Indexing);
+ else pragma Assert (Attr = Name_Variable_Indexing);
+ Inherited :=
+ Find_Aspect (Etype (Ent), Aspect_Variable_Indexing);
+ end if;
+
+ if Present (Inherited) then
+ if Debug_Flag_Dot_XX then
+ null;
+
+ -- OK if current attribute_definition_clause is expansion
+ -- of inherited aspect.
+
+ elsif Aspect_Rep_Item (Inherited) = N then
+ null;
+
+ -- Indicate the operation that must be overridden, rather
+ -- than redefining the indexing aspect
+
+ else
+ Illegal_Indexing
+ ("indexing function already inherited "
+ & "from parent type");
+ Error_Msg_NE
+ ("!override & instead",
+ N, Entity (Expression (Inherited)));
+ end if;
+ end if;
+ end Check_Inherited_Indexing;
+
------------------------
-- Check_One_Function --
------------------------
("indexing function must have at least two parameters");
return;
- -- For a derived type, check that no indexing aspect is specified
- -- for the type if it is also inherited
-
elsif Is_Derived_Type (Ent) then
- declare
- Inherited : Node_Id;
-
- begin
- if Attr = Name_Constant_Indexing then
- Inherited :=
- Find_Aspect (Etype (Ent), Aspect_Constant_Indexing);
- else pragma Assert (Attr = Name_Variable_Indexing);
- Inherited :=
- Find_Aspect (Etype (Ent), Aspect_Variable_Indexing);
- end if;
-
- if Present (Inherited) then
- if Debug_Flag_Dot_XX then
- null;
-
- -- Indicate the operation that must be overridden, rather
- -- than redefining the indexing aspect
-
- else
- Illegal_Indexing
- ("indexing function already inherited "
- & "from parent type");
- Error_Msg_NE
- ("!override & instead",
- N, Entity (Expression (Inherited)));
- return;
- end if;
- end if;
- end;
+ Check_Inherited_Indexing;
end if;
if not Check_Primitive_Function (Subp) then
begin
if In_Instance then
- return;
+ Check_Inherited_Indexing;
end if;
Analyze (Expr);