This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Ada] Fix segfault in NRV on pathological case


This is a regression present on all active branches where the NRV pass 
implemented in gigi segfaults on a pathological case.

Tested on x86_64-suse-linux, applied on all active branches.


2017-02-24  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/trans.c (return_value_ok_for_nrv_p): Add sanity check


2017-02-24  Eric Botcazou  <ebotcazou@adacore.com>

	* gnat.dg/opt63.adb: New test.

-- 
Eric Botcazou
Index: gcc-interface/trans.c
===================================================================
--- gcc-interface/trans.c	(revision 245699)
+++ gcc-interface/trans.c	(working copy)
@@ -3614,9 +3614,16 @@ return_value_ok_for_nrv_p (tree ret_obj,
   if (TREE_ADDRESSABLE (ret_val))
     return false;
 
+  /* For the constrained case, test for overalignment.  */
   if (ret_obj && DECL_ALIGN (ret_val) > DECL_ALIGN (ret_obj))
     return false;
 
+  /* For the unconstrained case, test for bogus initialization.  */
+  if (!ret_obj
+      && DECL_INITIAL (ret_val)
+      && TREE_CODE (DECL_INITIAL (ret_val)) == NULL_EXPR)
+    return false;
+
   return true;
 }
 
-- { dg-do compile }
-- { dg-options "-O -gnatws" }

procedure Opt63 is

   type T_MOD is mod 2**32;
   subtype T_INDEX is T_MOD range 3_000_000_000 .. 4_000_000_000;
   type T_ARRAY is array(T_INDEX range <>) of INTEGER;

   function Build_Crash(First : T_INDEX; Length : NATURAL) return T_ARRAY is
      R : T_ARRAY(First .. T_Index'Val (T_Index'Pos (First) + Length))
             := (others => -1); -- Crash here
   begin
      return R;
   end;

begin
   null;
end;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]