[Ada] Fix bogus error for 'Value invoked on function call and -gnatVa

Eric Botcazou <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <23192853.EfDdHjke4D@arcturus>
This happens when the function takes an In Out or Out parameter, so only in 
Ada 2012 and later.  The mechanism used to implement the validity check for 
the call, required by -gnatVa, inserts the copy-out statement incorrectly.

Tested on x86-64/Linux, applied on the mainline.

Jakub or Richard, I'd like to backport it for the 16.2 release, since it's a 
trivial 1-liner that cannot break anything, instead of waiting for 16.3.


2026-07-31  Eric Botcazou  <[email protected]>

	PR ada/126379
	* exp_ch6.adb (Insert_Post_Call_Actions): Also deal with attribute
	references as parent node.


2026-07-31  Eric Botcazou  <[email protected]>

	* gnat.dg/validity_check3.adb: New test.

-- 
Eric Botcazou
pr126379.diff (text/x-patch, 1.1 KB)
diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb
index d9ab5ee108c..53f88968961 100644
--- a/gcc/ada/exp_ch6.adb
+++ b/gcc/ada/exp_ch6.adb
@@ -7859,13 +7859,14 @@ package body Exp_Ch6 is
          return;
       end if;
 
-      --  Cases where the call is not a member of a statement list. This also
-      --  includes the cases where the call is an actual in another function
-      --  call, or is an index, or is an operand of an if-expression, i.e. is
-      --  in an expression context.
+      --  Cases where the call is not a member of a statement list, or cases
+      --  where the call is an actual in an attribute reference, or in another
+      --  function call, or is an index, or is an operand of an if-expression,
+      --  i.e. is in an expression context.
 
       if not Is_List_Member (N)
-        or else Nkind (Context) in N_Function_Call
+        or else Nkind (Context) in N_Attribute_Reference
+                                 | N_Function_Call
                                  | N_If_Expression
                                  | N_Indexed_Component
       then
validity_check3.adb (text/x-adasrc, 509 B)
--  { dg-do compile }
--  { dg-options "-gnatVa" }

procedure Validity_Check3 is

   type Selection is (First, Second);

   function Next_Value (Text     : String;
                        Position : in out Positive) return String is
   begin
      Position := Position + 1;
      return Text;
   end Next_Value;

   Position : Positive := 1;
   Value    : constant Selection :=
     Selection'Value (Next_Value ("First", Position));

begin
   if Value /= First then
      raise Program_Error;
   end if;
end;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.