diff options
author | Martin Uecker <uecker@tugraz.at> | 2024-05-18 14:40:02 +0200 |
---|---|---|
committer | Martin Uecker <uecker@tugraz.at> | 2024-05-24 17:01:11 +0200 |
commit | 9f1798c1a93257526196a3c19828e40fb28ac551 (patch) | |
tree | c3d3199b8a3f87e7d2797096262200e8131c3a1f /gcc/c/c-typeck.cc | |
parent | dae606a11eb99814e452b49241fa76f7678f53b8 (diff) | |
download | gcc-9f1798c1a93257526196a3c19828e40fb28ac551.zip gcc-9f1798c1a93257526196a3c19828e40fb28ac551.tar.gz gcc-9f1798c1a93257526196a3c19828e40fb28ac551.tar.bz2 |
c: Fix for some variably modified types not being recognized [PR114831]
We did not evaluate expressions with variably modified types correctly
in typeof and did not produce warnings when jumping over declarations
using typeof. After addressof or array-to-pointer decay we construct
new pointer types that have to be marked variably modified if the pointer
target is variably modified.
2024-05-18 Martin Uecker <uecker@tugraz.at>
PR c/114831
gcc/c/
* c-typeck.cc (array_to_pointer_conversion, build_unary_op):
Propagate flag to pointer target.
gcc/testsuite/
* gcc.dg/pr114831-1.c: New test.
* gcc.dg/pr114831-2.c: New test.
* gcc.dg/gnu23-varmod-1.c: New test.
* gcc.dg/gnu23-varmod-2.c: New test.
Diffstat (limited to 'gcc/c/c-typeck.cc')
-rw-r--r-- | gcc/c/c-typeck.cc | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index 7ecca9f..2d09235 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -1891,8 +1891,12 @@ array_to_pointer_conversion (location_t loc, tree exp) copy_warning (exp, orig_exp); + bool varmod = C_TYPE_VARIABLY_MODIFIED (restype); + ptrtype = build_pointer_type (restype); + C_TYPE_VARIABLY_MODIFIED (ptrtype) = varmod; + if (INDIRECT_REF_P (exp)) return convert (ptrtype, TREE_OPERAND (exp, 0)); @@ -4630,6 +4634,7 @@ build_unary_op (location_t location, enum tree_code code, tree xarg, tree eptype = NULL_TREE; const char *invalid_op_diag; bool int_operands; + bool varmod; int_operands = EXPR_INT_CONST_OPERANDS (xarg); if (int_operands) @@ -5113,8 +5118,12 @@ build_unary_op (location_t location, enum tree_code code, tree xarg, gcc_assert (TREE_CODE (arg) != COMPONENT_REF || !DECL_C_BIT_FIELD (TREE_OPERAND (arg, 1))); + varmod = C_TYPE_VARIABLY_MODIFIED (argtype); + argtype = build_pointer_type (argtype); + C_TYPE_VARIABLY_MODIFIED (argtype) = varmod; + /* ??? Cope with user tricks that amount to offsetof. Delete this when we have proper support for integer constant expressions. */ val = get_base_address (arg); |