* [Ada] Warn when interfaces swapped between full and partial view
@ 2021-11-10 8:58 Pierre-Marie de Rodat
0 siblings, 0 replies; only message in thread
From: Pierre-Marie de Rodat @ 2021-11-10 8:58 UTC (permalink / raw)
To: gcc-patches; +Cc: Etienne Servais
[-- Attachment #1: Type: text/plain, Size: 762 bytes --]
The following package declaration is legal but the declaration of D
leads to performing a tree transformation. Defining D as `type D is new
B and A with null record` would be consistent with the partial view and
thus does not require any transformation.
This is helpful in the case of generic packages where we fail to
correctly transform the tree.
package E is
type A is interface;
type B is interface and A;
type D is new B with private;
private
type D is new A and B with null record;
end;
Tested on x86_64-pc-linux-gnu, committed on trunk
gcc/ada/
* sem_ch3.adb (Derived_Type_Declaration): Introduce a subprogram
for tree transformation. If a tree transformation is performed,
then warn that it would be better to reorder the interfaces.
[-- Attachment #2: patch.diff --]
[-- Type: text/x-diff, Size: 4268 bytes --]
diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb
--- a/gcc/ada/sem_ch3.adb
+++ b/gcc/ada/sem_ch3.adb
@@ -17258,10 +17258,46 @@ package body Sem_Ch3 is
and then Is_Interface (Parent_Type)
then
declare
- Iface : Node_Id;
Partial_View : Entity_Id;
Partial_View_Parent : Entity_Id;
- New_Iface : Node_Id;
+
+ function Reorder_Interfaces return Boolean;
+ -- Look for an interface in the full view's interface list that
+ -- matches the parent type of the partial view, and when found,
+ -- rewrite the full view's parent with the partial view's parent,
+ -- append the full view's original parent to the interface list,
+ -- recursively call Derived_Type_Definition on the full type, and
+ -- return True. If a match is not found, return False.
+ -- ??? This seems broken in the case of generic packages.
+
+ ------------------------
+ -- Reorder_Interfaces --
+ ------------------------
+
+ function Reorder_Interfaces return Boolean is
+ Iface : Node_Id;
+ New_Iface : Node_Id;
+ begin
+ Iface := First (Interface_List (Def));
+ while Present (Iface) loop
+ if Etype (Iface) = Etype (Partial_View) then
+ Rewrite (Subtype_Indication (Def),
+ New_Copy (Subtype_Indication (Parent (Partial_View))));
+
+ New_Iface :=
+ Make_Identifier (Sloc (N), Chars (Parent_Type));
+ Append (New_Iface, Interface_List (Def));
+
+ -- Analyze the transformed code
+
+ Derived_Type_Declaration (T, N, Is_Completion);
+ return True;
+ end if;
+
+ Next (Iface);
+ end loop;
+ return False;
+ end Reorder_Interfaces;
begin
-- Look for the associated private type declaration
@@ -17282,30 +17318,26 @@ package body Sem_Ch3 is
then
null;
- -- Traverse the list of interfaces of the full-view to look
- -- for the parent of the partial-view and perform the tree
- -- transformation.
+ -- Traverse the list of interfaces of the full view to look
+ -- for the parent of the partial view and reorder the
+ -- interfaces to match the order in the partial view,
+ -- if needed.
else
- Iface := First (Interface_List (Def));
- while Present (Iface) loop
- if Etype (Iface) = Etype (Partial_View) then
- Rewrite (Subtype_Indication (Def),
- New_Copy (Subtype_Indication
- (Parent (Partial_View))));
-
- New_Iface :=
- Make_Identifier (Sloc (N), Chars (Parent_Type));
- Append (New_Iface, Interface_List (Def));
- -- Analyze the transformed code
+ if Reorder_Interfaces then
+ -- Having the interfaces listed in any order is legal.
+ -- However, the compiler does not properly handle
+ -- different orders between partial and full views in
+ -- generic units. We give a warning about the order
+ -- mismatch, so the user can work around this problem.
- Derived_Type_Declaration (T, N, Is_Completion);
- return;
- end if;
+ Error_Msg_N ("??full declaration does not respect " &
+ "partial declaration order", T);
+ Error_Msg_N ("\??consider reordering", T);
- Next (Iface);
- end loop;
+ return;
+ end if;
end if;
end if;
end;
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2021-11-10 8:58 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-10 8:58 [Ada] Warn when interfaces swapped between full and partial view Pierre-Marie de Rodat
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).