aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Trojanek <trojanek@adacore.com>2022-09-01 10:19:09 +0200
committerMarc Poulhiès <poulhies@adacore.com>2022-11-04 14:47:29 +0100
commit5f780a2d02d0b7c92a75ce1f749ffcc15b90fa32 (patch)
tree4f343220baceab180386719954b7f3fbf0cd5e89
parentcb3c260460073bed267fae3ee970947a24858211 (diff)
downloadgcc-5f780a2d02d0b7c92a75ce1f749ffcc15b90fa32.zip
gcc-5f780a2d02d0b7c92a75ce1f749ffcc15b90fa32.tar.gz
gcc-5f780a2d02d0b7c92a75ce1f749ffcc15b90fa32.tar.bz2
ada: Avoid repeated iteration over private protected components
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.
-rw-r--r--gcc/ada/sem_util.adb25
1 files changed, 11 insertions, 14 deletions
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index 9a7640b..536d5fa 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;
-------------------------------------