+2007-03-12 Seongbae Park <seongbae.park@gmail.com>
+
+ * gcc/doc/invoke.texi (Wvla): New warning.
+
2007-03-07 Andreas Schwab <schwab@suse.de>
* configure: Regenerate.
+2007-03-12 Seongbae Park <seongbae.park@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-12 Richard Henderson <rth@redhat.com>
* config/alpha/alpha.c (alpha_elf_section_type_flags): New.
}
\f
+
+/* 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.
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 (integer_zerop (size))
C ObjC C++ ObjC++ Warning
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) Warning
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.
+2007-03-12 Seongbae Park <seongbae.park@gmail.com>
+
+ * decl.c (compute_array_index_type): New warning flag warn_vla.
+
2007-03-12 Mark Mitchell <mark@codesourcery.com>
PR c++/30108
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))
-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
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
+2007-03-12 Seongbae Park <seongbae.park@gmail.com>
+
+ * gcc.dg/wvla-1.c: New test
+ * gcc.dg/wvla-2.c: New test
+ * gcc.dg/wvla-3.c: New test
+ * gcc.dg/wvla-4.c: New test
+ * gcc.dg/wvla-5.c: New test
+ * gcc.dg/wvla-6.c: New test
+ * gcc.dg/wvla-7.c: New test
+ * g++.dg/warn/Wvla-1.C: New test
+ * g++.dg/warn/Wvla-2.C: New test
+ * g++.dg/warn/Wvla-3.C: New test
+
2007-03-12 Mark Mitchell <mark@codesourcery.com>
PR c++/30108
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wvla" } */
+
+void func (int i)
+{
+ int array[i]; /* { dg-warning "variable length array 'array' is used" } */
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors -Wvla" } */
+
+void func (int i)
+{
+ int array[i]; /* { dg-error "error: ISO C.* forbids variable.* array 'array'" } */
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors -Wno-vla" } */
+
+void func (int i)
+{
+ int array[i];
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-std=c89 -Wvla" } */
+
+extern void
+func (int i, int array[i]); /* { dg-warning "variable length array 'array' is used" } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -Wvla" } */
+
+extern void
+func (int i, int array[i]); /* { dg-warning "variable length array 'array' is used" } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors -std=c89 -Wvla" } */
+
+extern void
+func (int i, int array[i]); /* { dg-error "error: ISO C90 forbids variable.* array 'array'" } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors -std=c99 -Wvla" } */
+
+extern void
+func (int i, int array[i]); /* { dg-warning "variable length array 'array' is used" } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors -std=c89 -Wno-vla" } */
+
+extern void
+func (int i, int array[i]);
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-std=c89 -Wvla" } */
+
+extern void
+func (int i, int [i]); /* { dg-warning "variable length array is used" } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors -std=c89 -Wvla" } */
+
+extern void
+func (int i, int [i]); /* { dg-error "error: ISO C90 forbids variable" } */