sem_attr.adb (Analyze_Attribute, [...]): Handle properly a quantified expression...
authorEd Schonberg <schonberg@adacore.com>
Mon, 1 Aug 2011 08:59:50 +0000 (08:59 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 1 Aug 2011 08:59:50 +0000 (10:59 +0200)
2011-08-01  Ed Schonberg  <schonberg@adacore.com>

* sem_attr.adb (Analyze_Attribute, case 'Result): Handle properly a
quantified expression that appears within a postcondition and uses the
Ada2012 'Result attribute.

From-SVN: r177001

gcc/ada/ChangeLog
gcc/ada/sem_attr.adb

index 3ca191c576977b3b3ec6dde601dfbbdca6f90000..46032fdff3bfa4dfdc1e738a7c68b085c48b6024 100644 (file)
@@ -1,3 +1,9 @@
+2011-08-01  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_attr.adb (Analyze_Attribute, case 'Result): Handle properly a
+       quantified expression that appears within a postcondition and uses the
+       Ada2012 'Result attribute.
+
 2011-07-28  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * init.c (__gnat_error_handler): Cast reason to int.
index b2c7a835674b81d4b69f020075e74a8878ef30e4..734c1a723c69a14d2e78c4b1868efd264df9c657 100644 (file)
@@ -3947,14 +3947,29 @@ package body Sem_Attr is
       ------------
 
       when Attribute_Result => Result : declare
-         CS : Entity_Id := Current_Scope;
-         PS : Entity_Id := Scope (CS);
+         CS : Entity_Id;
+         --  The enclosing scope, excluding loops for quantified expressions
+
+         PS : Entity_Id;
+         --  During analysis, CS is the postcondition subprogram and PS the
+         --  source subprogram to which the postcondition applies. During
+         --  pre-analysis, CS is the scope of the subprogram declaration.
 
       begin
+         --  Find enclosing scopes, excluding loops
+
+         CS := Current_Scope;
+         while Ekind (CS) = E_Loop loop
+            CS := Scope (CS);
+         end loop;
+
+         PS := Scope (CS);
+
          --  If the enclosing subprogram is always inlined, the enclosing
          --  postcondition will not be propagated to the expanded call.
 
-         if Has_Pragma_Inline_Always (PS)
+         if not In_Spec_Expression
+           and then Has_Pragma_Inline_Always (PS)
            and then Warn_On_Redundant_Constructs
          then
             Error_Msg_N
@@ -3994,9 +4009,7 @@ package body Sem_Attr is
          --  current one.
 
          else
-            while Present (CS)
-              and then CS /= Standard_Standard
-            loop
+            while Present (CS) and then CS /= Standard_Standard loop
                if Chars (CS) = Name_uPostconditions then
                   exit;
                else
@@ -4038,7 +4051,7 @@ package body Sem_Attr is
             else
                Error_Attr
                  ("% attribute can only appear" &
-                   "  in function Postcondition pragma", P);
+                   " in function Postcondition pragma", P);
             end if;
          end if;
       end Result;