mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-23 01:00:53 +08:00
lto/114501 - missed free-lang-data for CONSTRUCTOR index
The following makes sure to also walk CONSTRUCTOR element indexes which can be FIELD_DECLs, referencing otherwise unused types we need to clean. walk_tree only walks CONSTRUCTOR element data. PR lto/114501 * ipa-free-lang-data.cc (find_decls_types_r): Explicitly handle CONSTRUCTORs as walk_tree handling of those is incomplete. * g++.dg/pr114501_0.C: New testcase. (cherry picked from commit fdd95e1cf29137a19baed25f8c817d320dfe63e3)
This commit is contained in:
parent
d9faa7c2eb
commit
ed7f67d951
@ -841,6 +841,20 @@ find_decls_types_r (tree *tp, int *ws, void *data)
|
||||
fld_worklist_push (tem, fld);
|
||||
fld_worklist_push (BLOCK_ABSTRACT_ORIGIN (t), fld);
|
||||
}
|
||||
/* walk_tree does not visit ce->index which can be a FIELD_DECL, pulling
|
||||
in otherwise unused structure fields so handle CTORs explicitly. */
|
||||
else if (TREE_CODE (t) == CONSTRUCTOR)
|
||||
{
|
||||
unsigned HOST_WIDE_INT idx;
|
||||
constructor_elt *ce;
|
||||
for (idx = 0; vec_safe_iterate (CONSTRUCTOR_ELTS (t), idx, &ce); idx++)
|
||||
{
|
||||
if (ce->index)
|
||||
fld_worklist_push (ce->index, fld);
|
||||
fld_worklist_push (ce->value, fld);
|
||||
}
|
||||
*ws = 0;
|
||||
}
|
||||
|
||||
if (TREE_CODE (t) != IDENTIFIER_NODE
|
||||
&& CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_TYPED))
|
||||
|
20
gcc/testsuite/g++.dg/pr114501_0.C
Normal file
20
gcc/testsuite/g++.dg/pr114501_0.C
Normal file
@ -0,0 +1,20 @@
|
||||
// { dg-do compile }
|
||||
// { dg-require-effective-target c++17 }
|
||||
// { dg-require-effective-target lto }
|
||||
// { dg-options "-flto" }
|
||||
|
||||
typedef long unsigned int size_t;
|
||||
struct basic_string_view {
|
||||
typedef long unsigned int size_type;
|
||||
constexpr size_type size() const { return 0; }
|
||||
};
|
||||
struct array {
|
||||
char _M_elems[1];
|
||||
};
|
||||
inline constexpr auto make_it() {
|
||||
constexpr basic_string_view view;
|
||||
array arr{};
|
||||
arr._M_elems[view.size()] = 'a';
|
||||
return arr;
|
||||
}
|
||||
auto bar = make_it();
|
Loading…
x
Reference in New Issue
Block a user