From cb4881181631189b0921b8aaec239016b7c16b46 Mon Sep 17 00:00:00 2001 From: Justin Squirek Date: Thu, 11 Jan 2018 08:54:34 +0000 Subject: [PATCH] [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 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 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/par-ch6.adb | 22 ++++++++++++++++++++-- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/expr_func4.adb | 8 ++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/expr_func4.adb diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index fd0a8d33624..f66092d7e92 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2018-01-11 Justin Squirek + + * 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 * sem_ch6.adb (Analyze_Subprogram_Body_Helper): Check the diff --git a/gcc/ada/par-ch6.adb b/gcc/ada/par-ch6.adb index ddcedcae130..f9a54d28d5f 100644 --- a/gcc/ada/par-ch6.adb +++ b/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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e5b1c350c78..e5d9ddea599 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-01-11 Justin Squirek + + * gnat.dg/expr_func4.adb: New testcase. + 2018-01-11 Hristian Kirtchev * gnat.dg/pure_subp_body.adb, gnat.dg/pure_subp_body_pkg.ads: New diff --git a/gcc/testsuite/gnat.dg/expr_func4.adb b/gcc/testsuite/gnat.dg/expr_func4.adb new file mode 100644 index 00000000000..79fc43707fe --- /dev/null +++ b/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;