diff options
author | Lewis Hyatt <lhyatt@gmail.com> | 2024-11-02 21:59:24 -0400 |
---|---|---|
committer | Lewis Hyatt <lhyatt@gcc.gnu.org> | 2024-11-09 21:24:38 -0500 |
commit | d7ef7d1258d8ef715be29dea0788a3e410c1d279 (patch) | |
tree | e28518e65b7d59f4d9e538a310db0f0f115b6cc0 /gcc/coverage.cc | |
parent | 4a7bb1dade7746e806d578c01ed01d2ec0293036 (diff) | |
download | gcc-master.zip gcc-master.tar.gz gcc-master.tar.bz2 |
CODE_CONTAINS_STRUCT () currently reports that a TRAIT_EXPR contains a
TS_EXP struct, but it does not actually start with a TS_EXP as an initial
sequence. In modules.cc, when we stream out a tree, we explicitly check for the
TS_EXP case and call note_location(t->exp.locus) if so. Currently, this
actually queries the tree_common::chain field of a tree_trait_expr, which
seems not to be used, returning 0, which is interpreted as UNKNOWN_LOCATION
and does no harm.
If location_t will change to be 64 bytes, as is under discussion, then on
32-bit platforms (well those, such as sparc, on which uint64_t has higher
alignment requirement than a pointer), reading t->exp.locus will end up
reading a different field (tree_trait_expr::type1) due to padding
offsets. That field is not generally 0, and the resulting bogus location_t
is sufficiently problematic to cause an ICE in the line_map code. Pretty
much any modules testcase displays the issue, such as partial-2_a.C.
Resolve by initializing tree_contains_struct with the correct value for
TRAIT_EXPR, namely TS_TYPED.
gcc/cp/ChangeLog:
* cp-objcp-common.cc (cp_common_init_ts): Change TRAIT_EXPR from
TS_EXP to TS_TYPED.
Diffstat (limited to 'gcc/coverage.cc')
0 files changed, 0 insertions, 0 deletions