The perfect hash function generated by the compiler to speed up the Value
attribute of an enumeration type contains an implicit loop and, therefore,
violates the No_Implicit_Loops restriction when it is active.
Tested on x86_64-pc-linux-gnu, committed on trunk
gcc/ada/
* exp_imgv.adb: Add with and use clause for Restrict and Rident.
(Build_Enumeration_Image_Tables): Do not generate the hash function
if the No_Implicit_Loops restriction is active.
diff --git a/gcc/ada/exp_imgv.adb b/gcc/ada/exp_imgv.adb
--- a/gcc/ada/exp_imgv.adb
+++ b/gcc/ada/exp_imgv.adb
@@ -37,6 +37,8 @@ with Namet; use Namet;
with Nmake; use Nmake;
with Nlists; use Nlists;
with Opt; use Opt;
+with Restrict; use Restrict;
+with Rident; use Rident;
with Rtsfind; use Rtsfind;
with Sem_Aux; use Sem_Aux;
with Sem_Res; use Sem_Res;
@@ -160,6 +162,8 @@ package body Exp_Imgv is
Expression => Make_Aggregate (Loc, Expressions => V)));
end Append_Table_To;
+ -- Start of Build_Enumeration_Image_Tables
+
begin
-- Nothing to do for types other than a root enumeration type
@@ -247,7 +251,7 @@ package body Exp_Imgv is
Append_Table_To (Act, Eind, Nlit, Ityp, Ind);
-- If the number of literals is not greater than Threshold, then we are
- -- done. Otherwise we compute a (perfect) hash function for use by the
+ -- done. Otherwise we generate a (perfect) hash function for use by the
-- Value attribute.
if Nlit > Threshold then
@@ -283,11 +287,12 @@ package body Exp_Imgv is
-- If the unit where the type is declared is the main unit, and the
-- number of literals is greater than Threshold_For_Size when we are
- -- optimizing for size, and -gnatd_h is not specified, try to compute
- -- the hash function.
+ -- optimizing for size, and the restriction No_Implicit_Loops is not
+ -- active, and -gnatd_h is not specified, generate the hash function.
if In_Main_Unit
and then (Optimize_Size = 0 or else Nlit > Threshold_For_Size)
+ and then not Restriction_Active (No_Implicit_Loops)
and then not Debug_Flag_Underscore_H
then
declare