* gcc-interface/trans.c (return_value_ok_for_nrv_p): Add sanity check.
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 24 Feb 2017 10:35:14 +0000 (10:35 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 24 Feb 2017 10:35:14 +0000 (10:35 +0000)
From-SVN: r245701

gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt63.adb [new file with mode: 0644]

index c7b1ef0ab6d5b5a8fed6adc7765430d3fcdcb579..44e525abc476407762f64736be6083798b926ed6 100644 (file)
@@ -1,3 +1,7 @@
+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>
 
        * gcc-interface/decl.c: Include demangle.h.
index 7cde23064808c842741143b597b05f90e30a067c..d38a0a9601144100eb3b6867dc23354fc8bc76dd 100644 (file)
@@ -3614,9 +3614,16 @@ return_value_ok_for_nrv_p (tree ret_obj, tree ret_val)
   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;
 }
 
index dc2cf4ee2affe0be484539d81736712065e982f3..9425a0d9c71cc5b83ef28d0826d6c2ec7a1edd4f 100644 (file)
@@ -1,3 +1,7 @@
+2017-02-24  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt63.adb: New test.
+
 2017-02-24  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/discr47.adb: New test.
diff --git a/gcc/testsuite/gnat.dg/opt63.adb b/gcc/testsuite/gnat.dg/opt63.adb
new file mode 100644 (file)
index 0000000..6471be4
--- /dev/null
@@ -0,0 +1,19 @@
+-- { 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;