This patch fixes an issue whereby an expression within an expression
function declaration or completion without proper parenthesization is
incorrectly accepted by the compiler.
Tested on x86_64-pc-linux-gnu, committed on trunk
2018-01-11 Justin Squirek <squi...@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.
--- gcc/ada/par-ch6.adb
+++ gcc/ada/par-ch6.adb
@@ -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
--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/expr_func4.adb
@@ -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;