Skip to content

Commit d63b971

Browse files
committed
Infer T: 'new_gc bounds for ignored params
This fixes a bug I need for rust-static-reflect
1 parent 29efdba commit d63b971

File tree

3 files changed

+20
-7
lines changed

3 files changed

+20
-7
lines changed

libs/derive/src/derive.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -626,15 +626,20 @@ impl TraceDeriveInput {
626626
&mut fold,
627627
initial_generics.unwrap_or_else(|| self.generics.original.clone()),
628628
);
629-
for param in self.generics.regular_type_params() {
629+
for param in &self.generics.type_params {
630630
let name = &param.ident;
631-
generics.make_where_clause().predicates.push(parse_quote!(#name: zerogc::GcRebrand<#new_lt, #id>));
631+
let target: Path = if !self.generics.is_ignored(name) {
632+
generics.make_where_clause().predicates.push(parse_quote!(#name: zerogc::GcRebrand<#new_lt, #id>));
633+
parse_quote!(#name::Branded)
634+
} else {
635+
Path::from(name.clone())
636+
};
632637
let rewritten_bounds = param.bounds.iter().cloned().map(|bound| {
633638
syn::fold::fold_type_param_bound(&mut ReplaceLt {
634639
orig_lt, new_lt: &new_lt
635640
}, bound)
636641
}).collect::<Vec<_>>();
637-
generics.make_where_clause().predicates.push(parse_quote!(#name::Branded: #(#rewritten_bounds)+*));
642+
generics.make_where_clause().predicates.push(parse_quote!(#target: #(#rewritten_bounds)+*));
638643
}
639644
for ignored in &self.generics.ignored_lifetimes {
640645
generics.make_where_clause().predicates.push(parse_quote!(#ignored: 'new_gc));

libs/derive/tests/basic.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ use zerogc::{Gc, CollectorId, Trace, GcSafe, NullTrace, epsilon::{self, EpsilonC
66
use zerogc_derive::{Trace, NullTrace};
77
use zerogc::cell::GcCell;
88
use std::marker::PhantomData;
9+
use std::fmt::Debug;
910

1011
#[derive(Trace)]
11-
#[zerogc(collector_ids(DummyCollectorId))]
12+
#[zerogc(collector_ids(EpsilonCollectorId))]
1213
pub struct SpecificCollector<'gc> {
1314
gc: Gc<'gc, i32, EpsilonCollectorId>,
1415
rec: Gc<'gc, SpecificCollector<'gc>, EpsilonCollectorId>,
@@ -92,7 +93,7 @@ struct NopTrace {
9293
}
9394

9495
#[derive(Trace)]
95-
#[zerogc(unsafe_skip_drop, collector_ids(DummyCollectorId))]
96+
#[zerogc(unsafe_skip_drop, collector_ids(EpsilonCollectorId))]
9697
#[allow(unused)]
9798
struct UnsafeSkipped<'gc> {
9899
s: &'static str,
@@ -102,7 +103,7 @@ struct UnsafeSkipped<'gc> {
102103
}
103104

104105
#[derive(Trace)]
105-
#[zerogc(ignore_lifetimes("'a"), immutable, collector_ids(DummyCollectorId))]
106+
#[zerogc(ignore_lifetimes("'a"), immutable, collector_ids(EpsilonCollectorId))]
106107
#[allow(unused)]
107108
struct LifetimeTrace<'a: 'gc, 'gc, T: GcSafe<'gc, EpsilonCollectorId> + 'a> {
108109
s: String,
@@ -113,6 +114,13 @@ struct LifetimeTrace<'a: 'gc, 'gc, T: GcSafe<'gc, EpsilonCollectorId> + 'a> {
113114
marker: PhantomData<&'gc ()>
114115
}
115116

117+
#[derive(Trace)]
118+
#[zerogc(copy, collector_ids(Id), ignore_params(T))]
119+
struct IgnoredParam<'gc, T: Debug + 'gc, Id: CollectorId> {
120+
gc: Gc<'gc, IgnoredParam<'gc, T, Id>, Id>,
121+
param: PhantomData<fn() -> T>,
122+
}
123+
116124
#[test]
117125
fn basic<'gc>() {
118126
let _b = Basic::<epsilon::EpsilonCollectorId> {

libs/derive/tests/deserialize.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use zerogc::prelude::*;
55
use zerogc::epsilon::{EpsilonCollectorId};
66

77
#[derive(Trace, GcDeserialize)]
8-
#[zerogc(collector_ids(DummyCollectorId))]
8+
#[zerogc(collector_ids(EpsilonCollectorId))]
99
struct BasicDeserialize<'gc> {
1010
test: Gc<'gc, String, EpsilonCollectorId>
1111
}

0 commit comments

Comments
 (0)