[Ada] No error on missing enclosing parentheses in Expression Function
authorJustin Squirek <squirek@adacore.com>
Thu, 11 Jan 2018 08:54:34 +0000 (08:54 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 11 Jan 2018 08:54:34 +0000 (08:54 +0000)
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

gcc/ada/ChangeLog
gcc/ada/par-ch6.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/expr_func4.adb [new file with mode: 0644]

index fd0a8d336249044ca4c4641dfc1b51e1ec30c00f..f66092d7e92f2556e917f4666b6a595da3f8035c 100644 (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
index ddcedcae1304c281a1a7b10bf1374654d9b6f341..f9a54d28d5fa649789e0d294ec3cd90141f79cfd 100644 (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
 
index e5b1c350c7801a1682da827c7674589561e4a2f9..e5d9ddea599122466158900dcaf24457b9ec439f 100644 (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
diff --git a/gcc/testsuite/gnat.dg/expr_func4.adb b/gcc/testsuite/gnat.dg/expr_func4.adb
new file mode 100644 (file)
index 0000000..79fc437
--- /dev/null
@@ -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;