Commit 5291985c by Ed Schonberg Committed by Pierre-Marie de Rodat

[Ada] Crash on named actual in postcondition for generic subprogram

This patch fixes a crash on compiling the postcondtion for a generic
subprogram, when the postcondition is a call with both positional and
named parameter associations.

2019-07-08  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

	* sem_ch13.adb (Analyze_Aspect_Specifications): For a
	pre/postcondition of a generic subprogram declaration, do not
	use Relocate_Node on the aspect expression to construct the
	corresponding attribute specification, to prevent tree anomalies
	when the expression is a call with named actual parameters.

gcc/testsuite/

	* gnat.dg/predicate9.adb: New testcase.

From-SVN: r273201
parent b91cdf75
2019-07-08 Ed Schonberg <schonberg@adacore.com>
* sem_ch13.adb (Analyze_Aspect_Specifications): For a
pre/postcondition of a generic subprogram declaration, do not
use Relocate_Node on the aspect expression to construct the
corresponding attribute specification, to prevent tree anomalies
when the expression is a call with named actual parameters.
2019-07-08 Javier Miranda <miranda@adacore.com> 2019-07-08 Javier Miranda <miranda@adacore.com>
* sem_attr.adb (Analyze_Attribute [Attribute_Size]): For pragmas * sem_attr.adb (Analyze_Attribute [Attribute_Size]): For pragmas
......
...@@ -3495,12 +3495,28 @@ package body Sem_Ch13 is ...@@ -3495,12 +3495,28 @@ package body Sem_Ch13 is
-- because subsequent visibility analysis of the aspect -- because subsequent visibility analysis of the aspect
-- depends on this sharing. This should be cleaned up??? -- depends on this sharing. This should be cleaned up???
Make_Aitem_Pragma -- If the context is generic or involves ASIS, we want
(Pragma_Argument_Associations => New_List ( -- to preserve the original tree, and simply share it
Make_Pragma_Argument_Association (Eloc, -- between aspect and generated attribute. This parallels
Chars => Name_Check, -- what is done in sem_prag.adb (see Get_Argument).
Expression => Relocate_Node (Expr))),
Pragma_Name => Pname); declare
New_Expr : Node_Id;
begin
if ASIS_Mode or else Inside_A_Generic then
New_Expr := Expr;
else
New_Expr := Relocate_Node (Expr);
end if;
Make_Aitem_Pragma
(Pragma_Argument_Associations => New_List (
Make_Pragma_Argument_Association (Eloc,
Chars => Name_Check,
Expression => New_Expr)),
Pragma_Name => Pname);
end;
-- Add message unless exception messages are suppressed -- Add message unless exception messages are suppressed
......
2019-07-08 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/predicate9.adb: New testcase.
2019-07-08 Justin Squirek <squirek@adacore.com> 2019-07-08 Justin Squirek <squirek@adacore.com>
* gnat.dg/sso16.adb: New testcase. * gnat.dg/sso16.adb: New testcase.
......
-- { dg-do compile }
procedure Predicate9 is
function Num (x : Integer) return Integer is (X + 1);
function name (X : String) return Integer is (X'Size);
function Post (One : Integer; Two : Integer) return Boolean;
generic
type T is private;
procedure Pro (Z : Integer) with Post =>
Post (Num (5), Two => Name ("yeah"));
function Post (One : Integer; Two : Integer) return Boolean
is (True);
procedure Pro (Z : Integer) is
begin
null;
end Pro;
begin
null;
end Predicate9;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment