Skip to content

Commit 95690fc

Browse files
committed
Name two extra rulesets
1 parent c673cec commit 95690fc

11 files changed

+903
-27
lines changed

src/rulesets/ty_based.rs

+37-15
Original file line numberDiff line numberDiff line change
@@ -401,16 +401,13 @@ impl RuleOptions {
401401

402402
/// Reproduces RFC3627 (match ergonomics 2024) behavior
403403
pub const ERGO2024: Self = RuleOptions {
404-
match_constructor_through_ref: true,
405-
ref_binding_on_inherited: RefBindingOnInheritedBehavior::ResetBindingMode,
406404
mut_binding_on_inherited: MutBindingOnInheritedBehavior::Error,
407405
inherited_ref_on_ref: InheritedRefOnRefBehavior::EatInner,
408406
fallback_to_outer: FallbackToOuterBehavior::EatOuter,
409407
allow_ref_pat_on_ref_mut: true,
410-
simplify_deref_mut: true,
411408
eat_inherited_ref_alone: true,
412409
downgrade_mut_inside_shared: true,
413-
eat_mut_inside_shared: true,
410+
..RuleOptions::STABLE_RUST
414411
};
415412

416413
/// A fairly permissive proposal, with the benefit of requiring 0 implicit state: we never
@@ -434,6 +431,21 @@ impl RuleOptions {
434431
..Self::STATELESS
435432
};
436433

434+
/// The currently-planned version of the `stateless` ruleset for edition 2021. Not actually
435+
/// stateless.
436+
pub const STATELESS_2021: Self = RuleOptions {
437+
allow_ref_pat_on_ref_mut: true,
438+
eat_inherited_ref_alone: true,
439+
..RuleOptions::STABLE_RUST
440+
};
441+
442+
/// A backwards-compatible proposal by @dianne that behaves close to the 2024 stateless
443+
/// proposal.
444+
pub const EAT_OUTER_2021: Self = RuleOptions {
445+
fallback_to_outer: FallbackToOuterBehavior::EatBoth,
446+
..RuleOptions::STATELESS_2021
447+
};
448+
437449
/// Purely structural matching, with no match ergonomics.
438450
pub const STRUCTURAL: Self = RuleOptions {
439451
inherited_ref_on_ref: InheritedRefOnRefBehavior::Error,
@@ -492,21 +504,31 @@ impl RuleOptions {
492504

493505
/// The known bundles, with a short explanation.
494506
pub static KNOWN_TY_BASED_BUNDLES: &[BundleDoc<RuleOptions>] = &[
507+
BundleDoc {
508+
name: "stable_rust",
509+
ruleset: RuleOptions::STABLE_RUST,
510+
doc: "The behavior of current stable rust",
511+
},
512+
BundleDoc {
513+
name: "stateless",
514+
ruleset: RuleOptions::STATELESS,
515+
doc: "A proposal that tracks no hidden state; purely type-based",
516+
},
495517
BundleDoc {
496518
name: "nadri",
497519
ruleset: RuleOptions::NADRI,
498520
doc: "A reasonable proposal; like `stateless` but \
499521
forbids `ref` bindings that create temporaries",
500522
},
501523
BundleDoc {
502-
name: "stateless",
503-
ruleset: RuleOptions::STATELESS,
504-
doc: "A proposal that tracks no hidden state; purely type-based",
524+
name: "stateless_2021",
525+
ruleset: RuleOptions::STATELESS_2021,
526+
doc: "The currently-planned version of the `stateless` ruleset for edition 2021. Not actually stateless.",
505527
},
506528
BundleDoc {
507-
name: "stable_rust",
508-
ruleset: RuleOptions::STABLE_RUST,
509-
doc: "The behavior of current stable rust",
529+
name: "eat_outer_2021",
530+
ruleset: RuleOptions::EAT_OUTER_2021,
531+
doc: "A backwards-compatible proposal by @dianne that behaves close to the 2024 stateless proposal.",
510532
},
511533
BundleDoc {
512534
name: "rfc3627",
@@ -523,16 +545,16 @@ pub static KNOWN_TY_BASED_BUNDLES: &[BundleDoc<RuleOptions>] = &[
523545
ruleset: RuleOptions::ERGO2024_BREAKING_ONLY,
524546
doc: "The breaking changes for edition 2024 planned in RFC3627",
525547
},
526-
BundleDoc {
527-
name: "min_ergonomics",
528-
ruleset: RuleOptions::MIN_ERGONOMICS,
529-
doc: "The minimal amout of match ergonomics that's forward-compatible with most proposals",
530-
},
531548
BundleDoc {
532549
name: "structural",
533550
ruleset: RuleOptions::STRUCTURAL,
534551
doc: "Purely structural matching, with no match ergonomics",
535552
},
553+
BundleDoc {
554+
name: "min_ergonomics",
555+
ruleset: RuleOptions::MIN_ERGONOMICS,
556+
doc: "The minimal amout of match ergonomics that's forward-compatible with most proposals",
557+
},
536558
BundleDoc {
537559
name: "waffle",
538560
ruleset: RuleOptions::WAFFLE,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
---
2+
source: src/analyses/compute_rules.rs
3+
info:
4+
bundle_name: eat_outer_2021
5+
options:
6+
match_constructor_through_ref: true
7+
eat_inherited_ref_alone: true
8+
inherited_ref_on_ref: EatBoth
9+
fallback_to_outer: EatBoth
10+
allow_ref_pat_on_ref_mut: true
11+
simplify_deref_mut: true
12+
downgrade_mut_inside_shared: false
13+
eat_mut_inside_shared: true
14+
ref_binding_on_inherited: ResetBindingMode
15+
mut_binding_on_inherited: ResetBindingMode
16+
---
17+
let p0: T0 = e.0, let p1: T1 = e.1
18+
----------------------------------- "Constructor"
19+
let [p0, p1]: [T0, T1] = e
20+
21+
let p0: &T0 = &(*e).0, let p1: &T1 = &(*e).1
22+
--------------------------------------------- "ConstructorRef"
23+
let [p0, p1]: &[T0, T1] = e
24+
25+
let p0: &mut T0 = &mut (*e).0, let p1: &mut T1 = &mut (*e).1
26+
------------------------------------------------------------- "ConstructorRef"
27+
let [p0, p1]: &mut [T0, T1] = e
28+
29+
let [p0, p1]: &T = &**e
30+
----------------------- "ConstructorMultiRef"
31+
let [p0, p1]: &&T = e
32+
33+
let [p0, p1]: &T = &**e
34+
------------------------- "ConstructorMultiRef"
35+
let [p0, p1]: &&mut T = e
36+
37+
let [p0, p1]: &T = &**e
38+
------------------------- "ConstructorMultiRef"
39+
let [p0, p1]: &mut &T = e
40+
41+
let [p0, p1]: &mut T = &mut **e
42+
------------------------------- "ConstructorMultiRef"
43+
let [p0, p1]: &mut &mut T = e
44+
45+
let p: T = *e
46+
------------------------------------ "Deref(EatOuter)"
47+
let &p: &T = e, e is not a reference
48+
49+
let p: T = *&e
50+
------------------------------------- "Deref(EatOuter)"
51+
let &p: &T = &e, T is not a reference
52+
53+
let p: T = *e
54+
-------------------------------------------- "Deref(EatOuter)"
55+
let &mut p: &mut T = e, e is not a reference
56+
57+
let p: T = *&mut e
58+
------------------------------------------------- "Deref(EatOuter)"
59+
let &mut p: &mut T = &mut e, T is not a reference
60+
61+
let p: T = *e
62+
---------------- "Deref(EatBoth)"
63+
let &p: &&T = &e
64+
65+
let p: T = *e
66+
------------------------ "Deref(EatBoth)"
67+
let &p: &mut &T = &mut e
68+
69+
let p: T = *e
70+
------------------------ "Deref(EatBoth)"
71+
let &mut p: &&mut T = &e
72+
73+
let p: T = *e
74+
-------------------------------- "Deref(EatBoth)"
75+
let &mut p: &mut &mut T = &mut e
76+
77+
let p: T = **&mut e
78+
---------------------------- "Deref(EatBoth, FallbackToOuter(EatBoth))"
79+
let &mut p: &mut &T = &mut e
80+
81+
let p: T = *&*e
82+
---------------------------------------- "DerefMutWithShared(EatOuter)"
83+
let &p: &mut T = e, e is not a reference
84+
85+
let p: T = *&*&mut e
86+
--------------------------------------------- "DerefMutWithShared(EatOuter)"
87+
let &p: &mut T = &mut e, T is not a reference
88+
89+
let p: T = *&*e
90+
-------------------- "DerefMutWithShared(EatBoth)"
91+
let &p: &&mut T = &e
92+
93+
let p: T = *&*e
94+
---------------------------- "DerefMutWithShared(EatBoth)"
95+
let &p: &mut &mut T = &mut e
96+
97+
let ref x: T = e
98+
------------------ "RefBindingResetBindingMode"
99+
let ref x: &T = &e
100+
101+
let ref x: T = e
102+
-------------------------- "RefBindingResetBindingMode"
103+
let ref x: &mut T = &mut e
104+
105+
let ref mut x: T = e
106+
---------------------- "RefBindingResetBindingMode"
107+
let ref mut x: &T = &e
108+
109+
let ref mut x: T = e
110+
------------------------------ "RefBindingResetBindingMode"
111+
let ref mut x: &mut T = &mut e
112+
113+
let mut x: T = e
114+
------------------ "MutBindingResetBindingMode"
115+
let mut x: &T = &e
116+
117+
let mut x: T = e
118+
-------------------------- "MutBindingResetBindingMode"
119+
let mut x: &mut T = &mut e
120+
121+
let x: &T = &e
122+
-------------------------------------- "BindingBorrow"
123+
let ref x: T = e, e is not a reference
124+
125+
let x: &mut T = &mut e
126+
------------------------------------------ "BindingBorrow"
127+
let ref mut x: T = e, e is not a reference
128+
129+
130+
------------ "Binding"
131+
let x: T = e
132+
133+
134+
-------------------------------------- "Binding"
135+
let mut x: T = e, e is not a reference
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
---
2+
source: src/analyses/compute_rules.rs
3+
info:
4+
bundle_name: eat_outer_2021
5+
options:
6+
match_constructor_through_ref: true
7+
eat_inherited_ref_alone: true
8+
inherited_ref_on_ref: EatBoth
9+
fallback_to_outer: EatBoth
10+
allow_ref_pat_on_ref_mut: true
11+
simplify_deref_mut: true
12+
downgrade_mut_inside_shared: false
13+
eat_mut_inside_shared: true
14+
ref_binding_on_inherited: ResetBindingMode
15+
mut_binding_on_inherited: ResetBindingMode
16+
---
17+
movep0: T0, movep1: T1
18+
----------------------------- "Constructor"
19+
move ⊢ [p0, p1]: [T0, T1]
20+
21+
refp0: T0, refp1: T1
22+
--------------------------- "ConstructorRef"
23+
move ⊢ [p0, p1]: &[T0, T1]
24+
25+
refp0: T0, refp1: T1
26+
--------------------------- "ConstructorRef"
27+
ref ⊢ [p0, p1]: [T0, T1]
28+
29+
ref mutp0: T0, ref mutp1: T1
30+
----------------------------------- "ConstructorRef"
31+
move ⊢ [p0, p1]: &mut [T0, T1]
32+
33+
ref mutp0: T0, ref mutp1: T1
34+
----------------------------------- "ConstructorRef"
35+
ref mut ⊢ [p0, p1]: [T0, T1]
36+
37+
ref ⊢ [p0, p1]: T
38+
-------------------- "ConstructorMultiRef"
39+
move ⊢ [p0, p1]: &&T
40+
41+
ref ⊢ [p0, p1]: T
42+
------------------------ "ConstructorMultiRef"
43+
move ⊢ [p0, p1]: &&mut T
44+
45+
ref ⊢ [p0, p1]: T
46+
------------------ "ConstructorMultiRef"
47+
ref ⊢ [p0, p1]: &T
48+
49+
ref ⊢ [p0, p1]: T
50+
---------------------- "ConstructorMultiRef"
51+
ref ⊢ [p0, p1]: &mut T
52+
53+
ref ⊢ [p0, p1]: T
54+
------------------------ "ConstructorMultiRef"
55+
move ⊢ [p0, p1]: &mut &T
56+
57+
ref mut ⊢ [p0, p1]: T
58+
---------------------------- "ConstructorMultiRef"
59+
move ⊢ [p0, p1]: &mut &mut T
60+
61+
ref ⊢ [p0, p1]: T
62+
---------------------- "ConstructorMultiRef"
63+
ref mut ⊢ [p0, p1]: &T
64+
65+
ref mut ⊢ [p0, p1]: T
66+
-------------------------- "ConstructorMultiRef"
67+
ref mut ⊢ [p0, p1]: &mut T
68+
69+
movep: T
70+
------------- "Deref(EatOuter)"
71+
move&p: &T
72+
73+
movep: T
74+
--------------------------------- "Deref(EatOuter)"
75+
ref&p: T, T is not a reference
76+
77+
movep: T
78+
--------------------- "Deref(EatOuter)"
79+
move&mut p: &mut T
80+
81+
movep: T
82+
----------------------------------------- "Deref(EatOuter)"
83+
ref mut&mut p: T, T is not a reference
84+
85+
movep: T
86+
------------ "Deref(EatBoth)"
87+
ref&p: &T
88+
89+
movep: T
90+
---------------- "Deref(EatBoth)"
91+
ref mut&p: &T
92+
93+
movep: T
94+
-------------------- "Deref(EatBoth)"
95+
ref&mut p: &mut T
96+
97+
movep: T
98+
------------------------ "Deref(EatBoth)"
99+
ref mut&mut p: &mut T
100+
101+
movep: T
102+
-------------------- "Deref(EatBoth, FallbackToOuter(EatBoth))"
103+
ref mut&mut p: &T
104+
105+
movep: T
106+
----------------- "DerefMutWithShared(EatOuter)"
107+
move&p: &mut T
108+
109+
movep: T
110+
------------------------------------- "DerefMutWithShared(EatOuter)"
111+
ref mut&p: T, T is not a reference
112+
113+
movep: T
114+
---------------- "DerefMutWithShared(EatBoth)"
115+
ref&p: &mut T
116+
117+
movep: T
118+
-------------------- "DerefMutWithShared(EatBoth)"
119+
ref mut&p: &mut T
120+
121+
bmref x: T
122+
-------------- "RefBindingResetBindingMode"
123+
refref x: T
124+
125+
bmref x: T
126+
------------------ "RefBindingResetBindingMode"
127+
ref mutref x: T
128+
129+
bmref mut x: T
130+
------------------ "RefBindingResetBindingMode"
131+
refref mut x: T
132+
133+
bmref mut x: T
134+
---------------------- "RefBindingResetBindingMode"
135+
ref mutref mut x: T
136+
137+
bmmut x: T
138+
-------------- "MutBindingResetBindingMode"
139+
refmut x: T
140+
141+
bmmut x: T
142+
------------------ "MutBindingResetBindingMode"
143+
ref mutmut x: T
144+
145+
refx: T
146+
--------------- "BindingBorrow"
147+
moveref x: T
148+
149+
ref mutx: T
150+
------------------- "BindingBorrow"
151+
moveref mut x: T
152+
153+
154+
--------- "Binding"
155+
bmx: T
156+
157+
158+
--------------- "Binding"
159+
movemut x: T

0 commit comments

Comments
 (0)