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;

Reply via email to