Author: pfg
Date: Sat Nov 16 01:03:56 2013
New Revision: 258204
URL: http://svnweb.freebsd.org/changeset/base/258204

Log:
  gcc: Add a new option -Wvla to warn variable length array.
  
  Obtained from:        gcc 4.3 (rev. 122851; GPLv2)
  MFC after:    3 weeks

Modified:
  head/contrib/gcc/ChangeLog.gcc43
  head/contrib/gcc/c-decl.c
  head/contrib/gcc/c.opt
  head/contrib/gcc/cp/decl.c
  head/contrib/gcc/doc/invoke.texi

Modified: head/contrib/gcc/ChangeLog.gcc43
==============================================================================
--- head/contrib/gcc/ChangeLog.gcc43    Sat Nov 16 00:31:32 2013        
(r258203)
+++ head/contrib/gcc/ChangeLog.gcc43    Sat Nov 16 01:03:56 2013        
(r258204)
@@ -49,6 +49,14 @@
        * config/i386/i386.c (override_options): Likewise.
        * doc/invoke.texi: Likewise.
 
+2007-03-12  Seongbae Park <seongbae.p...@gmail.com>
+
+       * c-decl.c (warn_variable_length_array): New function.
+       Refactored from grokdeclarator to handle warn_vla
+       and handle unnamed array case.
+       (grokdeclarator): Refactored VLA warning case.
+       * c.opt (Wvla): New flag.
+
 2007-03-11  Ian Lance Taylor  <i...@google.com> (r122831 - partial)
 
        * tree-vrp.c (vrp_int_const_binop): Handle PLUS_EXPR and

Modified: head/contrib/gcc/c-decl.c
==============================================================================
--- head/contrib/gcc/c-decl.c   Sat Nov 16 00:31:32 2013        (r258203)
+++ head/contrib/gcc/c-decl.c   Sat Nov 16 01:03:56 2013        (r258204)
@@ -3931,6 +3931,61 @@ check_bitfield_type_and_width (tree *typ
 }
 
 
+
+/* Print warning about variable length array if necessary.  */
+
+static void
+warn_variable_length_array (const char *name, tree size)
+{
+  int ped = !flag_isoc99 && pedantic && warn_vla != 0;
+  int const_size = TREE_CONSTANT (size);
+
+  if (ped)
+    {
+      if (const_size)
+       {
+         if (name)
+           pedwarn ("ISO C90 forbids array %qs whose size "
+                    "can%'t be evaluated",
+                    name);
+         else
+           pedwarn ("ISO C90 forbids array whose size "
+                    "can%'t be evaluated");
+       }
+      else
+       {
+         if (name) 
+           pedwarn ("ISO C90 forbids variable length array %qs",
+                    name);
+         else
+           pedwarn ("ISO C90 forbids variable length array");
+       }
+    }
+  else if (warn_vla > 0)
+    {
+      if (const_size)
+        {
+         if (name)
+           warning (OPT_Wvla,
+                    "the size of array %qs can"
+                    "%'t be evaluated", name);
+         else
+           warning (OPT_Wvla,
+                    "the size of array can %'t be evaluated");
+       }
+      else
+       {
+         if (name)
+           warning (OPT_Wvla,
+                    "variable length array %qs is used",
+                    name);
+         else
+           warning (OPT_Wvla,
+                    "variable length array is used");
+       }
+    }
+}
+
 /* Given declspecs and a declarator,
    determine the name and type of the object declared
    and construct a ..._DECL node for it.
@@ -4329,17 +4384,7 @@ grokdeclarator (const struct c_declarato
                       nonconstant even if it is (eg) a const variable
                       with known value.  */
                    size_varies = 1;
-
-                   if (!flag_isoc99 && pedantic)
-                     {
-                       if (TREE_CONSTANT (size))
-                         pedwarn ("ISO C90 forbids array %qs whose size "
-                                  "can%'t be evaluated",
-                                  name);
-                       else
-                         pedwarn ("ISO C90 forbids variable-size array %qs",
-                                  name);
-                     }
+                   warn_variable_length_array (orig_name, size);
                    if (warn_variable_decl)
                      warning (0, "variable-sized array %qs", name);
                  }

Modified: head/contrib/gcc/c.opt
==============================================================================
--- head/contrib/gcc/c.opt      Sat Nov 16 00:31:32 2013        (r258203)
+++ head/contrib/gcc/c.opt      Sat Nov 16 01:03:56 2013        (r258204)
@@ -432,6 +432,10 @@ Wvariadic-macros
 C ObjC C++ ObjC++
 Do not warn about using variadic macros when -pedantic
 
+Wvla
+C ObjC C++ ObjC++ Var(warn_vla) Init(-1) Warning
+Warn if a variable length array is used
+
 Wwrite-strings
 C ObjC C++ ObjC++ Var(warn_write_strings)
 In C++, nonzero means warn about deprecated conversion from string literals to 
`char *'.  In C, similar warning, except that the conversion is of course not 
deprecated by the ISO C standard.

Modified: head/contrib/gcc/cp/decl.c
==============================================================================
--- head/contrib/gcc/cp/decl.c  Sat Nov 16 00:31:32 2013        (r258203)
+++ head/contrib/gcc/cp/decl.c  Sat Nov 16 01:03:56 2013        (r258204)
@@ -6702,12 +6702,21 @@ compute_array_index_type (tree name, tre
        error ("size of array is not an integral constant-expression");
       size = integer_one_node;
     }
-  else if (pedantic)
+  else if (pedantic && warn_vla != 0)
     {
       if (name)
-       pedwarn ("ISO C++ forbids variable-size array %qD", name);
+       pedwarn ("ISO C++ forbids variable length array %qD", name);
       else
-       pedwarn ("ISO C++ forbids variable-size array");
+       pedwarn ("ISO C++ forbids variable length array");
+    }
+  else if (warn_vla > 0)
+    {
+      if (name)
+       warning (OPT_Wvla, 
+                 "variable length array %qD is used", name);
+      else
+       warning (OPT_Wvla, 
+                 "variable length array is used");
     }
 
   if (processing_template_decl && !TREE_CONSTANT (size))

Modified: head/contrib/gcc/doc/invoke.texi
==============================================================================
--- head/contrib/gcc/doc/invoke.texi    Sat Nov 16 00:31:32 2013        
(r258203)
+++ head/contrib/gcc/doc/invoke.texi    Sat Nov 16 01:03:56 2013        
(r258204)
@@ -230,7 +230,8 @@ in the following sections.
 -Wsystem-headers  -Wtrigraphs  -Wundef  -Wuninitialized @gol
 -Wunknown-pragmas  -Wno-pragmas -Wunreachable-code @gol
 -Wunused  -Wunused-function  -Wunused-label  -Wunused-parameter @gol
--Wunused-value  -Wunused-variable  -Wvariadic-macros @gol
+-Wunused-value  -Wunused-variable @gol
+-Wvariadic-macros -Wvla @gol
 -Wvolatile-register-var  -Wwrite-strings}
 
 @item C-only Warning Options
@@ -3201,6 +3202,13 @@ Warn if variadic macros are used in peda
 alternate syntax when in pedantic ISO C99 mode.  This is default.
 To inhibit the warning messages, use @option{-Wno-variadic-macros}.
 
+@item -Wvla
+@opindex Wvla
+@opindex Wno-vla
+Warn if variable length array is used in the code.
+@option{-Wno-vla} will prevent the @option{-pedantic} warning of
+the variable length array.
+
 @item -Wvolatile-register-var
 @opindex Wvolatile-register-var
 @opindex Wno-volatile-register-var
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to