Skip to content
Snippets Groups Projects
Commit fdd95e1c authored by Richard Biener's avatar Richard Biener Committed by Richard Biener
Browse files

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.
parent 78093262
No related branches found
No related tags found
No related merge requests found
......@@ -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))
......
// { 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();
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment