From: pmderodat Date: Thu, 11 Jan 2018 08:54:34 +0000 (+0000) Subject: [Ada] No error on missing enclosing parentheses in Expression Function X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0d4b381dc60610e115241f24ddeabb33e45501d4;p=thirdparty%2Fgcc.git [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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@256517 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index fd0a8d336249..f66092d7e92f 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 ddcedcae1304..f9a54d28d5fa 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 e5b1c350c780..e5d9ddea5991 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 000000000000..79fc43707feb --- /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;