diff options
Diffstat (limited to 'gcc/c')
-rw-r--r-- | gcc/c/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/c/c-typeck.c | 10 |
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; } |