This change makes is so that Following_Address_Clause is invoked only if this is really necessary from Analyze_Object_Declaration. This saves about 1% of the compilation time at low optimization levels. No functional changes.
Tested on x86_64-pc-linux-gnu, committed on trunk 2014-11-20 Eric Botcazou <ebotca...@adacore.com> * sem_ch3.adb (Analyze_Object_Declaration): Swap a couple of tests in a condition so Following_Address_Clause is invoked only if need be. * exp_util.ads (Following_Address_Clause): Add small note.
Index: sem_ch3.adb =================================================================== --- sem_ch3.adb (revision 217828) +++ sem_ch3.adb (working copy) @@ -3648,8 +3648,13 @@ if Comes_From_Source (N) and then Expander_Active + and then Nkind (E) = N_Aggregate + + -- Note the importance of doing this the following test after the + -- N_Aggregate test to avoid inefficiencies from too many calls to + -- the function Following_Address_Clause which can be expensive. + and then Present (Following_Address_Clause (N)) - and then Nkind (E) = N_Aggregate then Set_Etype (E, T); Index: exp_util.ads =================================================================== --- exp_util.ads (revision 217828) +++ exp_util.ads (working copy) @@ -507,6 +507,10 @@ -- current declarative part to look for an address clause for the object -- being declared, and returns the clause if one is found, returns -- Empty otherwise. + -- + -- Note: this function can be costly and must be invoked with special care. + -- Possibly we could introduce a flag at parse time indicating the presence + -- of an address clause to speed this up??? procedure Force_Evaluation (Exp : Node_Id;