* [COMMITTED] ada: Avoid repeated iteration over private protected components
@ 2022-11-04 13:58 Marc Poulhiès
0 siblings, 0 replies; only message in thread
From: Marc Poulhiès @ 2022-11-04 13:58 UTC (permalink / raw)
To: gcc-patches; +Cc: Piotr Trojanek
From: Piotr Trojanek <trojanek@adacore.com>
The First_Entity/Next_Entity chain includes private entities, so there
it no need to iterate starting both from First_Entity and
First_Private_Entity.
Code cleanup related to improved detection of references to
uninitialized objects; behavior is unaffected.
gcc/ada/
* sem_util.adb
(Check_Components): Iterate using
First/Next_Component_Or_Discriminant.
(Has_Preelaborable_Initialization): Avoid repeated iteration with
calls to Check_Components with First_Entity and
First_Private_Entity.
(Is_Independent_Object_Entity): Tune indentation.
Tested on x86_64-pc-linux-gnu, committed on master.
---
gcc/ada/sem_util.adb | 25 +++++++++++--------------
1 file changed, 11 insertions(+), 14 deletions(-)
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index 9a7640b3147..536d5fadefb 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -13679,15 +13679,12 @@ package body Sem_Util is
Exp : Node_Id;
begin
- -- Loop through entities of record or protected type
+ -- Loop through components and discriminants of record or protected
+ -- type.
- Ent := E;
+ Ent := First_Component_Or_Discriminant (E);
while Present (Ent) loop
- -- We are interested only in components and discriminants
-
- Exp := Empty;
-
case Ekind (Ent) is
when E_Component =>
@@ -13698,6 +13695,8 @@ package body Sem_Util is
if Present (Declaration_Node (Ent)) then
Exp := Expression (Declaration_Node (Ent));
+ else
+ Exp := Empty;
end if;
when E_Discriminant =>
@@ -13710,7 +13709,7 @@ package body Sem_Util is
Exp := Discriminant_Default_Value (Ent);
when others =>
- goto Check_Next_Entity;
+ raise Program_Error;
end case;
-- A component has PI if it has no default expression and the
@@ -13731,8 +13730,7 @@ package body Sem_Util is
exit;
end if;
- <<Check_Next_Entity>>
- Next_Entity (Ent);
+ Next_Component_Or_Discriminant (Ent);
end loop;
end Check_Components;
@@ -13842,7 +13840,7 @@ package body Sem_Util is
-- If OK, check extension components (if any)
if Has_PE and then Is_Record_Type (E) then
- Check_Components (First_Entity (E));
+ Check_Components (E);
end if;
-- Check specifically for 10.2.1(11.4/2) exception: a controlled type
@@ -13882,7 +13880,7 @@ package body Sem_Util is
elsif Is_Record_Type (E) then
Has_PE := True;
- Check_Components (First_Entity (E));
+ Check_Components (E);
-- Protected types must not have entries, and components must meet
-- same set of rules as for record components.
@@ -13892,8 +13890,7 @@ package body Sem_Util is
Has_PE := False;
else
Has_PE := True;
- Check_Components (First_Entity (E));
- Check_Components (First_Private_Entity (E));
+ Check_Components (E);
end if;
-- Type System.Address always has preelaborable initialization
@@ -18305,7 +18302,7 @@ package body Sem_Util is
Is_Object (Id)
and then (Is_Independent (Id)
or else
- Is_Independent (Etype (Id)));
+ Is_Independent (Etype (Id)));
end Is_Independent_Object_Entity;
-------------------------------------
--
2.34.1
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-11-04 13:58 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-04 13:58 [COMMITTED] ada: Avoid repeated iteration over private protected components Marc Poulhiès
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).