sem_ch3.adb (Analyze_Object_Declaration): Swap a couple of tests in a condition so...
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 20 Nov 2014 10:56:01 +0000 (10:56 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Thu, 20 Nov 2014 10:56:01 +0000 (11:56 +0100)
2014-11-20  Eric Botcazou  <ebotcazou@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.

From-SVN: r217834

gcc/ada/ChangeLog
gcc/ada/exp_util.ads
gcc/ada/sem_ch3.adb

index e12e368..d2746e1 100644 (file)
@@ -1,3 +1,10 @@
+2014-11-20  Eric Botcazou  <ebotcazou@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.
+
 2014-11-20  Pascal Obry  <obry@adacore.com>
 
        * adaint.c (remove_handle): New local routine without a lock.
index c0edb4b..671b13a 100644 (file)
@@ -507,6 +507,10 @@ package Exp_Util is
    --  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;
index db348d7..28b4471 100644 (file)
@@ -3648,8 +3648,13 @@ package body Sem_Ch3 is
 
          if Comes_From_Source (N)
            and then Expander_Active
-           and then Present (Following_Address_Clause (N))
            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))
          then
             Set_Etype (E, T);