@@ -5709,6 +5709,8 @@ build_c_cast (location_t loc, tree type, tree expr)
{
tree value;
+ bool int_operands = EXPR_INT_CONST_OPERANDS (expr);
+
if (TREE_CODE (expr) == EXCESS_PRECISION_EXPR)
expr = TREE_OPERAND (expr, 0);
@@ -5943,6 +5945,14 @@ build_c_cast (location_t loc, tree type, tree expr)
|| 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;
}
new file mode 100644
@@ -0,0 +1,9 @@
+/* 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, "");
new file mode 100644
@@ -0,0 +1,9 @@
+/* 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); };