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;

Reply via email to