+2014-11-10 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * doc/invoke.texi ([-Wshift-count-negative, -Wshift-count-overflow]):
+ Add.
+
2014-11-10 Richard Sandiford <richard.sandiford@arm.com>
* config/frv/frv.c (frv_io_handle_use_1): Delete.
+2014-11-10 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * c.opt ([Wshift-count-negative, Wshift-count-overflow]): Add.
+
2014-11-10 Edward Smith-Rowland <3dw4rd@verizon.net>
* c-cppbuiltin.c (__has_attribute, __has_cpp_attribute): New macros;
ObjC ObjC++ Var(warn_selector) Warning
Warn if a selector has multiple methods
+Wsequence-point
+C ObjC C++ ObjC++ Var(warn_sequence_point) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall)
+Warn about possible violations of sequence point rules
+
Wshadow-ivar
ObjC ObjC++ Var(warn_shadow_ivar) EnabledBy(Wshadow) Init(1) Warning
Warn if a local declaration hides an instance variable
-Wsequence-point
-C ObjC C++ ObjC++ Var(warn_sequence_point) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall)
-Warn about possible violations of sequence point rules
+Wshift-count-negative
+C ObjC C++ ObjC++ Var(warn_shift_count_negative) Init(1) Warning
+Warn if shift count is negative
+
+Wshift-count-overflow
+C ObjC C++ ObjC++ Var(warn_shift_count_overflow) Init(1) Warning
+Warn if shift count >= width of type
Wsign-compare
C ObjC C++ ObjC++ Var(warn_sign_compare) Warning LangEnabledBy(C++ ObjC++,Wall)
+2014-11-10 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * c-typeck.c (build_binary_op): Use OPT_Wshift_count_negative and
+ OPT_Wshift_count_overflow in the warnings.
+
2014-10-30 Marek Polacek <polacek@redhat.com>
* c-objc-common.c (c_tree_printer) <case 'T'>: For a typedef name,
{
int_const = false;
if (c_inhibit_evaluation_warnings == 0)
- warning_at (location, 0, "right shift count is negative");
+ warning_at (location, OPT_Wshift_count_negative,
+ "right shift count is negative");
}
else
{
{
int_const = false;
if (c_inhibit_evaluation_warnings == 0)
- warning_at (location, 0, "right shift count >= width "
- "of type");
+ warning_at (location, OPT_Wshift_count_overflow,
+ "right shift count >= width of type");
}
}
}
{
int_const = false;
if (c_inhibit_evaluation_warnings == 0)
- warning_at (location, 0, "left shift count is negative");
+ warning_at (location, OPT_Wshift_count_negative,
+ "left shift count is negative");
}
else if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0)
{
int_const = false;
if (c_inhibit_evaluation_warnings == 0)
- warning_at (location, 0, "left shift count >= width of "
- "type");
+ warning_at (location, OPT_Wshift_count_overflow,
+ "left shift count >= width of type");
}
}
+2014-11-10 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * typeck.c (cp_build_binary_op): Use OPT_Wshift_count_negative and
+ OPT_Wshift_count_overflow in the warnings.
+
2014-11-09 Jason Merrill <jason@redhat.com>
DR 799
{
if ((complain & tf_warning)
&& c_inhibit_evaluation_warnings == 0)
- warning (0, "right shift count is negative");
+ warning (OPT_Wshift_count_negative,
+ "right shift count is negative");
}
else
{
if (compare_tree_int (const_op1, TYPE_PRECISION (type0)) >= 0
&& (complain & tf_warning)
&& c_inhibit_evaluation_warnings == 0)
- warning (0, "right shift count >= width of type");
+ warning (OPT_Wshift_count_overflow,
+ "right shift count >= width of type");
}
}
/* Convert the shift-count to an integer, regardless of
{
if ((complain & tf_warning)
&& c_inhibit_evaluation_warnings == 0)
- warning (0, "left shift count is negative");
+ warning (OPT_Wshift_count_negative,
+ "left shift count is negative");
}
else if (compare_tree_int (const_op1,
TYPE_PRECISION (type0)) >= 0)
{
if ((complain & tf_warning)
&& c_inhibit_evaluation_warnings == 0)
- warning (0, "left shift count >= width of type");
+ warning (OPT_Wshift_count_overflow,
+ "left shift count >= width of type");
}
}
/* Convert the shift-count to an integer, regardless of
-Wpointer-arith -Wno-pointer-to-int-cast @gol
-Wredundant-decls -Wno-return-local-addr @gol
-Wreturn-type -Wsequence-point -Wshadow -Wno-shadow-ivar @gol
+-Wshift-count-negative -Wshift-count-overflow @gol
-Wsign-compare -Wsign-conversion -Wfloat-conversion @gol
-Wsizeof-pointer-memaccess -Wsizeof-array-argument @gol
-Wstack-protector -Wstack-usage=@var{len} -Wstrict-aliasing @gol
This warning is enabled by @option{-Wall}.
+@item -Wshift-count-negative
+@opindex Wshift-count-negative
+@opindex Wno-shift-count-negative
+Warn if shift count is negative. This warning is enabled by default.
+
+@item -Wshift-count-overflow
+@opindex Wshift-count-overflow
+@opindex Wno-shift-count-overflow
+Warn if shift count >= width of type. This warning is enabled by default.
+
@item -Wswitch
@opindex Wswitch
@opindex Wno-switch
+2014-11-10 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * c-c++-common/Wshift-count-overflow-1.c: New.
+ * c-c++-common/Wshift-count-overflow-2.c: Likewise.
+ * c-c++-common/Wshift-count-negative-1.c: Likewise.
+ * c-c++-common/Wshift-count-negative-2.c: Likewise.
+
2014-11-10 Andreas Tobler <andreast@gcc.gnu.org>
* gcc.dg/fshort-wchar.c: Use arm_eabi instead of arm*-*-*eabi*.
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wshift-count-negative" } */
+
+void foo()
+{
+ unsigned i1 = 1U << -1; /* { dg-warning "left shift count is negative" } */
+ unsigned i2 = 1U >> -1; /* { dg-warning "right shift count is negative" } */
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wno-shift-count-negative" } */
+
+void foo()
+{
+ unsigned i1 = 1U << -1;
+ unsigned i2 = 1U >> -1;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wshift-count-overflow" } */
+
+void foo()
+{
+ unsigned i1 = 1U << (sizeof(unsigned) * __CHAR_BIT__); /* { dg-warning "left shift count >= width of type" } */
+ unsigned i2 = 1U >> (sizeof(unsigned) * __CHAR_BIT__); /* { dg-warning "right shift count >= width of type" } */
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wno-shift-count-overflow" } */
+
+void foo()
+{
+ unsigned i1 = 1U << (sizeof(unsigned) * __CHAR_BIT__);
+ unsigned i2 = 1U >> (sizeof(unsigned) * __CHAR_BIT__);
+}