diff options
author | Liam Naddell <liam.naddell@mail.utoronto.ca> | 2024-07-19 14:19:26 -0400 |
---|---|---|
committer | P-E-P <32375388+P-E-P@users.noreply.github.com> | 2024-07-24 10:27:38 +0000 |
commit | 665d3014ce883925d75da5f6a1ccedc7fd0a5833 (patch) | |
tree | 78e0e6298601fa88f618be53a6dc05a07c693e8f | |
parent | 0d0530b65fc1468e5d5ac64c60c502a84f28780b (diff) | |
download | gcc-665d3014ce883925d75da5f6a1ccedc7fd0a5833.zip gcc-665d3014ce883925d75da5f6a1ccedc7fd0a5833.tar.gz gcc-665d3014ce883925d75da5f6a1ccedc7fd0a5833.tar.bz2 |
[#2987] Patch ICE when deriving Clone and Copy
gcc/rust/ChangeLog:
* expand/rust-expand-visitor.cc:
Fix ICE caused by unique_ptr UB and buggy iterator use
gcc/testsuite/ChangeLog:
* rust/compile/issue-2987.rs:
Add test for deriving Clone and Copy at the same time
Signed-off-by: Liam Naddell <liam.naddell@mail.utoronto.ca>
-rw-r--r-- | gcc/rust/expand/rust-expand-visitor.cc | 17 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/issue-2987.rs | 17 |
2 files changed, 26 insertions, 8 deletions
diff --git a/gcc/rust/expand/rust-expand-visitor.cc b/gcc/rust/expand/rust-expand-visitor.cc index b29523b..e40597e 100644 --- a/gcc/rust/expand/rust-expand-visitor.cc +++ b/gcc/rust/expand/rust-expand-visitor.cc @@ -167,10 +167,10 @@ ExpandVisitor::expand_inner_items ( for (auto it = items.begin (); it != items.end (); it++) { - auto &item = *it; - if (item->has_outer_attrs ()) + Rust::AST::Item &item = **it; + if (item.has_outer_attrs ()) { - auto &attrs = item->get_outer_attrs (); + auto &attrs = item.get_outer_attrs (); for (auto attr_it = attrs.begin (); attr_it != attrs.end (); /* erase => No increment*/) @@ -190,16 +190,17 @@ ExpandVisitor::expand_inner_items ( if (maybe_builtin.has_value ()) { auto new_item - = builtin_derive_item (*item, current, + = builtin_derive_item (item, current, maybe_builtin.value ()); - // this inserts the derive *before* the item - is it a - // problem? + it = items.insert (it, std::move (new_item)); } else { + // Macro is not a builtin, so it must be a + // user-defined derive macro. auto new_items - = derive_item (*item, to_derive, expander); + = derive_item (item, to_derive, expander); std::move (new_items.begin (), new_items.end (), std::inserter (items, it)); } @@ -215,7 +216,7 @@ ExpandVisitor::expand_inner_items ( { attr_it = attrs.erase (attr_it); auto new_items - = expand_item_attribute (*item, current.get_path (), + = expand_item_attribute (item, current.get_path (), expander); it = items.erase (it); std::move (new_items.begin (), new_items.end (), diff --git a/gcc/testsuite/rust/compile/issue-2987.rs b/gcc/testsuite/rust/compile/issue-2987.rs new file mode 100644 index 0000000..1ab5fdc --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-2987.rs @@ -0,0 +1,17 @@ +// { dg-options "-w" } Currently there are a lot of warnings produced from inside clone/copy +// builtins + +#[lang = "copy"] +trait Copy {} + +#[lang = "clone"] +trait Clone { + fn clone(&self) -> Self; +} + +#[derive(Copy)] +#[derive(Clone)] +struct Empty; + +#[derive(Copy,Clone)] +struct Empty2; |