[Ada] No error on missing enclosing parentheses in Expression Function

This patch fixes an issue whereby an expression within an expression
function declaration or completion without proper parenthesization is
incorrectly accepted by the compiler.

2018-01-11  Justin Squirek  <squirek@adacore.com>

gcc/ada/

	* par-ch6.adb (Scan_Body_Or_Expression_Function): Add additional check
	to make sure a given expression function is properly parenthesized.

gcc/testsuite/

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

From-SVN: r256517
This commit is contained in:
Justin Squirek 2018-01-11 08:54:34 +00:00 committed by Pierre-Marie de Rodat
parent ed27b86ba1
commit cb48811816
4 changed files with 37 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2018-01-11 Justin Squirek <squirek@adacore.com>
* par-ch6.adb (Scan_Body_Or_Expression_Function): Add additional check
to make sure a given expression function is properly parenthesized.
2018-01-11 Hristian Kirtchev <kirtchev@adacore.com>
* sem_ch6.adb (Analyze_Subprogram_Body_Helper): Check the

View File

@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
-- Copyright (C) 1992-2017, Free Software Foundation, Inc. --
-- Copyright (C) 1992-2018, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@ -873,7 +873,25 @@ package body Ch6 is
New_Node
(N_Expression_Function, Sloc (Specification_Node));
Set_Specification (Body_Node, Specification_Node);
Set_Expression (Body_Node, P_Expression);
declare
Expr : constant Node_Id := P_Expression;
begin
Set_Expression (Body_Node, Expr);
-- Check that the full expression is properly
-- parenthesized since we may have a left-operand that is
-- parenthesized but that is not one of the allowed cases
-- with syntactic parentheses.
if not (Paren_Count (Expr) /= 0
or else Nkind_In (Expr, N_Aggregate,
N_Extension_Aggregate,
N_Quantified_Expression))
then
Error_Msg ("expression function must be enclosed "
& "in parentheses", Sloc (Expr));
end if;
end;
-- Expression functions can carry pre/postconditions

View File

@ -1,3 +1,7 @@
2018-01-11 Justin Squirek <squirek@adacore.com>
* gnat.dg/expr_func4.adb: New testcase.
2018-01-11 Hristian Kirtchev <kirtchev@adacore.com>
* gnat.dg/pure_subp_body.adb, gnat.dg/pure_subp_body_pkg.ads: New

View File

@ -0,0 +1,8 @@
-- { dg-do compile }
procedure Test_Exp is
function X return Boolean is
(Integer'Size = 32) or else (Float'Size = 32); -- { dg-error "expression function must be enclosed in parentheses" }
begin
null;
end;