aboutsummaryrefslogtreecommitdiff
path: root/gcc/c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/c')
-rw-r--r--gcc/c/ChangeLog7
-rw-r--r--gcc/c/c-typeck.c10
2 files changed, 17 insertions, 0 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index d0b6559..b8e807e 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,10 @@
+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
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index c746f23..9866c83 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -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;
}