Skip to content

Commit a1127d9

Browse files
committed
Add WellKnownTrait::Unpin
1 parent caa7ab5 commit a1127d9

File tree

9 files changed

+99
-2
lines changed

9 files changed

+99
-2
lines changed

chalk-integration/src/lowering.rs

+1
Original file line numberDiff line numberDiff line change
@@ -2124,6 +2124,7 @@ impl LowerWellKnownTrait for WellKnownTrait {
21242124
Self::FnMut => rust_ir::WellKnownTrait::FnMut,
21252125
Self::Fn => rust_ir::WellKnownTrait::Fn,
21262126
Self::Unsize => rust_ir::WellKnownTrait::Unsize,
2127+
Self::Unpin => rust_ir::WellKnownTrait::Unpin,
21272128
}
21282129
}
21292130
}

chalk-parse/src/ast.rs

+1
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ pub enum WellKnownTrait {
126126
FnMut,
127127
Fn,
128128
Unsize,
129+
Unpin,
129130
}
130131

131132
#[derive(Clone, PartialEq, Eq, Debug)]

chalk-parse/src/parser.lalrpop

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ WellKnownTrait: WellKnownTrait = {
6262
"#" "[" "lang" "(" "fn_mut" ")" "]" => WellKnownTrait::FnMut,
6363
"#" "[" "lang" "(" "fn" ")" "]" => WellKnownTrait::Fn,
6464
"#" "[" "lang" "(" "unsize" ")" "]" => WellKnownTrait::Unsize,
65+
"#" "[" "lang" "(" "unpin" ")" "]" => WellKnownTrait::Unpin,
6566
};
6667

6768
AdtRepr: Atom = "#" "[" "repr" "(" <name:Id> ")" "]" => name.str;

chalk-solve/src/clauses/builtin_traits.rs

+4
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,12 @@ pub fn add_builtin_program_clauses<I: Interner>(
4141
WellKnownTrait::Unsize => {
4242
unsize::add_unsize_program_clauses(db, builder, &trait_ref, ty)
4343
}
44+
4445
// Drop impls are provided explicitly
4546
WellKnownTrait::Drop => (),
47+
48+
// There are no special rules for Unpin
49+
WellKnownTrait::Unpin => (),
4650
}
4751
Ok(())
4852
})

chalk-solve/src/display/items.rs

+1
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ impl<I: Interner> RenderAsRust<I> for TraitDatum<I> {
193193
WellKnownTrait::FnMut => "fn_mut",
194194
WellKnownTrait::Fn => "fn",
195195
WellKnownTrait::Unsize => "unsize",
196+
WellKnownTrait::Unpin => "unpin",
196197
};
197198
writeln!(f, "#[lang({})]", name)?;
198199
}

chalk-solve/src/rust_ir.rs

+1
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ pub enum WellKnownTrait {
269269
FnMut,
270270
Fn,
271271
Unsize,
272+
Unpin,
272273
}
273274

274275
chalk_ir::const_visit!(WellKnownTrait);

chalk-solve/src/wf.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,8 @@ impl WfWellKnownGoals {
562562
| WellKnownTrait::FnOnce
563563
| WellKnownTrait::FnMut
564564
| WellKnownTrait::Fn
565-
| WellKnownTrait::Unsize => None,
565+
| WellKnownTrait::Unsize
566+
| WellKnownTrait::Unpin => None,
566567
}
567568
}
568569

@@ -577,7 +578,7 @@ impl WfWellKnownGoals {
577578

578579
match db.trait_datum(impl_datum.trait_id()).well_known? {
579580
WellKnownTrait::Drop => Self::drop_impl_constraint(db, impl_datum),
580-
WellKnownTrait::Copy | WellKnownTrait::Clone => None,
581+
WellKnownTrait::Copy | WellKnownTrait::Clone | WellKnownTrait::Unpin => None,
581582
// You can't add a manual implementation for following traits:
582583
WellKnownTrait::Sized
583584
| WellKnownTrait::FnOnce

tests/test/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -345,5 +345,6 @@ mod slices;
345345
mod string;
346346
mod tuples;
347347
mod unify;
348+
mod unpin;
348349
mod unsize;
349350
mod wf_goals;

tests/test/unpin.rs

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
//! Tests targeting the Unpin trait
2+
3+
use super::*;
4+
5+
#[test]
6+
fn unpin_lowering() {
7+
lowering_success! {
8+
program {
9+
#[auto] #[lang(unpin)] trait Unpin { }
10+
enum A { Variant }
11+
struct B { }
12+
impl !Unpin for A {}
13+
impl Unpin for B {}
14+
}
15+
}
16+
}
17+
18+
#[test]
19+
fn unpin_auto_trait() {
20+
test! {
21+
program {
22+
#[auto] #[lang(unpin)] trait Unpin { }
23+
struct A { }
24+
}
25+
26+
goal {
27+
A: Unpin
28+
} yields {
29+
"Unique"
30+
}
31+
}
32+
}
33+
34+
#[test]
35+
fn unpin_negative() {
36+
test! {
37+
program {
38+
#[auto] #[lang(unpin)] trait Unpin { }
39+
struct A { }
40+
impl !Unpin for A {}
41+
}
42+
43+
goal {
44+
A: Unpin
45+
} yields {
46+
"No possible solution"
47+
}
48+
}
49+
}
50+
51+
#[test]
52+
fn unpin_inherit_negative() {
53+
test! {
54+
program {
55+
#[auto] #[lang(unpin)] trait Unpin { }
56+
struct A { }
57+
impl !Unpin for A {}
58+
struct B { a: A }
59+
}
60+
61+
goal {
62+
B: Unpin
63+
} yields {
64+
"No possible solution"
65+
}
66+
}
67+
}
68+
69+
#[test]
70+
fn unpin_overwrite() {
71+
test! {
72+
program {
73+
#[auto] #[lang(unpin)] trait Unpin { }
74+
struct A { }
75+
impl !Unpin for A {}
76+
struct B { a: A }
77+
impl Unpin for B {}
78+
}
79+
80+
goal {
81+
B: Unpin
82+
} yields {
83+
"Unique"
84+
}
85+
}
86+
}

0 commit comments

Comments
 (0)