+2020-01-13 Joseph Myers <joseph@codesourcery.com>
+
+ PR c/93241
+ * c-typeck.c (build_c_cast): Check for expressions with integer
+ operands that can occur in an unevaluated part of an integer
+ constant expression and call note_integer_operands as needed.
+
2019-01-08 Richard Biener <rguenther@suse.de>
PR middle-end/93199
{
tree value;
+ bool int_operands = EXPR_INT_CONST_OPERANDS (expr);
+
if (TREE_CODE (expr) == EXCESS_PRECISION_EXPR)
expr = TREE_OPERAND (expr, 0);
|| TREE_CODE (expr) == COMPLEX_CST)))
value = build1 (NOP_EXPR, type, value);
+ /* If the expression has integer operands and so can occur in an
+ unevaluated part of an integer constant expression, ensure the
+ return value reflects this. */
+ if (int_operands
+ && INTEGRAL_TYPE_P (type)
+ && !EXPR_INT_CONST_OPERANDS (value))
+ value = note_integer_operands (value);
+
protected_set_expr_location (value, loc);
return value;
}
+2020-01-13 Joseph Myers <joseph@codesourcery.com>
+
+ PR c/93241
+ * gcc.dg/c11-static-assert-10.c, gcc.dg/c99-const-expr-15.c: New
+ tests.
+
2020-01-13 Martin Sebor <msebor@redhat.com>
PR tree-optimization/93213
--- /dev/null
+/* Test for constant expressions: casts with integer overflow. PR
+ c/93241. */
+/* { dg-do compile } */
+/* { dg-options "-std=c11 -pedantic-errors" } */
+
+#include <limits.h>
+
+_Static_assert (0 ? (_Bool) (INT_MAX + 1) : 1, "");
+_Static_assert (0 ? (short) ((INT_MAX + 1) != 0) : 1, "");
--- /dev/null
+/* Test for constant expressions: casts with integer overflow. PR
+ c/93241. */
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -pedantic-errors" } */
+
+#include <limits.h>
+
+struct s { int a : (0 ? (_Bool) (INT_MAX + 1) : 1); };
+struct t { int a : (0 ? (short) ((INT_MAX + 1) != 0) : 1); };