diff mbox series

[Ada] Fix handling of generic actuals with default expression in SPARK

Message ID 20181114114307.GA73861@adacore.com
State New
Headers show
Series [Ada] Fix handling of generic actuals with default expression in SPARK | expand

Commit Message

Pierre-Marie de Rodat Nov. 14, 2018, 11:43 a.m. UTC
Both in the GNAT frontend and in the GNATprove backend we have
several checks related to generic actuals of mode IN that rely on the
Corresponding_Generic_Association flag. However, this flag was only set
for actuals with explicit expressions from the generic instance and unset
for actuals with implicit expressions from the generic unit.

For example, the code from the added testcase was wrongly rejected with
a message that Y (which is an actual with a default expression) cannot
appear in the Initializes contract. Now this code is accepted.

Tested on x86_64-pc-linux-gnu, committed on trunk

2018-11-14  Piotr Trojanek  <trojanek@adacore.com>

gcc/ada/

	* sem_ch12.adb (Instantiate_Object): Set
	Corresponding_Generic_Association on generic actuals with
	default expression.
	* sinfo.ads (Corresponding_Generic_Association): Update comment.

gcc/testsuite/

	* gnat.dg/generic_actuals.adb: New testcase.
diff mbox series

Patch

--- gcc/ada/sem_ch12.adb
+++ gcc/ada/sem_ch12.adb
@@ -11097,6 +11097,9 @@  package body Sem_Ch12 is
                 Expression             => New_Copy_Tree
                                             (Default_Expression (Formal)));
 
+            Set_Corresponding_Generic_Association
+              (Decl_Node, Expression (Decl_Node));
+
             Append (Decl_Node, List);
             Set_Analyzed (Expression (Decl_Node), False);
 

--- gcc/ada/sinfo.ads
+++ gcc/ada/sinfo.ads
@@ -1106,9 +1106,11 @@  package Sinfo is
    --  Corresponding_Generic_Association (Node5-Sem)
    --    This field is defined for object declarations and object renaming
    --    declarations. It is set for the declarations within an instance that
-   --    map generic formals to their actuals. If set, the field points to
-   --    a generic_association which is the original parent of the expression
-   --    or name appearing in the declaration. This simplifies ASIS queries.
+   --    map generic formals to their actuals. If set, the field points either
+   --    to a copy of a default expression for an actual of mode IN or to a
+   --    generic_association which is the original parent of the expression or
+   --    name appearing in the declaration. This simplifies ASIS and GNATprove
+   --    queries.
 
    --  Corresponding_Integer_Value (Uint4-Sem)
    --    This field is set in real literals of fixed-point types (it is not

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/generic_actuals.adb
@@ -0,0 +1,18 @@ 
+--  { dg-do compile }
+--  { dg-options "-gnatd.F" }
+
+procedure Generic_Actuals with SPARK_Mode is
+   generic
+      X : Integer;
+      Y : Integer := 0;
+   package Q with Initializes => (XX => X, YY => Y) is
+      --  Both X and Y actuals can appear in the Initializes contract,
+      --  i.e. the default expression of Y should not matter.
+      XX : Integer := X;
+      YY : Integer := Y;
+   end Q;
+
+   package Inst is new Q (X => 0);
+begin
+   null;
+end Generic_Actuals;