cfgexpand.c (expand_one_var): Use specific wording in error message for non-local...
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 19 Oct 2018 07:17:20 +0000 (07:17 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 19 Oct 2018 07:17:20 +0000 (07:17 +0000)
* cfgexpand.c (expand_one_var): Use specific wording in error message
for non-local frame variables.
* stor-layout.c (layout_decl): Do not issue a warning for them.

From-SVN: r265305

gcc/ChangeLog
gcc/cfgexpand.c
gcc/stor-layout.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/frame_overflow2.adb [new file with mode: 0644]

index 82cc005283ff55c2a6ae360584016842d9ec0b4c..88ec6863128fdaa32cbd91b605e3f34b2a842330 100644 (file)
@@ -1,3 +1,9 @@
+2018-10-19  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * cfgexpand.c (expand_one_var): Use specific wording in error message
+       for non-local frame variables.
+       * stor-layout.c (layout_decl): Do not issue a warning for them.
+
 2018-10-19  Robin Dapp  <rdapp@linux.ibm.com>
 
        * haifa-sched.c (priority): Add force_recompute parameter.
index 35ca276e4ad0ad3e9485e13357d68c1c2b92d828..9d1eab6dfe2ef7c254a550fb781ca300f7a79f38 100644 (file)
@@ -1674,7 +1674,12 @@ expand_one_var (tree var, bool toplevel, bool really_expand)
       /* Reject variables which cover more than half of the address-space.  */
       if (really_expand)
        {
-         error ("size of variable %q+D is too large", var);
+         if (DECL_NONLOCAL_FRAME (var))
+           error_at (DECL_SOURCE_LOCATION (current_function_decl),
+                     "total size of local objects is too large");
+         else
+           error_at (DECL_SOURCE_LOCATION (var),
+                     "size of variable %q+D is too large", var);
          expand_one_error_var (var);
        }
     }
index 58a3aa369faa718ddfffb21b97536c47e5bc0465..42df257556895a800decd901c16ea2a906c37942 100644 (file)
@@ -755,8 +755,8 @@ layout_decl (tree decl, unsigned int known_align)
     DECL_SIZE_UNIT (decl) = variable_size (DECL_SIZE_UNIT (decl));
 
   /* If requested, warn about definitions of large data objects.  */
-  if ((code == VAR_DECL || code == PARM_DECL)
-      && ! DECL_EXTERNAL (decl))
+  if ((code == PARM_DECL || (code == VAR_DECL && !DECL_NONLOCAL_FRAME (decl)))
+      && !DECL_EXTERNAL (decl))
     {
       tree size = DECL_SIZE_UNIT (decl);
 
index 742316dd054edd5a0116dc3d3b812200ebc54cc7..edceccd0c3e1c31f9b39dcb4672d4c0e8d09f476 100644 (file)
@@ -1,3 +1,7 @@
+2018-10-19  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/frame_overflow2.adb: New test.
+
 2018-10-18  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR target/72782
diff --git a/gcc/testsuite/gnat.dg/frame_overflow2.adb b/gcc/testsuite/gnat.dg/frame_overflow2.adb
new file mode 100644 (file)
index 0000000..64f0194
--- /dev/null
@@ -0,0 +1,24 @@
+-- { dg-do compile }
+
+with System;
+
+procedure Frame_Overflow2 is -- { dg-error "too large" }
+
+  type Index_T is range 1 .. 2**(System.Word_Size - 1) - 1;
+
+  type SetArray is array (Index_T) of Boolean;
+
+  type Set is record
+    Store: SetArray := (Others => False);
+  end record;
+
+  Phi: constant Set := (Store => (Others => False));
+
+  function F return Set is
+  begin
+    return Phi;
+  end;
+
+begin
+  null;
+end;