+2020-03-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/91993
+ * tree.c (get_narrower): Handle COMPOUND_EXPR by recursing on
+ ultimate rhs and if returned something different, reconstructing
+ the COMPOUND_EXPRs.
+
2020-03-23 Lewis Hyatt <lhyatt@gmail.com>
* opts.c (print_filtered_help): Improve the help text for alias options.
+2020-03-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/91993
+ * c-warn.c (warnings_for_convert_and_check): For expr and/or
+ result being COMPOUND_EXPRs, skip to ultimate rhs.
+
2020-03-20 Richard Sandiford <richard.sandiford@arm.com>
PR middle-end/94072
{
loc = expansion_point_location_if_in_system_header (loc);
+ while (TREE_CODE (expr) == COMPOUND_EXPR)
+ expr = TREE_OPERAND (expr, 1);
+ while (TREE_CODE (result) == COMPOUND_EXPR)
+ result = TREE_OPERAND (result, 1);
+
bool cst = TREE_CODE_CLASS (TREE_CODE (result)) == tcc_constant;
tree exprtype = TREE_TYPE (expr);
+2020-03-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/91993
+ * g++.dg/warn/Wconversion-pr91993.C: New test.
+ * g++.dg/ubsan/pr91993.C: New test.
+ * c-c++-common/ubsan/float-cast-overflow-1.c: Add -Wno-overflow
+ to dg-options.
+ * c-c++-common/ubsan/float-cast-overflow-2.c: Likewise.
+ * c-c++-common/ubsan/float-cast-overflow-4.c: Likewise.
+
2020-03-23 Srinath Parvathaneni <srinath.parvathaneni@arm.com>
Andre Vieira <andre.simoesdiasvieira@arm.com>
Mihail Ionescu <mihail.ionescu@arm.com>
/* { dg-do run { target { lp64 || ilp32 } } } */
-/* { dg-options "-fsanitize=float-cast-overflow" } */
+/* { dg-options "-fsanitize=float-cast-overflow -Wno-overflow" } */
/* { dg-additional-options "-ffloat-store" { target { ia32 } } } */
/* { dg-additional-options "-mieee" { target { { alpha*-*-* } || { sh*-*-* } } } } */
/* { dg-do run } */
/* { dg-require-effective-target int128 } */
-/* { dg-options "-fsanitize=float-cast-overflow" } */
+/* { dg-options "-fsanitize=float-cast-overflow -Wno-overflow" } */
#include "float-cast.h"
/* { dg-do run { target { lp64 } } } */
-/* { dg-options "-fsanitize=float-cast-overflow" } */
+/* { dg-options "-fsanitize=float-cast-overflow -Wno-overflow" } */
#include <limits.h>
#include "float-cast.h"
--- /dev/null
+// PR c++/91993
+// { dg-do compile }
+// { dg-options "-Wconversion -fsanitize=undefined" }
+
+typedef unsigned char uc;
+
+int
+foo (const uc &a, const uc &b, const uc &c)
+{
+ return static_cast<uc>(static_cast<uc>(a << 1U) | b) | c; // { dg-bogus "conversion from 'int' to 'unsigned char' may change value" }
+}
+
+int
+bar (const uc &a, const uc &b, const uc &c, int &d)
+{
+ return static_cast<uc>(static_cast<uc>((d++, a) << 1U) | b) | c; // { dg-bogus "conversion from 'int' to 'unsigned char' may change value" }
+}
--- /dev/null
+// PR c++/91993
+// { dg-do compile }
+// { dg-options "-Wconversion" }
+
+typedef unsigned char uc;
+
+int
+foo (const uc &a, const uc &b, const uc &c)
+{
+ return static_cast<uc>(static_cast<uc>(a << 1U) | b) | c; // { dg-bogus "conversion from 'int' to 'unsigned char' may change value" }
+}
+
+int
+bar (const uc &a, const uc &b, const uc &c, int &d)
+{
+ return static_cast<uc>(static_cast<uc>((d++, a) << 1U) | b) | c; // { dg-bogus "conversion from 'int' to 'unsigned char' may change value" }
+}
tree win = op;
bool integral_p = INTEGRAL_TYPE_P (TREE_TYPE (op));
+ if (TREE_CODE (op) == COMPOUND_EXPR)
+ {
+ while (TREE_CODE (op) == COMPOUND_EXPR)
+ op = TREE_OPERAND (op, 1);
+ tree ret = get_narrower (op, unsignedp_ptr);
+ if (ret == op)
+ return win;
+ op = win;
+ for (tree *p = &win; TREE_CODE (op) == COMPOUND_EXPR;
+ op = TREE_OPERAND (op, 1), p = &TREE_OPERAND (*p, 1))
+ *p = build2_loc (EXPR_LOCATION (op), COMPOUND_EXPR,
+ TREE_TYPE (ret), TREE_OPERAND (op, 0),
+ ret);
+ return win;
+ }
while (TREE_CODE (op) == NOP_EXPR)
{
int bitschange