aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2025-03-06 13:48:16 +0100
committerRichard Biener <rguenth@gcc.gnu.org>2025-03-06 15:26:57 +0100
commitfdd95e1cf29137a19baed25f8c817d320dfe63e3 (patch)
tree3a8db55ce7f5e7768995ec6a4f470efb4920579a
parent780932620d859fa9e0190edd0c408d0bedf9179e (diff)
downloadgcc-fdd95e1cf29137a19baed25f8c817d320dfe63e3.zip
gcc-fdd95e1cf29137a19baed25f8c817d320dfe63e3.tar.gz
gcc-fdd95e1cf29137a19baed25f8c817d320dfe63e3.tar.bz2
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.
-rw-r--r--gcc/ipa-free-lang-data.cc14
-rw-r--r--gcc/testsuite/g++.dg/pr114501_0.C20
2 files changed, 34 insertions, 0 deletions
diff --git a/gcc/ipa-free-lang-data.cc b/gcc/ipa-free-lang-data.cc
index 0b666cb..2885975 100644
--- a/gcc/ipa-free-lang-data.cc
+++ b/gcc/ipa-free-lang-data.cc
@@ -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))
diff --git a/gcc/testsuite/g++.dg/pr114501_0.C b/gcc/testsuite/g++.dg/pr114501_0.C
new file mode 100644
index 0000000..0439ee5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr114501_0.C
@@ -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();