WhereClause` to a biformula, instead of doing [this](https://github.com/nikomatsakis/a-mir-formality/blob/8a83f2c55425d220d89d78b6e1039dfdcfed6bed/src/rust/lower-to-decl/where-clause.rkt#L12-L13):
322 |
323 | ```
324 | [(lower-to-decl/WhereClause (for KindedVarIds Rust/WhereClause))
325 | (∀ KindedVarIds (lower-to-decl/WhereClause Rust/WhereClause))]
326 | ```
327 |
328 | ...we will do something like this[^gerk]...
329 |
330 | [^gerk]: For various annoying "needs refactoring"-type reasons, you couldn't copy and paste this into mir-formality as is. We have to ensure that the `well-formed-goal-for-biformula` returns a biformula, and not an arbitrary goal, for example (I think it does), and that we don't include `&&` connectives (not sure about that), or else that we normalize them, and a few other annoying things.
331 |
332 | ```
333 | [(lower-to-decl/WhereClause (for KindedVarIds Rust/WhereClause))
334 | (∀ KindedVarIds
335 | (implies [Biformula_wf] Biformula))
336 | )
337 | (where/error Biformula (lower-to-decl/WhereClause Rust/WhereClause))]
338 | (where/error Biformula_wf (well-formed-goal-for-biformula Biformula))
339 | ```
340 |
341 | In other words, `for<'a> WC` where `WC` is some where clause is "short for" `for<'a> if (WC is well-formed) WC`. In other words, there are enough defaulted where-clauses to ensure that the where clause `WC` is well-fromed.
342 |
343 | * `for
WhereClause`
344 |
345 | ### What happens if we do this?
346 |
347 | Let's go back to our example of a caller function that didn't compile ([playground](https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=8f0ed5d96f022fba2e0c367edf119a45)):
348 |
349 | ```rust
350 | fn main() {
351 | let x = vec![1, 2, 3];
352 | let s: & /*'a*/ u32 = &x[..]; // call the lifetime here 'a
353 | foo(s); // ERROR
354 | }
355 |
356 | fn foo(t: T)
357 | where
358 | T: for<'short> IntoData<'short>
359 | {
360 | let data: &[u32] = t.into_data();
361 | process(data);
362 | }
363 | ```
364 |
365 | The problem here was that `main` had to prove that `&'a [u32]: 'short` for all `'short`, and that just wasn't true. But with these new implications, `main` has to prove something else:
366 |
367 | ```
368 | forall<'short> {
369 | if (&'a [u32]: 'short) { // where clause from `IntoData`
370 | &'a [u32]: 'short // OK, that seems true :)
371 | }
372 | }
373 | ```
374 |
375 | ### Status of implementation
376 |
377 | I haven't *QUITE* gotten this part modeled in mir-formality yet, there's some refactoring and tweaks needed. But actually writing out this doc helped me to see that my in-progress edits were wrong-headed anyway so that's good.
378 |
379 | ## What about WF for higher-ranked TYPES?
380 |
381 | OK, it's 8:54am and I'm frantically typing to finish this by 9am, but the short version is that for `for T` we'll add in defaulted conditions in the same way, something like `for
if (T is well-formed) T`. Since mir-formality supports implication types, this should be possible.
382 |
383 | ## Questions from meeting
384 |
385 | Feel free to add questions here, use `###` as the header.
386 |
387 | ### Question format
388 |
389 | nikomatsakis: Wait, how do I format the questions, can you show me an example?
390 |
391 | Yep, just like this!
392 |
393 | ### Comparing these defaults to rustc
394 |
395 | nikomatsakis: Wait! I have a question! How do these defaults for higher-ranked trait bounds compare to what rustc does?
396 |
397 | Answer: This is more accepting than rustc. We can tweak the definition slightly if we care to get closer. Example:
398 |
399 | ```rust
400 | trait Foo<'a, T: Ord> () {}
401 |
402 | fn test()
403 | where
404 | for<'z> A: Foo<'z, B>
405 | {
406 | }
407 | ```
408 |
409 | In rustc, this errors because `B: Ord` is required. Under the definition I gave, `B: Ord` would be part of the default bounds. We can tweak this by not including *all* the WF conditions as default bounds, but only those that involve the `'z` variable. In that case, `B: Ord` would not be defaulted, and the WF checking would report an error on this example, just as rustc does.
410 |
411 | ### Who can add questions
412 |
413 | nikomatsakis: As the author of this doc, am I allowed to add questions?
414 |
415 | Answer: Yes, damn it. WE MAKE THE RULES.
416 |
417 | ### Should we have a `(in-scope)` predicate in mir-formality?
418 |
419 | nikomatsakis: So long as we have a more limited notion like rustc does of what we expan, I am not sure if adding default `(well-formed)` predicates is the right thing or not. I was coming up with some torturous examples where it might not behave as expected. Let me see if I can do craft one.
420 |
421 | The idea is that you are allowed to assume that a given type is fully well-formed, even though you can't prove that yourself. (I guess the WF checking ensures that you have enough where-clauses to prove it yourself, so that's kind of its role.)
422 |
423 | ```rust
424 |
425 | ```
426 |
427 | ### in-scope and #25860
428 |
429 | > don't we have the issue that the implied bounds are on types which are fully inferred, so any fix during rust -> hir lowering won't be enough? (though this will get fixed by implication types later on, so it doesn#t matter ^^)
430 |
431 | You mean for closures, for example?
432 |
433 | I think this is ok because: the thing that gets added into the environment is
434 |
435 | ```
436 | (well-formed (type ?T))
437 | ```
438 |
439 | where `?T` is the yet-to-be-inferred argument type. The way that elaboration works in mir-formality (bottom-up, not top-down), we won't be able to do much with that *until* we learn things about what `?T` winds up being inferred to be. At that point we would be able to.
440 |
441 | [Zulip discussion.](https://rust-lang.zulipchat.com/#narrow/stream/326132-t-types.2Fmeetings/topic/meeting.202022-07-08/near/288941603)
442 |
443 | ### what's a biformula?
444 |
445 | Answer: see the footnote [^biformula].
446 |
447 | > :heart:
448 |
449 | ### https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=6e27f3dbe6bb4127f615df03fe60755f shouldn't compile at all, even with `for<'short>` meaning the right thing
450 |
451 | > we have `impl<'d> IntoData<'d> for &'d [u32]` and trait matching is invariant, isn't it? so `&'d [u32]: IntoData<'c>` doesn't hold, even if `'c: 'd` holds? we would need `impl<'c, 'd: 'c> IntoData<'c> for &'d [u32]` at which point we don't have latebound lifetimes anymore
452 |
453 | nikomatsakis: Hmm, that depends on what the type `T`.. maybe. I was trying to come up with a good example and I wans't very happy with that one. That said, why are the lifetimes not late-bound? Which lifetimes do you even mean?
454 |
455 | lcnr: because we need an explicit `'d: 'c` bound
456 |
457 | nikomatskais: There are no late-bound lifetimes on impls. I think if you change the impl, the example works as is.
458 |
459 | let's mvoe this to zulip lol
460 |
--------------------------------------------------------------------------------
/minutes/2022-07-15-backlog-bonanza.md:
--------------------------------------------------------------------------------
1 | # Backlog bonanza
2 |
3 | Zulip discussion link: https://rust-lang.zulipchat.com/#narrow/stream/326132-t-types.2Fmeetings/topic/meeting.202022-07-15/near/289610912
4 |
5 | Live hackmd link: https://hackmd.io/x3xTr5T7QKeS4tppEV0N-g
6 |
--------------------------------------------------------------------------------
/minutes/2022-07-29-nominated-triage.md:
--------------------------------------------------------------------------------
1 | # Nominated triage
2 |
3 | Zulip discussion link: https://rust-lang.zulipchat.com/#narrow/stream/326132-t-types.2Fmeetings/topic/meeting.202022-07-29/near/291315895
4 |
5 |
--------------------------------------------------------------------------------
/minutes/2022-09-02-planning-meeting.md:
--------------------------------------------------------------------------------
1 | # 2022-09-02 planning meeting
2 |
3 | Zulip discussion link: https://rust-lang.zulipchat.com/#narrow/stream/326132-t-types.2Fmeetings/topic/meeting.202022-09-02.20planning/near/296814921
4 |
5 | ## Proposed meetings
6 |
7 | ### The meeting proposals
8 |
9 | * [discuss projection equality](https://github.com/rust-lang/types-team/issues/51)
10 | * [discuss the trait_alias feature](https://github.com/rust-lang/types-team/issues/49)
11 | * [Variance and Rust](https://github.com/rust-lang/types-team/issues/45)
12 | * [Polonius status update](https://github.com/rust-lang/types-team/issues/43)
13 | * [Finalize recommendations for TAITs](https://github.com/rust-lang/types-team/issues/40)
14 | * [Types team roadmap](https://github.com/rust-lang/types-team/issues/53)
15 | * [Chalk integration plan](https://github.com/rust-lang/types-team/issues/54)
16 | * [RPIT refactor review](https://github.com/rust-lang/types-team/issues/55)
17 |
18 | Proposed meetings:
19 | * Sep 9 -- projection equality (types-team#51)-- @**Boxy [she/her]**
20 | * Sep 16 -- finalize recommendations for TAITs (types-team#40) -- @**oli**
21 | * Sep 23 -- RPIT refactor review (types-team#55) -- @**Santiago Pastorino**
22 | * Sep 30 -- chalk integration plan (types-team#54) -- @**nikomatsakis** / @**Jack Huey**
23 |
24 | ## Status updates
25 |
26 | ### RPIT refactor
27 |
28 | We've fixed yesterday the last issue and we will probably be able to open a PR today with 2 diagnostics regressions, which I think we can open issues about and land this as is.
29 |
30 | :tada: --nikomatsakis --oli
31 |
32 | ### TAITs
33 |
34 | * https://github.com/rust-lang/rust/pull/95474 (don't imply `impl Trait<'a>: 'a`)
35 | * real world breakage on crater found (3 crates)
36 | * proactively provided PRs to the broken projects
37 | * will fix one significant diagnostic regression before merging
38 | * re-FCP with T-types?
39 | * https://github.com/rust-lang/rust/pull/99806 (allow `let (x, y) = some_opaque_value` to be a defining use)
40 | * perf hit, still analyzing the cause
41 | * https://github.com/rust-lang/rust/pull/98933
42 | * just needs a rebase and some cleanup work
43 |
44 | leftover issues before merging: https://github.com/rust-lang/rust/issues?q=is%3Aopen+is%3Aissue+label%3AF-type_alias_impl_trait+assignee%3Aoli-obk
45 |
46 | ### GATs
47 |
48 | Is in FCP as of Wednesday. 8 days left. Should make it into 1.65. Notes from lang meeting: https://github.com/rust-lang/lang-team/blob/master/design-meeting-minutes/2022-08-31-gat-stabilization.md
49 |
50 | GATs GATs GATs woooo --oli
51 |
52 | ### a-mir-formality
53 |
54 | * merged voidc's rustc front end, so that we can generate tests from rust source code
55 | * implemented the start of borrow checker -- in particular, liveness and initialization checks
56 | * spastorino landed some improvements to coherence checker and is investigating modeling negative impls
57 |
58 | ### NLL
59 |
60 | Done? Should WG get closed?
61 |
62 | ### Subtyping refactor
63 |
64 | Goal is to have the traits/subtyping code manage HRTB. As part of that, lcnr has been working on moving implied bounds into the parameter environment:
65 |
66 | > Moving implied bounds into the `ParamEnv` required a general refactoring to how implied bounds are implemented. The first step for this was https://github.com/rust-lang/rust/pull/100676 which changes rustc to eagerly compute implied bounds. This PR accidentally exacerbated an existing soundness bug https://github.com/rust-lang/rust/issues/100051, causing me to revert that accidental behavior change in https://github.com/rust-lang/rust/pull/100989.
67 | >
68 | > I am now close to finishing the move of implied bounds into the `ParamEnv`. This cleanup also makes it a lot easier to fix https://github.com/rust-lang/rust/issues/100051 and will allow us to consider more types for implied-bounds.
69 |
70 | ### Trait object upcasting
71 |
72 | * we had some discussion in [dyn-upcasting stabilization](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-types/topic/dyn-upcasting.20stabilization). Key conclusions:
73 | * No-op trait upcasts don't count, we are only interested in upcasts that change the "principal trait(s)" (i.e., affect the methods that can be invoked, and hence alter the vtable). This was formalized in https://github.com/rust-lang/rust/pull/100208.
74 | * We prefer the "operations are UB" variant as [described in this document](https://hackmd.io/z9GaT_vdRtazrmcF6pStvQ) as it sems maximally consistent.
75 | * One minor open question is whether vtables ought to be defined as aligned pointers to create a niche for "raw wide pointers", e.g., `*const dyn Foo`. There is a niche today (but not for `*const T` where `T: Sized`).
76 | * Observation: backwards compatible to remove the niche.
77 |
78 | ### Negative impls
79 |
80 | * spastorino landed https://github.com/rust-lang/rust/pull/100888, closing the last known issue in the implementation
81 | * rfc draft has not made any progress
82 |
83 | ### Polonius
84 |
85 | * discussed roadmap with Amanda Stjerna and Giacomo Pasini [on zulip](https://rust-lang.zulipchat.com/#narrow/stream/186049-t-compiler.2Fwg-polonius/topic/2022-08)
86 | * Giacomo is going to investigate a proposed change to MIR with the goal of eliminating duplicate logic between borrow checker and drop elaboration, and giving a single unified version of MIR for all static analyses. nikomatsakis needs to write up that proposal as an MCP and discuss with oli and MIR optimization team.
87 |
88 | ### chalk-ty
89 |
90 | No progress. Well, small PR: https://github.com/rust-lang/rust/pull/100095
91 |
92 |
--------------------------------------------------------------------------------
/minutes/2022-09-09-projection-equality.md:
--------------------------------------------------------------------------------
1 | # deep dive 9/9/22
2 |
3 | [zulip meeting](https://rust-lang.zulipchat.com/#narrow/stream/326132-t-types.2Fmeetings/topic/2022-09-09.20projection.20equality)
4 |
5 | Note: this doc often refers to a `ProjectionEq` obligation, this is actually called `ProjectionPredicate` in rustc apparently which seems like kind of a silly name to me. Apologies for constantly messing up the name in this doc and likely anywhere I talk about this lol
6 |
7 | # projection equality status quo
8 |
9 | currently relating projections happens "eagerly", for example `<_ as Trait>::Assoc eq u32` fails because we can't wait around to see if the projection normalizes to `u32`.
10 |
11 | ## Other type is not a projection
12 |
13 | If we relate `<_ as Trait>::Assoc eq SomeOtherType<...>` it will currently fail which is incorrect as it may later end up with an inferred self type which allows for normalization, i.e. `::Assoc`.
14 |
15 | This currently is mitigated by sometimes normalizing `<_1 as Trait>::Assoc` to some new inference var `_2` and emitting a `ProjectionEq` obligation. However this falls short for higher ranked stuff which can be gotten from where clauses i.e. `where for<'a> >::Assoc: Other`, causing issues [#96230](https://github.com/rust-lang/rust/issues/96230) and [#89196](https://github.com/rust-lang/rust/issues/89196).
16 |
17 | ## Other projection is a different `DefId`
18 |
19 | If we relate:
20 | `<_1 as Trait>::Assoc eq <_2 as Trait>::Assoc2`
21 | currently it would fail because the projections are for different defids. This is overly restrictive as `_2` might end up getting resolved to some concrete type `T` allowing the projection to be normalized to:
22 | `::Assoc`
23 | which would then be able to succeed in being equated with:
24 | `<_1 as Trait>::Assoc`
25 |
26 | ## Relating substs
27 |
28 | If we relate `>::Assoc eq >::Assoc` currently it would fail because `u32 eq u64` does not hold. This is overly restrictive is the impl `u32: Trait<_1>` and `u64: Trait<_1>` may have the same value for the `type Assoc`.
29 |
30 | Similarly if we relate `<_1 as Trait>::Assoc eq <_2 as Trait>::Assoc` we would constrain `_1 eq _2` which may not necessarily be required and later cause type inference to error because `_2` turned out to be a `u32` and `_1` turned out to be a u64.
31 |
32 | # deferred projection equality
33 |
34 | PR [#96912](https://github.com/rust-lang/rust/pull/96912) changes the logic of relating projections to (if the projection has infer vars) succeed and emit a `ProjectionEq` obligation. This seems to fix all of the above issues (surprisingly as I was only aiming to fix the first issue).
35 |
36 | As of writing this the PR updates `ProjectionEq` obligation handling to only relate the substs and defid of a `ProjectionTy` if it is "as normalized as it will ever get". I am not sure what precise terminology for this is but the idea is that `::Assoc` is never going to be able to normalized more, but a `<_ as Trait>::Assoc` might.
37 |
38 | Fixing "relating substs" is not entirely backwards compatible as now relating `<_ as Trait>::Assoc eq ::Assoc` will leave the inference var unconstrained, it would be simple to "unfix" this in the PR.
39 |
40 | Note: the exact code changes in [#96912](https://github.com/rust-lang/rust/pull/96912) are a bit :grimacing: right now. specifically `project.rs` and winnowing, they certainly will be changed before seriously attempting to land the PR. (More about the winnowing changes below.)
41 |
42 | # #96912 issues
43 |
44 | ## typenum regression
45 |
46 | below is a minimal repro of the code that fails in typenum with the lazy projection equality PR, annotated with the candidates/obligations that are being evaluated during winnowing:
47 |
48 | ```rust
49 | #![recursion_limit = "4"]
50 | #![allow(unused_must_use)]
51 |
52 | use std::ops::Shl;
53 |
54 | pub struct Foo(U);
55 |
56 | pub trait NotSub: Sized {
57 | type Output;
58 | fn make_output(&self) -> Self::Output;
59 | }
60 |
61 | impl Shl> for Foo
62 | where
63 | Foo: NotSub,
64 | Foo>: Shl< as NotSub>::Output>,
65 | {
66 | type Output = ();
67 | fn shl(self, rhs: Foo) {
68 | let lhs: Foo> = Foo(self);
69 | let rhs: as NotSub>::Output = as NotSub>::make_output(&rhs);
70 | // <
71 | // Foo>
72 | // as
73 | // Shl<
74 | // as NotSub>::Output
75 | // >
76 | // >::shl(lhs, rhs)
77 | <_ as Shl<_>>::shl(lhs, rhs);
78 | // obligation: Foo> as Shl<_#0t>
79 | // candidates:
80 | // - param `Foo> as Shl< as NotSub>::Output>`
81 | // - ???
82 | // - ???
83 | // - impl `for Foo as Shl>`
84 | // - requires _#0t == Foo<_#1t>
85 | // - substs: [Foo, _#1t]
86 | // - nested:
87 | // - Foo<_#1t>: NotSub
88 | // - requires _#1t == B
89 | // - Foo>>: Shl< as NotSub>::Output >
90 | // candidates:
91 | // - impl `for Foo as Shl>`
92 | // - substs: [Foo>, _#2t]
93 | // - nested:
94 | // - ProjectionEq( as NotSub>::Output == Foo<_#2t>)
95 | // - Foo<_#2t>: NotSub
96 | // - requires _#2t == B
97 | // - Foo>>>: Shl< Foo< _#2t > as NotSub >::Output >
98 | // - same as previous `Foo>>` obligation but with an extra `Foo` this recurses infinitely
99 | }
100 | }
101 | ```
102 |
103 | The comments in the code shows all the candidates for each obligation being solved and the nested obligations from each candidate. When evaluating the `impl` candidate we end up evaluting infinitely recursing `Foo<..<....>..>: Shl< as NotSub>::Output >` obligations.
104 |
105 | In order to make the code compile we need rustc to understand that the `impl` candidate doesn't apply and the `param` candidate does. The impl candidate can `EvaluateToErr` if the obligations are evaluated in a specific order:
106 | - `Foo<_#1t>: NotSub` this unifies `_1 eq B`
107 | - `Foo>>: Shl< as NotSub>::Output >`
108 | - `ProjectionEq( as NotSub>::Output == Foo<_2>)` note that this is actually `Foo<_1> as NotSub` but we have unified `_1 eq B` which allows us to know that this `ProjectionEq` obligation does not hold.
109 |
110 | Currently we do not even evaluate the `ProjectionEq` obligation, we evalaute `Foo>>>: Shl< Foo<_2> as NotSub >::Output` first and then `Foo>>>>: Shl<...>` etc etc. This causes us to get a recursion limit error which ends compilation rather than an `EvaluatedToErr` which would let us reject the impl candidate and move on to successfully evaluating the `param` candidate.
111 |
112 | We could do a lot better at avoiding these recursion errors by removing `evaluate_predicate_recursively` and using `ObligationCtx` (honestly I don't know what type to use but lcnr mentioned using `ObligationCtx` so...) to evaluate candidates. This would ensure that evenf if `ProjectionEq` was evaluated and then `Foo<_1>: NotSub` was evaluated it would be alright since the `ProjectionEq` obligation could stall on `_1`. Using an `ObligationCtx` also removes the possibility of us recursing forever without evaluating some obligations (This is more of an assumption, I don't actually know enough to know if this is completely true...).
113 |
114 | An alternative way to make this specific code compile would be to take advantage of the fact that impl candidates get discarded in favor of param candidates. We could potentailly evaluate all param candidates first and if any are `EvaluatedToOk`, discard all the impl candidates without evaluating them. There is a perf run for this solution at [#97380](https://github.com/rust-lang/rust/pull/97380).
115 |
116 | The PR currently implements the latter solution (evaluate param candidates first). It would not be backwards compatible to remove this and replace it with only fulfill like evaluation as `ObligationCtx` does not prevent us from ever getting a recursion limit error. Using `ObligationCtx` seems like a nicer solution and something that would be good to do anyway so that we don't have to maintain two separate ways of evaluating obligations.
117 |
118 | ## projection eq variance
119 |
120 | if we have a `<_ as Trait>::Assoc sub Foo<'a>'` and later `_` gets inferred to `Foo<'b>` which allows us to normalize the projection to `Foo<'b>` then we would end up doing `Foo<'b> eq Foo<'a>` not `Foo<'b> sub Foo<'a>`.
121 |
122 | # Questions
123 |
124 | ## How do I ask a question
125 |
126 | Like this.
127 |
128 | ## @lcnr: nested fulfillment during evaluation
129 |
130 | `evaluate_predicate_recursively` sucks, using a new fulfillment context there instead should work but allows some code to compile which may break again when going "full chalk". How does it work in chalk rn?
131 |
132 | nikomatsakis (spying in, not 100% here) -- I think that in chalk-style solver we would evaluate both paths but discard the impl path (eventually) as ambiguous -- but probably not until types got too large or something, I have to look more closely at that.
133 |
134 | ## implications merging 97380
135 |
136 | > what are the implications of just merging this on its own? It looks like a perf improvement even with the further-improvable implementation.
137 | - oli
138 |
139 | codes kinda janky and would not be entirely safe to remove later
--------------------------------------------------------------------------------
/minutes/2022-09-23-RPITIT-support.md:
--------------------------------------------------------------------------------
1 | # 2022-09-23 deep dive
2 |
3 | Zulip discussion link: https://rust-lang.zulipchat.com/#narrow/stream/326132-t-types.2Fmeetings/topic/2022-09-23.20RPITIT.20Support.2C.20Refactoring/near/300356358
4 |
5 | ## RPIT refactor
6 |
7 | given this...
8 |
9 | ```rust
10 | fn bar<'a>(&'a self) -> impl Debug + 'a
11 | ```
12 |
13 | we desugar this to
14 |
15 | ```rust
16 | fn foo<'a>(&'a self) -> Foo<'static, 'a> {
17 | type Foo<..., 'a1>: Debug + 'a1;
18 | ```
19 |
20 | because it inherits the parameters, we have to add `'static` values
21 |
22 | Q: I guess one of the questions could have been ... why this is not just `Foo<'a1>` and you forget about what is not being captured?
23 |
24 | A: the short version: that's what we were trying to do :)
25 |
26 | Example:
27 |
28 | ```rust
29 | fn foo<'a, T>(a: T) -> impl Debug
30 | where
31 | T: SomeTrait<'a> + Debug
32 | {
33 | a
34 | }
35 | ```
36 |
37 | `'a` not captured, but appears in where clauses; `T` captured
--------------------------------------------------------------------------------
/minutes/2022-09-30-chalk-integration.md:
--------------------------------------------------------------------------------
1 | # Chalk integration proposal (2022-09-30)
2 |
3 | Zulip discussion link: https://rust-lang.zulipchat.com/#narrow/stream/326132-t-types.2Fmeetings/topic/2022-09-30.20chalk.20integration/near/301641085
4 |
5 | ## Meta comment and plan
6 |
7 | We've had trouble "getting going" on chalk integration and there are various ongoing efforts. Niko's meta proposal for how to proceed is as follows:
8 |
9 | * We create a living design repository that will describe the design we are working towards
10 | * either as part of a-mir-formality, as a fork of rustc-dev-guide, or as its own thing
11 | * we review updates to this design repository on a regular basis
12 | * this hackmd is meant as the start of that material
13 | * We prototype the final design in a-mir-formality
14 | * e.g. this is a good forum to explore some of the questions around lifetime inference
15 | * this hackmd links
16 | * We refactor rustc to bring it closer to the overall design, oncovering constraints as we go
17 | * this is also ongoing, and is the third part of this document (very sketchy)
18 |
19 | ## "The chalk vision"
20 |
21 | Chalk is a kind of shorthand for a style of solver that can be both efficient, correct, and shared across multiple codebases. This will likely build on some parts of today's chalk repo, but also integrate lessons from a-mir-formality and other work that has happened in the meantime.
22 |
23 | This section aims to explain the proposed high-level architecture. The a-mir-formality repository models this architecture quite closely, and so we have links in the doc to that repository as well.
24 |
25 | ### Various "actors"
26 |
27 |
28 |
29 | ### Core interface to the database
30 |
31 | Logic solver and type relations code can execute various callbacks:
32 |
33 | * `fn generics_of(&self, def_id: DefId) -> Vec`
34 | * `fn predicates_of(&self, def_id: DefId) -> Vec`
35 | * `fn clauses_for_goal(&self, goal: &Goal) -> Vec`
36 | * convert from Rust syntax into logical clauses
37 | * e.g., `impl Foo for Vec where T: Debug` might get translated to `has_impl(Vec: Foo) :- is_implemented(T: Debug)`
38 |
39 | In a-mir-formality, these are the ["hook" methods implemented by the decl layer](https://github.com/nikomatsakis/a-mir-formality/blob/038b0e1ccfb2a3f591688d5855a42c129d577e85/racket-src/decl/env.rkt#L65-L85).
40 |
41 | ### Core interface to/from the type relation code
42 |
43 | ```rust
44 | fn relate(
45 | db: &Db,
46 | env: &mut Env,
47 | relation: Relation,
48 | ) -> Result, Error>;
49 | // Yields Ok(goals) with subgoals to prove,
50 | // or Err(_) if this is not provable at all.
51 |
52 | enum Relation {
53 | t1: ty::Generic,
54 | op: RelationOp,
55 | t2: ty::Generic,
56 | }
57 |
58 | enum RelationOp {
59 | SubtypeOf,
60 | Outlives,
61 | }
62 | ```
63 |
64 | In a-mir-formality, this is the "ty" layer, and `relate` is [`ty:relate-parameters`](https://github.com/nikomatsakis/a-mir-formality/blob/038b0e1ccfb2a3f591688d5855a42c129d577e85/racket-src/decl/env.rkt#L74).
65 |
66 | ### Core interface to/from the solver
67 |
68 | ```rust
69 | fn perform_query(db: &Db, canonical_query: CanonicalGoal) -> Response
70 |
71 | enum Response {
72 | // Known to be true. The substitution
73 | // constraints the input variables.
74 | True(Substitution, VarsAndRelations),
75 | Maybe(Substitution),
76 | False,
77 | }
78 |
79 | struct VarsAndRelations {
80 | /// new inference variables
81 | inference_vars: Vec<(Universe, Name)>,
82 |
83 | // new relations: these are low-level
84 | // relations, primarily `'a: 'b`
85 | relations: Vec,
86 | }
87 | ```
88 |
89 | Where a `CanonicalGoal` is
90 |
91 | * Bound variables (inference, universal placeholders)
92 | * Parameter environment
93 | * Goal expressed as a logical predicate:
94 | * `is_implemented`
95 | * `normalizes_to` etc
96 |
97 | and a `Response` includes
98 |
99 | * the core result (yes/no/maybe)
100 | * a substitution of things that are known to be true
101 | * even with a maybe result, we may learn something about the inference variables
102 | * relations that have to be checked later by the region code
103 | * you can think of this as a list of outlives obligations on region variables
104 | * e.g. `T: Foo<'a>` might be true "if `'a: 'static`"
105 | * in a-mir-formality, subtyping and other relations can be returned as well, but we have already checked for overall consistency; this has more to do with the simple-sub inference algorithm, which is really a separate consideration worthy of more discussion.
106 |
107 | This is the "logic" layer of a-mir-formality, and especially [the `logic:solve-query` function](https://github.com/nikomatsakis/a-mir-formality/blob/main/racket-src/logic/solve-query.rkt#L15-L17).
108 |
109 | #### The recursive solver
110 |
111 | Chalk includes multiple solvers that can fulfill the above interface. The choice of solver does affect what kinds of programs compile and so it is part of the specification, though we have room to improve it over time. For various reasons, nikomatsakis thinks that the recursive solver is the best choice at the moment. It effectively works like this:
112 |
113 | ```rust
114 | fn solve(canonical_goal: CanonicalGoal) -> Result<()> {
115 | // get the goal to prove, e.g., `is_implemented(Vec: Debug)` or
116 | // `projected_to( = find_subgoals(goal);
121 | while !subgoals.is_empty() {
122 | let subgoal = subgoals.pop();
123 | let canonical_subgoal = inference_context.canonicalize(subgoal);
124 | match solve(canonical_subgoal) {
125 | True(solution) => inference_context.include(solution),
126 | False => return Err,
127 | Maybe(solution) => {
128 | inference_context.include(solution);
129 | subgoals.push(subgoal);
130 | }
131 | }
132 | }
133 | True(inference_context.make_solution())
134 | }
135 | ```
136 |
137 |
138 | ### Managing diagnostics
139 |
140 | This part is less well-developed. The basic idea is to offer a second interface to the solver:
141 |
142 | ```rust
143 | fn perform_query_tree(db: &Db, canonical_query: CanonicalGoal) -> ResponseTree
144 | ```
145 |
146 | that solves the query but constructs and returns the resulting tree, showing what things it tried to prove and why they failed. This could be implemented separately or with one codebase that is generic over which mode it is.
147 |
148 | ### How this is expected to be integrated into rustc
149 |
150 | #### Unifying fulfill, evaluation, selection, and projection into one mechanism
151 |
152 | Currently we have four bits of code:
153 |
154 | * fulfillment context -- tracks what has to be proven
155 | * selection -- selects what impl to use
156 | * evaluation -- determines if a query might be true
157 | * projection -- normalizes associated variables
158 |
159 | In the proposed approach, all of these are unified into performing queries (with possible exception of the first).
160 |
161 | #### Caching, cycles, and incremental compilation
162 |
163 | The chalk "recursive solver" can be integrated quite cleanly with the rust query system, if we extend it to support "fixed point" queries. The idea is that each of the methods identified above can be considered a query. Using the recursive solver style from chalk, the solver creates new subqueries for each subgoal. Each subquery returns a solution that summarizes all possible solutions to the subgoal.
164 |
165 | Effectively the recursive solver works like this:
166 |
167 | ```rust
168 | fn solve(canonical_goal: CanonicalGoal) -> Result<()> {
169 | let (inference_context, goal) = InferenceContext::new(canonical_goal);
170 | let mut subgoals: Vec<_> = find_subgoals(goal);
171 | while !subgoals.is_empty() {
172 | let subgoal = subgoals.pop();
173 | let canonical_subgoal = inference_context.canonicalize(subgoal);
174 | match solve(canonical_subgoal) {
175 | True(solution) => inference_context.include(solution),
176 | False => return Err,
177 | Maybe(solution) => {
178 | inference_context.include(solution);
179 | subgoals.push(subgoal);
180 | }
181 | }
182 | }
183 | True(inference_context.make_solution())
184 | }
185 | ```
186 |
187 |
188 | #### HIR type checking
189 |
190 | HIR type checker would make use of a pared down, simplified fulfillment context that just tracks the top-level obligations that are not yet solved:
191 |
192 | ```rust
193 | struct FulfillmentCx {
194 | goals: Vec
195 | }
196 | ```
197 |
198 | the equivalent of `select_where_possible` etc would be to:
199 |
200 | * iterate the list and perform queries
201 | * queries returns suggested unifications, incorporate those
202 | * if this yields back true, remove it from the list
203 |
204 | Note that the same top-level goal may correspond to different queries each time, as it may reference inference variables that have since been constrained.
205 |
206 | When an error occurs -- either an obligation that cannot be proven or goals that remain ambiguous once all type checking is complete -- we would rerun those obligations in diagnostic mode, yielding a detailed trace, and then figure out how to report that to user.
207 |
208 | The HIR type checker, when run with `-Zchalk`, already does something kind of like this (but without the smart handling for diagnostics).
209 |
210 | #### Lazy normalization
211 |
212 | Lazy normalization means that associated types are not normalized until they are required to be. This would help avoid quite a number of cycles in
213 |
214 | #### MIR type checking, borrow checker
215 |
216 | The MIR type checker already uses a query system, but it doesn't require the full generality of the above because (at least for now...) it doesn't expect type inference variables.
217 |
218 | One key difference in the chalk model that is not obvious from the interfaces sketched above is the way that it handles higher-ranked outlives obligations like `for<'a> (T: 'a)`. In rustc today, the obligations that result from a trait operation can include higher-ranked obligations like this, and they are ultimately resolved by the borrow checker.
219 |
220 | In MIR formality, higher-ranked obliations are handled by the type checker, and the borrow checker only gets simple constraints between variables in the "root universe". This is a much better fit for a system like polonius, which is ill-equipped to deal with higher-ranked reasoning.
221 |
222 | #### Codegen
223 |
224 | Codegen uses the trait solver in a few particular ways. The primary one is to figure out which version of a trait method is being called. In some cases,
225 |
226 | ## How to get there?
227 |
228 | Here are some ideas for initial projects.
229 |
230 | ### chalk-ir crate
231 |
232 | Part of the plan is to have chalk be extracted from rustc
233 |
234 | ### "Shallow subtyping"
235 |
236 | The current subtyping code produces higher-ranked obligations like `for<'a> '0: 'a`. The goal here is to process those at the trait solving layer (after all, all the bounds of `'a` are known up-front), thus freeing the borrow checker from the need to think about regions. This is a blocker for polonius integration as well.
237 |
238 | ### Diagnostics query (proposed by lcnr)
239 |
240 | Begin by modifying the type checker to integrate
241 |
242 | ### Richer existential types in rustc
243 |
244 |
245 |
246 | ### Implication predicates
247 |
248 | ### Coherence
249 |
250 | Implement the new solver and integrate it into coherence. The modeling of coherence in a-mir-formality is complete apart from specialization and negative impls.
251 |
252 | Coherence is interesting because it is only using an "evaluation" style testing.
253 |
254 | ## Some question marks for further exploration
255 |
256 | There are some things that need more exploration in a-mir-formality.
257 |
258 | ### Lifetime erasure
259 |
260 | We have to think about which lifetimes we erase from queries precisely and how we can guarantee lifetime erasure going forward.
261 |
262 | ### Existential predicates
263 |
264 | To properly model TAITs, we need
265 |
266 | # Questions
267 |
268 | ## Coordinating overal effort and tracking the overall design
269 |
270 | nikomatsakis: My sense is that there is a need to get consensus on the overall design we are working for. I am proposing the drafting of a design doc and continued prototyping work on a-mir-formality as a way to drive that design. I feel like trying to do all our discussion and experimentation by live editing rustc code is going to slow us down, and that we need to be simultaneously doing that *and* working "up ahead". I also feel like my own personal time is probably best spent "up ahead", which is why i've been focused on hacking on a-mir-formality. But I'd like to hear what others think on this point and how to get that communication going in both directions. Should we have a dedicated "chalkification" meeting time? Smaller efforts that coordinate?
271 |
272 | ## Missing pieces that show up in rustc etc
273 |
274 | nikomatsakis: I'm wondering what are some of the missing pieces that cause big interactions in rustc but are lacking in the models and design docs. Const generics comes to mind, are there others?
275 |
276 | lcnr: there's codegen/ctfe which uses erased lifetimes and should still result in the same evaluation result as mentioned above. idk, do we have a doc which states all of the requirements we have on our trait system somewhere?
277 |
278 | ## Design doc points that came up
279 |
280 | * Where does the code that converts from HIR definitions into logical predicates live ("decl" layer of a-mir-formality).
281 | * What is the interface that it uses to talk to rustc/rust-analyzer?
282 |
283 | ## What do we want to do with Chalk?
284 |
285 | * There is some amount of code that might be reusable in a new trait solver implementation (in Rust) - type folding, interner interface, maybe most of chalk-ir.
286 | * Rust-analyzer currently uses it heavily - we should consider the medium-term, where we heavily work on a-mir-formality, but rust-analyzer wants something more "stable". Are we open to making Chalk more "experimental" for things like const-eval or lifetime constraint generation under the *current* type model?
287 |
288 | ## When is a-mir-formality "ready" to move to rust-lang
289 |
290 | We should announce that along with types team and types team efforts in a blog post :)
291 |
--------------------------------------------------------------------------------
/minutes/2022-10-07-planning-meeting.md:
--------------------------------------------------------------------------------
1 | # 2022-10-07 planning meeting
2 |
3 | Zulip discussion link: https://rust-lang.zulipchat.com/#narrow/stream/326132-t-types.2Fmeetings/topic/2022-10-07.20Planning.20meeting/near/302846151
4 | Previous planning meeting: https://hackmd.io/BN-RofYeTZKKc_5Iu3sPFg
5 |
6 | ## Proposed meetings
7 |
8 | ## Status updates
9 |
10 | ### RPIT refactor
11 |
12 | * PR got closed :(
13 | * Changing to RPIT/RPITIT cleanup
14 |
15 | ### TAITs
16 |
17 | * landed https://github.com/rust-lang/rust/pull/95474
18 | * opened https://github.com/rust-lang/rust/pull/102417
19 | * opened https://github.com/rust-lang/rust/pull/102700
20 | * Status tracked here: https://github.com/orgs/rust-lang/projects/22/views/1
21 |
22 | ### GATs
23 |
24 | * Stable now ~~?~~ !
25 | * TODO: blog post for 1.65 release
26 | * Issues tracked here: https://github.com/orgs/rust-lang/projects/17
27 | * Some, at least
28 | * Adding `PredicateTy` to rustc: https://github.com/jackh726/rust/tree/a-whole-new-world
29 |
30 | ### a-mir-formality
31 |
32 | voidc landed some improvements to the type checker.
33 |
34 | Currently working on adding a version of the borrow checker (modeling NLL, to start). This has led me to realize that we *may* be able to make a lightweight change to rustc that would help us with "problem case #3":
35 |
36 | ```rust
37 | if let Some(v) = self.map.get() {
38 | return v;
39 | }
40 | self.map.insert();
41 | ```
42 |
43 | Currently investigating if this is true. :)
44 |
45 | Going to be giving a talk on mir-formality next week at HILT '22. Will share slides when they're worth looking at.
46 |
47 | ### Subtyping refactor
48 |
49 | mostly distracted by opaque types in ctfe. annoying :angry:
50 |
51 | ### Trait object upcasting
52 |
53 | Blocked on the need to author an RFC. Should do that.
54 |
55 | ### Negative impls
56 |
57 | Did preliminary integration into a-mir-formality and uncovered a problem, filed at [#102678], concerning cyclic reasoning. The basic idea is that, before we rely on `(T: !Foo) => (T: Foo)`, we need to establish that. The planned fix is to refactor coherence and leverage query system to avoid cycles.
58 |
59 | [#102678]: https://github.com/rust-lang/rust/issues/102678
60 |
61 | ### Polonius
62 |
63 | We are planning a series of hackathons to get oriented, starting Oct 26. We will be adding these to the compiler team calendar.
64 |
65 | ### chalk-ty
66 |
67 | * No `TypeFoldable` for `EarlyBinder`: https://github.com/rust-lang/rust/pull/101901
68 |
--------------------------------------------------------------------------------
/minutes/2022-10-21-issue-triage.md:
--------------------------------------------------------------------------------
1 | # Issue triage
2 |
3 | Zulip discussion link: https://rust-lang.zulipchat.com/#narrow/stream/326132-t-types.2Fmeetings/topic/2022-10-21.20issue.20triage/near/305348200
--------------------------------------------------------------------------------
/minutes/2022-10-28-roadmap.md:
--------------------------------------------------------------------------------
1 | # Roadmap planning
2 |
3 | Zulip discussion link: https://rust-lang.zulipchat.com/#narrow/stream/326132-t-types.2Fmeetings/topic/2022-10-28.20roadmap/near/306650004
4 |
5 | # Big pieces
6 |
7 | * formality (i.e., model)
8 | * shared library for trait solver between rust/r-a, with intermediate steps of
9 | * improved diagnostics for trait system
10 | * refactored rustc implementation
11 | * Chalk?
12 | * rustc-type-ir/chalk-ty
13 | * feature work (intersects both the above), such as...
14 | * improvements on generic associated types
15 | * improvements on impl Trait (e.g., TAITs, RPITIT)
16 | * soundness fixes, especially for higher-ranked stuff
17 |
18 | ### Formality
19 |
20 | Key questions:
21 | - When to move to rust-lang org?
22 |
23 | Goals for next year:
24 |
25 | * testing against rustc (and chalk)
26 | * modeling borrow check, trait solving, type checking from MIR backwards, with some elements of lowering into MIR as needed
27 | * integrated into our language design processes (new features modeled)
28 |
29 | Specific questions to probe:
30 |
31 | * [erased lifetimes](https://rust-lang.zulipchat.com/#narrow/stream/326132-t-types.2Fmeetings/topic/2022-10-28.20roadmap/near/306657313)
32 | *
33 |
34 | ### Shared library
35 |
36 | - Initiative? Not all of this?
37 |
38 | ### Feature work and related
39 |
40 | What features are relevant?
41 |
42 | - async? (how much)
43 | - https://github.com/rust-lang/rust/issues/60658
44 | - RPITIT
45 | - lead: Niko/tmandry
46 | - other: Michael
47 | - AFIT
48 | - lead: Niko/tmandry
49 | - other: Michael
50 | - TAITs
51 | - lead: oli
52 | - existential lifetime parameters for cleaner TAIT impl?
53 | - lead: nobody
54 | - - GATs
55 | - lead: Jack
56 | - Subgoals:
57 | - Implied 'static
58 | - Object safety
59 | - `for<'a> <_ as Trait>::Assoc<'a>: OtherTrait` goals
60 | - polonius
61 | - lead: Niko
62 | - others: lqd
63 | - keyword generics
64 | - const traits
65 | - negative trait impls
66 | - lead: Niko
67 | - others: santiago
68 | - const eval
69 | - `impl Trait` interaction?
70 | - implication types
71 | - lead: Jack?
72 |
73 | ### GATs
74 |
75 |
76 |
77 | ## Timelines and meetings
78 |
79 | ## Questions
80 |
81 | ### Is layout under our purview?
82 |
83 | Seemingly no? Probably more of an opsem team thing.
84 |
85 | ### Active initiatives and planned work that goes beyond that
86 |
87 | Can we chart it out
88 |
89 | ```mermaid
90 | flowchart LR
91 | a-mir-formality
92 | class a-mir-formality active_development;
93 |
94 | rustc-trait-solver-rewrite
95 | class rustc-trait-solver-rewrite active_development;
96 |
97 | shared-trait-solver-library
98 | class shared-trait-solver-library blocked;
99 |
100 | rustc-trait-solver-rewrite --> shared-trait-solver-library
101 |
102 | polonius
103 | class polonius active_development;
104 |
105 | classDef active_development fill:#B10DC9,color:white
106 | classDef blocked fill:#0074D9,color:lightgrey
107 | classDef stalled fill:#0074D9,color:white
108 | ```
--------------------------------------------------------------------------------
/minutes/2022-11-04-planning-meeting.md:
--------------------------------------------------------------------------------
1 | # 2022-11-04 planning meeting
2 |
3 | Zulip discussion link: https://rust-lang.zulipchat.com/#narrow/stream/326132-t-types.2Fmeetings/topic/2022-11-04.20planning/near/307951923
4 | Previous planning meeting: https://hackmd.io/VV4OlAgKQXKKxqI8dbWMvA
5 |
6 | ## Meeting agenda
7 |
8 | * Fill in status updates
9 | * Review and schedule proposed meetings
10 | * Topics for extended discussion
11 | * Proposed workflow:
12 | * create tracking issues for each item and give them a tag (e.g., `I-types-team-initiative`).
13 | * bot to scrape repos for issues with that agenda and include recent updates
14 | * ability to ping bot and have it ping people assigned to those issues
15 |
16 | ## Proposed meetings
17 |
18 | * Variance and Rust #45
19 | * discuss the trait_alias feature #49
20 | * Types team roadmap #53
21 | * Done? In progress?
22 |
23 | ## Status updates
24 |
25 | ### RPITIT refactoring
26 |
27 | It's almost done.
28 |
29 | * We are already lowering the RPIT as an associated type in both the trait and the corresponding impl.
30 | * I've gone over the involved queries adjusting them and making them do the right thing.
31 | * There are currently 15 failing test cases, from the ones I remember ...
32 | * trait with default bodies
33 | * async fns
34 | * I'm currently going over project, candidate assembly, confirm and friends in order to better understand how they work.
35 |
36 | ### AFIT/RPITIT stabilization
37 |
38 | They work surprisingly well, the only existing issues are due to `'static` in the impl-trait desugaring causing some outlives issues when comparing methods' compatibility with their traits.
39 | A few folks are already using AFIT experimentally:
40 | * Embedded HAL: https://github.com/rust-embedded/embedded-hal/pull/407
41 | * Yosh's async_iterator crate: https://docs.rs/async-iterator/2.0.0/async_iterator/trait.Iterator.html
42 |
43 | Existing blockers due to `'static` substitution in lifetimes causing strange lifetime equality bugs, e.g.: https://github.com/rust-lang/rust/issues/102681
44 | cjgillot's PR https://github.com/rust-lang/rust/pull/103491 attempts to fix this, otherwise associated types are quite limited in AFIT.
45 | * this PR could use a deep-dive, since cjgillot told me that they're uncertain if it's sound.
46 |
47 | Open issue for auto trait bounds issue: https://github.com/rust-lang/rust/issues/103854
48 | Though definitely requires some lang design work that doesn't necessarily block static AFITs landing, since all changes would be forward-compatible.
49 | * compiler-errors might put up a PR for `T: Trait` type bounds, since they're not that hard to hack into the compiler.
50 |
51 | ### TAITs
52 |
53 | TAIT is just one merge away from being ready for stabilization. I will write a doc now explaining what TAIT does and what it doesn't.
54 |
55 | ### GATs
56 |
57 | Stable! (Onwards and upwards to the next thing (working on implied static))
58 |
59 | ### a-mir-formality
60 |
61 | Working on rust-rewrite in the riir branch. Things are progressing well. Hoping to open it up for others to contribute to soon. Current status is that end-to-end tests kind of work, but there are still a few basic pieces in the trait solver (e.g., outlives relationships) to finish modeling before it's really ready to be scaled out. Using Rust is nice.
62 |
63 | ### Subtyping refactor
64 |
65 | No progress on this directly.
66 |
67 | nikomatsakis: I believe we can meet the major goal of unblocking polonius in a simpler way. Essentially moving the higher-ranked code that we use *today* in NLL into a pre-pass on the constraints coming out from the trait solver. This item could perhaps be removed from the list.
68 |
69 | ### Implied bounds
70 |
71 | WIP PR ready except for inductive trait solver cycles due to the additional WF bounds. Avoiding them in a non hack-ish way will probably require us to change the solver to be coinductive for all traits.
72 |
73 | ### Non-fatal trait solver overflow
74 |
75 | Requires changes to the while API of the trait solver, so it's a good work to start the rustc trait solver rewrite initiative with :sparkles: the current API surface is pretty massive and they tend to need slightly different approaches. Making progress on this though and am not stuck on anything yet.
76 |
77 | ### Trait object upcasting
78 |
79 | [RFC #3324](https://github.com/rust-lang/rfcs/pull/3324) is in FCP, finishes in a day or two, and then we should be ready to stabilize. :tada:
80 |
81 | ### Negative impls
82 |
83 | Tracking issue: https://github.com/rust-lang/rust/issues/68318
84 |
85 | No major progress here, though nikomatsakis has been thinking about the issue of cycles (https://github.com/rust-lang/rust/issues/102678) and plans to model a fix in a-mir-formality. Good first goal for the riir branch, actually. Santiago and he should touch base on the idea, which could also be implemented in rustc.
86 |
87 | Other blockers:
88 |
89 | * https://github.com/rust-lang/rust/issues/79098
90 | *
91 |
92 | ### Polonius
93 |
94 | Had a hackathon meeting yesterday with a number of people. Went back over the rules and identified two main next steps:
95 |
96 | * Implementation: plan is to explore an implementation in rustc that builds on NLL infrastructure. lqd is leading this, with theo plus some others interested. lqd + nikomatsakis plan to meet once more to do high-level design.
97 | * Rule design: we've got several variants of the rules by now and need to get to one set. nikomatsakis was drafted rules in a-mir-formality but paused that work for the riir branch. Domenic Quirl is going to be doing some detective work on the various alternatives. Another meeting needs to be scheduled here too to go over the results.
98 |
99 | ### chalk-ty
100 |
--------------------------------------------------------------------------------
/minutes/2022-11-11-RPIT-self-PR.md:
--------------------------------------------------------------------------------
1 | # Behaviour of inherited lifetime parameters for opaque types
2 |
3 | Zulip discussion link: https://rust-lang.zulipchat.com/#narrow/stream/326132-t-types.2Fmeetings/topic/2022.E2.80.9011-11.20PR.20review/near/309197876
4 | PR link: https://github.com/rust-lang/rust/pull/103491
5 |
6 | The current implementation of async and RPIT replace all lifetimes from the parent item's generics by `'static`.
7 | The point of this scheme is to ensure that only the lifetimes that explicitly appear in the bounds for the opaque:
8 | - are allowed to occur inside the opaque (while borrow-checking the defining function);
9 | - are considered to occur inside the opaque (while borrow-checking the user functions).
10 |
11 | However, using `'static` creates unwanted behaviour when `Self` and associated type projections appear in bounds.
12 | In pseudo syntax, the desugaring looks like this:
13 | ```rust
14 | trait Trait<'x> {
15 | type Assoc;
16 | }
17 |
18 | impl<'a> Foo<'a> {
19 | fn foo<'b, 'c, 'd, T: Trait<'b>>() -> impl Into + From + 'c { ... }
20 | }
21 |
22 | opaque type Foo::<'_a>::foo::<'_b, '_c, '_d, T>::opaque<'c>:
23 | Into> // `Self` is implicitly desugared to mention `'_a`
24 | + From<>::Assoc> // `T::Assoc` is implicitly desugared to mention `'_b`
25 | + 'c; // `'_d` stays unused, as expected
26 |
27 | impl<'a> Foo<'a> {
28 | fn foo<'b, 'c, T: Trait<'b>>() -> Foo::<'static>::foo::<'static, 'static, 'static, T>::opaque::<'b> { ... }
29 | }
30 | ```
31 |
32 | This implies that the bounds are:
33 | ```rust
34 | opaque type Foo::<'static>::foo::<'static, 'static, 'static, T>::opaque<'c>:
35 | Into> // `Self` gets the wrong lifetime
36 | + From<>::Assoc> // The trait bound is wrong too
37 | + 'c;
38 | ```
39 |
40 | In order to avoid accepting wrong code and silently transmuting a `Foo<'a>` to a `Foo<'static>`,
41 | `Self` and projections were banned from impl-trait.
42 |
43 | # Proposed resolution
44 |
45 | The point of the original device was to ensure that `'_a`, `'_b`, `'_c` and `'_d` did not appear in borrowck,
46 | but just the duplicated `'c` version. A more "proper" desugaring would look like:
47 |
48 | ```rust
49 | impl<'a> Foo<'a> {
50 | fn foo<'b, 'c, 'd, T: Trait<'b>>() -> Foo::<'a>::foo::<'b, 'c, 'd, T>::opaque::<'c> { ... }
51 | }
52 | ```
53 |
54 | The issue becomes: how to tell borrow-checking that the opaque only actually depends on `'_a`, `'_b` and `'c` but not `'_d`.
55 |
56 | We want to:
57 | - only relate substs that correspond to captured lifetimes during TypeRelation;
58 | - only list captured lifetimes in "occurs check".
59 |
60 | We propose to encode usage/non-usage using `variances_of` query:
61 | `Bivariant` vs `Invariant` for unused vs captured lifetimes.
62 |
63 | Impl-trait that do not reference `Self` or projections will have their variances as:
64 | - `o` (invariant) for each type or const generic param;
65 | - `*` (bivariant) for each lifetime param from parent --> will not participate in borrowck;
66 | - `o` (invariant) for each own lifetime param.
67 |
68 | Impl-trait that do reference `Self` and/or projections will have some parent lifetimes marked as `o` as they appear in the bounds, and participate in type relation and borrowck.
69 |
70 | In the example above, `'_a` and `'_b` appear in bounds, so: `variances_of(opaque) = ['_a: o, '_b: o, _c: *, '_d: *, T: o, 'c: o]`.
71 |
72 | # Unresolved questions
73 |
74 | Is this even sound?
75 |
76 | Is there a lighter way to do that, instead of changing `TypeRelation`?
77 |
78 | Should we insert a `'_c == 'c` bound somewhere? --> yes
79 |
80 | Variance computation for opaques is not integrated into the crate-global variance computation:
81 | 1. it makes conservative assumptions about mutually recursive TAITs;
82 | 2. bivariance does not leak into ADTs.
83 |
84 | # Comments
85 |
86 | oli:
87 | Why do we need the additional lifetimes on the opaque type? Can't we just mark the right ones as invariant/bivariant?
88 |
89 | cjgillot: to support late-bound lifetimes in functions `fn foo(&self) -> impl Debug + '_`
90 |
91 | Less of a question: I'd like to land this first for TAIT and add tests that ensure that TAIT works exactly like RPIT. Then we can migrate RPIT without any language concerns.
92 |
93 | ## AFIT interaction
94 |
95 | nikomatsakis: This problem is related to AFIT somehow, right? Can we say a bit more about the connection?
96 |
97 | compiler-errors: https://github.com/rust-lang/rust/issues/102681, basically `Self` type ends up being substituted with `'static` types, which causes the method signature comparison is `compare_predicate_entailment` to unnecessarily relate a bunch of non-`'static` lifetimes with `'static`
98 |
99 | ## wellformedness interactions
100 |
101 | nikomatsakis: I am not sure if this proposal is addressing the interesting problem. In the past when we talked about it, we had settled on the need for some kind of existential lifetime support. The reason was because of cases like this, which is currently accepted:
102 |
103 | ```rust
104 | trait Foo<'a>: Bar { }
105 |
106 | trait Bar { }
107 |
108 | fn foo<'a, T>(x: T) -> impl Debug
109 | where
110 | T: Foo<'a>,
111 | {
112 | MyStruct { x }
113 | }
114 |
115 | struct MyStruct { x: T }
116 |
117 | impl Debug for MyStruct
118 | where
119 | T: Bar,
120 | {
121 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
122 | panic!()
123 | }
124 | }
125 | ```
126 |
127 | Note that `'a` is not captured, but for the `MyStruct` to be WF, we must know that `T: Bar`, and we know that because we know that `T: Foo<'a>` for *some* `'a`. This works today but because of some rather hacky things.
128 |
129 | There are also other examples, I'm trying to find the hackmd where we went through the various cases -- there doesn't have to be a supertrait relationship.
130 |
131 | ## variance
132 |
133 | nikomatsakis: I don't love using variance to encode this, though it also doesn't seem entirely wrong.
134 |
135 | ## oli alternative
136 |
137 | nikomatsakis: Didn't oli have some other approach to this problem? I don't know what it was, though.
138 |
--------------------------------------------------------------------------------
/minutes/2022-11-16-closure-return-type-outlives.md:
--------------------------------------------------------------------------------
1 | # Closure return type outlives
2 |
3 | Zulip discussion link: https://rust-lang.zulipchat.com/#narrow/stream/326132-t-types.2Fmeetings/topic/2022-11-16.20close.20return.20type.20outlives.20types-team.2357/near/310426588
4 | PR link: https://github.com/rust-lang/rust/pull/84385
5 |
--------------------------------------------------------------------------------
/minutes/README.md:
--------------------------------------------------------------------------------
1 | This directory contains the minutes from our various meetings. These
2 | meetings are held on Zulip and you can find the time and other
3 | information in [the compiler-team calendar][c].
4 |
5 | [c]: https://github.com/rust-lang/compiler-team#meeting-calendar
6 |
7 | ## Design meetings
8 |
9 | * [2019.10.16](design-2019-10-16.md): How to handle normalization in
10 | chalk and ideas about what a generic library to represent types
11 | might look like.
12 |
--------------------------------------------------------------------------------
/minutes/design-2019-10-16.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2019.10.16
2 |
3 | ## topic
4 |
5 | How to handle normalization in chalk and ideas about what a generic
6 | library to represent types might look like.
7 |
8 | ## summary
9 |
10 | Key points in the discussion:
11 |
12 | * [how does normalization work in chalk today](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/meeting.202019-10-16/near/178314511)
13 | * [would like to remove unnormalized projections and move that logic to clause lowering](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/meeting.202019-10-16/near/178315108)
14 | * [but this makes lowering more complex](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/meeting.202019-10-16/near/178315630)
15 | * [can use generics to keep things straight](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/meeting.202019-10-16/near/178315802)
16 | * [and in particular a typefamily trait](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/meeting.202019-10-16/near/178316023)
17 | * [this typefamily trait can be the foundation for a generic type library](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/meeting.202019-10-16/near/178316849)
18 |
--------------------------------------------------------------------------------
/minutes/design-2019-10-21.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2019.10-21
2 |
3 | ## topic
4 |
5 | `dyn Trait` in Chalk.
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/meeting.202019-10-21/near/178672663)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [how is `dyn Trait` defined in Chalk](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/meeting.202019-10-21/near/178681888)
13 | * [where clauses](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/meeting.202019-10-21/near/178684670)
14 |
--------------------------------------------------------------------------------
/minutes/design-2019-10-28.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2019.10-28
2 |
3 | ## topic
4 |
5 | Rustc and trait upcasting.
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E10.2E28/near/179258087)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [codegen changes](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E10.2E28/near/179259139)
13 | * [changes to enable this](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E10.2E28/near/179259720)
14 | * [diamond inheritance](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E10.2E28/near/179260637)
15 |
--------------------------------------------------------------------------------
/minutes/design-2019-11-04.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2019.11.04
2 |
3 | ## topic
4 |
5 | Regions and universes.
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E11.2E04/near/179863691)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [what is normalization](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E11.2E04/near/179864314)
13 | * [normalization under binders](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E11.2E04/near/179865279)
14 | * [leak check](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E11.2E04/near/179867205)
15 | * [Niko's leak check PR](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E11.2E04/near/179868825)
16 | * [PR](https://github.com/rust-lang/rust/pull/65232)
17 |
--------------------------------------------------------------------------------
/minutes/design-2019-11-11.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2019.11.11
2 |
3 | ## topic
4 |
5 | Coinduction in chalk (and the current [unsoundness](https://github.com/rust-lang/chalk/issues/248))
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E11.2E11/near/180448354)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [what is coinduction and what's the problem](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E11.2E11/near/180450250)
13 | * [brief explanation of how chalk works irt. coinduction](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E11.2E11/near/180451093)
14 | * [general idea for how to fix the issue](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E11.2E11/near/180451374)
15 | * [can we see negative coinductive cycles?](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E11.2E11/near/180452900)
16 | * [a walk-through of how the new implementation would work for a test case](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E11.2E11/near/180454384)
17 |
--------------------------------------------------------------------------------
/minutes/design-2019-11-18.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2019.11.18
2 |
3 | ## topic
4 |
5 | How to improve rustc-chalk integration.
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/rustc-chalk.20integration.2C.20take.202/near/181043120)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [we should have rustc use `chalk-solve` instead of `chalk-engine`](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/rustc-chalk.20integration.2C.20take.202/near/181043229)
13 | * [refactoring in rustc to make things easier](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/rustc-chalk.20integration.2C.20take.202/near/181046650)
14 | * [`QuantifiedTy`](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/rustc-chalk.20integration.2C.20take.202/near/181047974)
15 |
--------------------------------------------------------------------------------
/minutes/design-2019-12-02.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2019.12.02
2 |
3 | ## topic
4 |
5 | Small updates from the last week
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E02/near/182377699)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [refining an answer in Chalk can cause a panic (currently)](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E02/near/182380076)
13 | - This was spotted in [a pull request](https://github.com/rust-lang/chalk/pull/281#discussion_r344847832), but no follow-up has been done yet. Issue [filed](https://github.com/rust-lang/chalk/issues/302).
14 | * [some thoughts of associated type projections](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E02/near/182380309)
15 | * [chalk needs more/better tests](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E02/near/182380251)
16 | * [debug output with `CHALK_DEBUG` and possibly switching to `tracing`](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E02/near/182385372)
17 |
--------------------------------------------------------------------------------
/minutes/design-2019-12-09.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2019.12.09
2 |
3 | ## topic
4 |
5 | rust-analyzer infinite loop, associated type normalization
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E09/near/182987877)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [separating *unification* from *type relation*](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E09/near/182988478)
13 | - [where does this come up](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E09/near/182988918)
14 | * [how does the infinite loop happen](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E09/near/182990322)
15 | * [existing PR: don't truncate environment](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E09/near/182990731)
16 | * [associated type normalization](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E09/near/182991633)
17 |
18 |
--------------------------------------------------------------------------------
/minutes/design-2019-12-16.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2019.12.16
2 |
3 | ## topic
4 |
5 | Associated types and normalization
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E16/near/183576530)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [chalk book and what it should cover](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E16/near/183579289)
13 | * [why are there both `Normalize` and `ProjectionEq`](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E16/near/183580571)
14 | * [A potential solution to generating the "extra" fallback type](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E16/near/183581540)
15 | * [What is wrong with the current design](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E16/near/183582215)
16 | * [design question: should Chalk "guess" about the associated type if there are inference variables](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E16/near/183582802)
17 | * [Niko has been trying to remove unnormalized types](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E16/near/183583970)
18 | * [Directions to explore](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E16/near/183584430)
19 |
20 |
--------------------------------------------------------------------------------
/minutes/design-2019-12-30.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2019.12.30
2 |
3 | ## topic
4 |
5 | Overall strategy and steps to take first
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E30/near/184493020)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [whether `GeneratorWitness` is too specific](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E30/near/184493361)
13 | * [renaming `chalk-ir` to `chalk-ty`](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E30/near/184493914)
14 | * [where to start with integrating chalk into rustc](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E30/near/184494158)
15 | * [logging test cases, dumping a `.chalk` file, to debug perf issues](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E30/near/184494621)
16 | * [using the `wg-traits` repo as a coordination point for tracking plans](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202019.2E12.2E30/near/184495709)
17 |
--------------------------------------------------------------------------------
/minutes/design-2020-01-06.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2020.01.06
2 |
3 | ## topic
4 |
5 | Plans are slowly taking shape
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E06/near/184934566)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [general roadmap: integrate chalk into rustc step by step](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E06/near/184935652)
13 | * [getting `chalk-ir` ready for rustc integration](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E06/near/184936420)
14 | * [balancing rust-analyzer and optimization work](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E06/near/184937063)
15 | * [incremental goal solving](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E06/near/184937837)
16 | * [sync-up: book PR, writing out steps, other PRs](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E06/near/184938309)
17 | * [adding tracing to the solver](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E06/near/184939093)
18 | * [action points](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E06/near/184940534):
19 | - We do want to try to extend both rustc and chalk.
20 | - Need to come up with a plan for chalk integration into rustc (Niko)
21 | - Need to come up with goals for chalk (Jack)
22 | - Need to put together what needs to be done for chalk-ir changes (Niko)
23 | - One way to maybe help performance would be to cache program clause creation
24 | - Should think about potential other solvers
25 | - Going to add tracing into chalk (David and Jack)
26 | - Going to create projects on wg-traits to get organized
27 |
--------------------------------------------------------------------------------
/minutes/design-2020-01-13.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2020.01.13
2 |
3 | ## topic
4 |
5 | Alias types, bringing rustc and chalk closer together, and truncation
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E13/near/185524101)
8 |
9 | [A hackMD with some chalk goals](https://hackmd.io/VeMmXIYBRu2KdYbJDIpcFA?both)
10 |
11 | ## summary
12 |
13 | Key points in the discussion:
14 | * [setting up a "chalk development" project](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E13/near/185524694)
15 | * [re-implementing `impl Trait` as an alias](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E13/near/185525598)
16 | * [move rustc and chalk closer together by refactoring them both](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E13/near/185527268)
17 | * [type representation, `Ty` vs `TyData`](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E13/near/185527502)
18 | * [`Alias` enum representation](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E13/near/185528001)
19 | * [rust-analyzer bug around truncation](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E13/near/185529345)
20 | * [meeting summary](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E01.2E13/near/185531717):
21 | - `Alias` might make sense as one enum variant, or maybe three
22 | - We want to bring rustc and Chalk's types closer together/merge
23 | - @**detrumi** is going to try to reimplement `impl Trait`
24 | - We should try to just remove truncation and instead just `Flounder` (Jack will try)
25 | - performance/cancellation is the next big thing if we remove truncation & related errors
26 |
--------------------------------------------------------------------------------
/minutes/design-2020-02-11.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2020.02.11
2 |
3 | ## topic
4 |
5 | Unofficial start of a "trial" wg-traits sprint
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meetting.202020.2E02.2E11/near/187949855)
8 |
9 | [Sprint planning doc](https://paper.dropbox.com/doc/wg-traits-2020-sprint-planning--AvNwMlSOogLX0k73AfezNY4zAg-SSt74TfcovdnKKhZNyzeW)
10 |
11 | ## summary
12 |
13 | Key points in the discussion:
14 | * [Trying out sprints for the Traits working group again](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meetting.202020.2E02.2E11/near/187954919)
15 | * [Blockers for integrating chalk and rustc](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meetting.202020.2E02.2E11/near/187955733)
16 | * [Creating a `rustc_ty` crate to share between chalk and rustc](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meetting.202020.2E02.2E11/near/187956058)
17 | * [More discussion on blockers](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meetting.202020.2E02.2E11/near/187956348), and specifically [debruijn indices](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meetting.202020.2E02.2E11/near/187956700)
18 | * [Bringing rustc closer to chalk, for example by refactoring `ty::Predicate`](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meetting.202020.2E02.2E11/near/187957236)
19 | * [Planning the sprint by tagging issues (and niko working on his skill-tree)](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meetting.202020.2E02.2E11/near/187957931)
20 | * [Things in rustc that are missing from chalk](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meetting.202020.2E02.2E11/near/187958602)
21 | * [issue triage: `RustIrDatabase` interface](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meetting.202020.2E02.2E11/near/187959368)
22 | * [defining long-term plans and getting organized](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meetting.202020.2E02.2E11/near/187959947)
23 |
--------------------------------------------------------------------------------
/minutes/design-2020-02-25.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2020.02.25
2 |
3 | ## topic
4 |
5 | Discussions on chalk refactorings
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E02.2E25/near/189060154)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [head count for who's working on the sprint](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E02.2E25/near/189061051)
13 | * [`impl Trait`, opaque types](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E02.2E25/near/189061403)
14 | * [differences between type projections and impl trait](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E02.2E25/near/189062739)
15 | * [adding the interner to chalk code](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E02.2E25/near/189063630)
16 | * [sized and auto-traits](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E02.2E25/near/189064002)
17 | * [rustc refactorings on `Predicate` not being picked up](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E02.2E25/near/189065423)
18 |
--------------------------------------------------------------------------------
/minutes/design-2020-03-03.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2020.03.03
2 |
3 | ## topic
4 |
5 | Half-way point to the first sprint
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E03/near/189633304)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [upcoming design meeting on library-ifying chalk-ty/rustc-ty](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E03/near/189633985)
13 | * [planning and the skill tree](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E03/near/189635407)
14 | * [next steps for integrating `impl Trait` in RA](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E03/near/189636191)
15 | * [mapping types between rustc and chalk](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E03/near/189636724)
16 | - [types mapping table](https://rust-lang.github.io/chalk/book/types/rust_types.html#mapping-to-rustc-types)
17 | - [types in RA](https://github.com/rust-analyzer/rust-analyzer/blob/5abc45982b5558d4c5f8753cb531a4a0858faa0f/crates/ra_hir_ty/src/lib.rs#L71-L145)
18 | * [ambiguous associated types, which are problematic for rust-analyzer](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E03/near/189637861)
19 | * [things "left" this sprint](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E03/near/189639234):
20 | 1. impl Trait
21 | 2. tracing
22 | 3. Finishing `Interner` refactoring
23 |
--------------------------------------------------------------------------------
/minutes/design-2020-03-10.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2020.03.10
2 |
3 | ## topic
4 |
5 | Discussion on impl Trait (mostly)
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E10/near/190216727)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [updates on Interner](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E10/near/190219031)
13 | * [impl Trait](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E10/near/190219649)
14 |
--------------------------------------------------------------------------------
/minutes/design-2020-03-17.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2020.03.17
2 |
3 | ## topic
4 |
5 | Sprint discussion, builtin traits and types
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E17/near/190902377)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [`TyData::Fn`](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E17/near/190904085)
13 | * [sprint discussion](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E17/near/190905134)
14 | * [builtin traits](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E17/near/190907418)
15 | * [recursive solver vs SLG](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E17/near/190909029)
16 |
--------------------------------------------------------------------------------
/minutes/design-2020-03-24.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2020.03.24
2 |
3 | ## topic
4 |
5 | Sprint recap, next sprint goals
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E24/near/191663614)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [Things accomplished](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E24/near/191664933)
13 | * [Tracing](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E24/near/191665617)
14 | * [Next sprint discussion](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E24/near/191665917)
15 |
--------------------------------------------------------------------------------
/minutes/design-2020-03-31.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2020.03.31
2 |
3 | ## topic
4 |
5 | New sprint, who dis
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E31/near/192441350)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [How to organize the sprint](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E31/near/192443140)
13 | * [Chalk releases](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E31/near/192444969)
14 | * [What is needed in the book?](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E31/near/192446459)
15 | * [Implied bounds](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E31/near/192447465)
16 | * [Planning design meetings](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E03.2E31/near/192448605)
17 |
--------------------------------------------------------------------------------
/minutes/design-2020-04-07.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2020.04.07
2 |
3 | ## topic
4 |
5 | const in Chalk
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E07/near/193239347)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [Recent activity](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E07/near/193240567)
13 | * [what is a const](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E07/near/193241542)
14 | * [design considerations for chalk consts](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E07/near/193242623)
15 | * [Mututal recursion of consts](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E07/near/193243417)
16 | * [When do we want to implement](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E07/near/193246061)
17 | * [`Fold` and `Visit` naming](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E07/near/193246520)
18 |
--------------------------------------------------------------------------------
/minutes/design-2020-04-14.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2020.04.14
2 |
3 | ## topic
4 |
5 | Sprint progress review
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E14/near/193948519)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [Recent activity](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E14/near/193949754)
13 | * [Sprint progress review](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E14/near/193950312)
14 | * [Chalk book](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E14/near/193951120)
15 | * [Chalk releases](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E14/near/193953084)
16 |
--------------------------------------------------------------------------------
/minutes/design-2020-04-21.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2020.04.21
2 |
3 | ## topic
4 |
5 | Implied bounds
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E21/near/194853430)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [Recent activity](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E21/near/194853602)
13 | * [What are implied bounds](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E21/near/194854642)
14 | * [Reasoning of `FromEnv`](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E21/near/194856679)
15 | * [WellFormed goals](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E21/near/194858563)
16 |
--------------------------------------------------------------------------------
/minutes/design-2020-04-28.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2020.04.28
2 |
3 | ## topic
4 |
5 | Builtin types/traits, link check, opaque types, const types
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E28/near/195618205)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [Recent activity](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E28/near/195618377)
13 | * [Builtin types/traits](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E28/near/195619901)
14 | * [Link check](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E28/near/195622231)
15 | * [Opaque types](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E28/near/195624119)
16 | * [const types](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E04.2E28/near/195625661)
17 |
--------------------------------------------------------------------------------
/minutes/design-2020-05-05.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2020.05.05
2 |
3 | ## topic
4 |
5 | leak check, `ObjectSafe` and `Outlives` goals, const PR discussion
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E05.2E05/near/196359047)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [Recent activity](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E05.2E05/near/196359487)
13 | * [Universe transition in rustc](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E05.2E05/near/196360573)
14 | * [Leak cheak](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E05.2E05/near/196361190)
15 | * [`ObjectSafe` and `Outlives`](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E05.2E05/near/196363704)
16 | * [const PR discussion](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E05.2E05/near/196365991)
17 |
--------------------------------------------------------------------------------
/minutes/design-2020-05-12.md:
--------------------------------------------------------------------------------
1 | # traits design meeting 2020.05.12
2 |
3 | ## topic
4 |
5 | Sprint recap
6 |
7 | [Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E05.2E12/near/197329732)
8 |
9 | ## summary
10 |
11 | Key points in the discussion:
12 | * [Recent activity](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E05.2E12/near/197329871)
13 | * [How do we want to keep minutes](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E05.2E12/near/197330803)
14 | * [Sprint recap](https://rust-lang.zulipchat.com/#narrow/stream/144729-wg-traits/topic/design.20meeting.202020.2E05.2E12/near/197332669)
15 |
--------------------------------------------------------------------------------
/minutes/triage-2019-02-24.md:
--------------------------------------------------------------------------------
1 | # Triage meeting on 2019-02-24
2 |
3 | ## Info
4 |
5 | [Zulip thread.](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weekly.20meeting.202019-02-25)
6 |
7 | ## Summary
8 |
9 | The goal of the meeting was to try and figure out, in somewhat more
10 | detail, how we want to organize the traits working group itself. We've
11 | been doing [work on enumerating and triaging the set of things we hope
12 | to do][roadmap], but in this meeting we were basically trying to come
13 | up with some concrete next steps.
14 |
15 | [roadmap]: https://paper.dropbox.com/doc/Traits-Roadmap-sketch--AYTQPvAVQ~p4lyElpr24zoAQAg-m6hucUslp7GihsY3SjNN2
16 |
17 | Ultimately we identified the following next steps:
18 |
19 | - Schedule a meeting to dig into some of the **lifetime problems around
20 | async-await**. This is kind of an "intersecting" issue between async await
21 | and the traigs WG, but seems high priority. (nikomatsakis)
22 | - **Explore the use cases for lazy normalization**, trying to create a summary
23 | of exactly which test cases are causing problems and why, and what it might
24 | take to fix them (can it be done without a full chalk transition?). (nikomatsakis)
25 | - **Explore the use cases for GATs**, trying to find a set of specific examples
26 | from async-await and other contexts. It seems likely that we could do an initial
27 | impl of GATs in rustc without chalk, but would it be enough? (aturon, centril)
28 | - Schedule a meeting to **dig into the chalk transition** -- what is
29 | current status and what are the possible future routes, what should
30 | we be exploring? (nikomatsakis, scalexm)
31 | - Get tests plus FCP around `type Foo = impl Bar` (centril)
32 |
33 | In general, we're trying to get a sense for what the [initial set of
34 | active 'subprojects' will
35 | be](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weekly.20meeting.202019-02-25/near/159365173)
36 | (basically, the things that the WG is focusing on). Ideally, each of
37 | them will have a distinct "lead" (or, better, leads!) who is driving
38 | the effort (in collaboration with the rest of us).
39 |
40 | A **likely** set of initial subprojects will contain:
41 |
42 | - some amount of hacking on rustc (GATs, lazy norm) in an effort to "relieve the pressure"
43 | - some amount of hacking on chalk itself and on chalk integration
44 | - some amount of work on defining the semantics of other features like
45 | specialization by lowering them to chalk predicates
46 |
47 | but that is not certain. A key drive is both the set of people we have
48 | involved and also what seems to be highest priority in terms of
49 | unblocking other things within Rust.
50 |
--------------------------------------------------------------------------------
/minutes/triage-2019-03-04.md:
--------------------------------------------------------------------------------
1 | # Triage meeting on 2019-03-04
2 |
3 | ## Info
4 |
5 | [Zulip thread.](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weekly.20meeting.202019-03-04)
6 |
7 | ## Summary
8 |
9 | We followed up on the goals from last time.
10 |
11 | ### Lifetime problems around async-await
12 |
13 | We
14 | [discussed](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weekly.20meeting.202019-03-04/near/159939976)
15 | how we found a way to resolve the `async fn` complications by changing
16 | the async fn desugaring, and hence don't need any deep trait
17 | action. We are [still
18 | interested](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weekly.20meeting.202019-03-04/near/159940028)
19 | in trying to find a way to solve the "captures problem" for impl
20 | Trait, however, and alexreg and nikomatsakis may do some follow-up
21 | there.
22 |
23 | ### Explore use cases for lazy normalization
24 |
25 | Some investigation occurred. [Current plan](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weekly.20meeting.202019-03-04/near/159940188)
26 | to continue documenting the way that the current normalization code
27 | plays out and to hold some sort of meeting to document that and walk
28 | through it. That meeting will hopefully happen this week and will be
29 | recorded.
30 |
31 | ### Explorse use cases for GATs
32 |
33 | [Not a lot of progress here.](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weekly.20meeting.202019-03-04/near/159940294) (Yet!)
34 |
35 | Once we **do** make progress, though, the [logical next
36 | step](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weekly.20meeting.202019-03-04/near/159940943)
37 | is probably to try and model those use cases some in Chalk, as well as
38 | to investigate more deeply how rustc could be extended to handle the
39 | cases natively (without blocking on full chalk integration).
40 |
41 | ### Dig into the chalk transition
42 |
43 | We [have a meeting scheduled for tomorrow](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weekly.20meeting.202019-03-04/near/159940496) with the RLS 2.0 folks, planning to talk about how the type checker is working in that context.
44 |
45 | [**We are thinking that integrating Chalk first into the RLS 2.0
46 | project may be a better idea than starting with
47 | rustc**](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weekly.20meeting.202019-03-04/near/159940552),
48 | particularly as it can help get RLS 2.0 to a "working product" faster,
49 | but also because we may be able to use that to pursue the idea of
50 | sharing more code between chalk + compiler than we could readily do
51 | with rustc. Specifically, we should be able to have:
52 |
53 | - a library to share the definition of types between chalk + RLS 2.0
54 | - shared code for lowering traits + impls into logical rules
55 |
56 | We also talked about other possible work on chalk, in particular the
57 | idea of chalk-specific refactorings but also building a [benchmarking
58 | harness](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weekly.20meeting.202019-03-04/near/159940894)
59 | for the `chalk-engine` crate.
60 |
61 | ## Miscellaneous discussion
62 |
63 | There are a few other things we talked about this week:
64 |
65 | - [the idea of a research intern working on chalk and what they might
66 | do](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weekly.20meeting.202019-03-04/near/159941464)
67 | - [how we might support `async fn` in traits without full GAT support](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weekly.20meeting.202019-03-04/near/159942222)
68 |
69 | ## Plans for the coming week
70 |
71 | We settled on the following plans for the coming week:
72 |
73 | So plans for this week are:
74 |
75 | - Describe how normalization works today and hold a (recorded) call to
76 | try and explain it to others. Trace through some of the examples
77 | where lazy norm would be helpful. (nikomatsakis)
78 | - Explore the use cases for GATs (aturon, centril)
79 | - Discuss RLS 2.0 type checker and contemplate how to integrate chalk
80 | into it (nikomatsakis, scalexm)
81 | - Maybe discuss other chalk improvements? (e.g., benchmarking harness) (nikomatsakis)
82 | - Maybe discuss the "lifetime capture" problem in impl Trait? (nikomatsakis, alexreg)
83 |
84 |
--------------------------------------------------------------------------------
/minutes/triage-2019-03-11.md:
--------------------------------------------------------------------------------
1 | # Triage meeting on 2019-03-11
2 |
3 | ## Info
4 |
5 | [Zulip thread][]
6 |
7 | [Zulip thread]: https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weeky.20meeting.202019-03-11
8 |
9 | ## Help wanted!
10 |
11 | - nikomatsakis is looking for someone to help with investigating lazy
12 | normatlization. The task would be to experimentally modify rustc and
13 | is best suited to someone already vaguely familiar with the Rust query
14 | system etc. See below.
15 |
16 | ## Summary
17 |
18 | We followed up on the goals from last time.
19 |
20 | ### Lazy normalization and const generics
21 |
22 | [Link](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weeky.20meeting.202019-03-11/near/160502973)
23 |
24 | Last week, nikomatsakis did more investigation, taking notes in [this
25 | dropbox paper document][lnpaper]. In general, it's still not entirely
26 | clear if the "cycle" that gives rise to the need for lazy
27 | normalization is something we can easily circumvent. One thing is that
28 | the `generics_of` and other queries for "anonymous constants"
29 | currently use the incorrect parent def-id precisely to avoid a cycle,
30 | so it's hard to see how the cycle would manifest.
31 |
32 | [lnpaper]: https://paper.dropbox.com/doc/Lazy-normalization-Ryv4YfpIcGAl6R3ZtWrWs
33 |
34 | **Next step:** re-establish the cycle in those queries so it can be observed.
35 |
36 | ### GATs
37 |
38 | [Link](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weeky.20meeting.202019-03-11/near/160503327)
39 |
40 | centril + aturon drew up a [paper document containing GAT use
41 | casts][gat] and there are some notes from the conversation in [this
42 | Zulip thread][gatthread].
43 |
44 | **Next step:** unclear, but probably to investigate the use cases and
45 | make some comments.
46 |
47 | [gat]: https://paper.dropbox.com/doc/GAT-use-case-analysis--AY1Ck74Fgk1Ztq1kHrethI8BAg-xFJQMxHXTOUekCyweukU1
48 | [gatthread]: https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/GAT.20use-case.20analysis
49 |
50 | ### Integrating into RLS 2.0
51 |
52 | [Link](https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/weeky.20meeting.202019-03-11/near/160503711)
53 |
54 | We had a chat ([with
55 | video](https://www.youtube.com/watch?v=Lmp3P9WNL8o)) about how the RLS
56 | 2.0 type checker works. We decided we'd rather try to do the chalk
57 | integration into RLS 2.0 "correct", meaning that we can share a lot
58 | more code with chalk.
59 |
60 | **Next step:** nikomatsakis to schedule some time to sketch out what chalk integration would look like.
61 |
62 | ### Other chalk improvements
63 |
64 | > Maybe discuss other chalk improvements? (e.g., benchmarking harness) (nikomatsakis)
65 |
66 | This didn't happen and we'll probably shelve it for now in favor of the previous point.
67 |
68 | ### "lifetime capture"
69 |
70 | > Maybe discuss the "lifetime capture" problem in impl Trait?
71 |
72 | This didn't happen and we'll probably shelve it for now in favor of the next point.
73 |
74 | ### Draft RFCs
75 |
76 | centril plans to (at minimum) upload some draft RFCs to a new wg-traits repository.
77 |
78 | ### Associated type bounds
79 |
80 | alexreg has been working on associated type bounds in [this Zulip
81 | thread][atb] and will likely continue to do so.
82 |
83 | [atb]: https://rust-lang.zulipchat.com/#narrow/stream/144729-t-compiler.2Fwg-traits/topic/associate.20type.20bounds
84 |
85 |
86 | ## Plans for the coming week
87 |
88 | - Try to correct the `generics_of` query etc for constants so we can
89 | observe what results.
90 | - **Help wanted!** nikomatsakis is looking for someone to help
91 | with investigating lazy normatlization. The task would be to
92 | experimentally modify rustc and is best suited to someone
93 | already vaguely familiar with the Rust query system etc.
94 | - Read-over GAT use cases and try to theorize about what it would take to
95 | support them in rustc etc (nikomatsakis)
96 | - Schedule a call to talk over what chalk integration into RLS 2.0 might look like (nikomatsakis)
97 | - Create a wg-traits repository to house draft RFCs and the like. (nikomatsakis)
98 | - Upload drafts of various traits-related RFCs to wg-traits (centril)
99 | - Continue work on associated type bounds (alexreg)
100 |
--------------------------------------------------------------------------------
/roadmap.toml:
--------------------------------------------------------------------------------
1 | [[group]]
2 | name = "rustc-universe-transition"
3 | label = "rustc universe transition"
4 | href = "https://github.com/rust-lang/rust/issues/56105"
5 | items = [
6 | { label = "introduce universe system into rustc", status="Complete", href="https://github.com/rust-lang/rust/pull/65232" },
7 | { label = "extend NLL solver with new universes", status="Complete", href="https://github.com/rust-lang/rust/pull/70950" },
8 | { label = "resolve wasm-bindgen interaction", status="Assigned" },
9 | ]
10 |
11 | [[group]]
12 | name = "align-rustc-predicate"
13 | label = "Align rustc predicates with chalk predicates"
14 | requires = ["rustc-universe-transition"]
15 | href = "https://github.com/rust-lang/compiler-team/issues/285"
16 | items = [
17 | { label = "isolate Binder into a Forall goal" },
18 | { label = "introduce Implication" },
19 | { label = "introduce Forall goals with types" },
20 | ]
21 |
22 | [[group]]
23 | name = "recursive-solver"
24 | label = "Experiment with a recursive chalk solver"
25 | items = [
26 | { label = "Write-up the idea that Niko had", status="Complete", href="https://gist.github.com/nikomatsakis/bfbdbe588d6fc61ecb09e3b51847fb7c" },
27 | { label = "Build prototype", status="Complete", href="https://github.com/rust-lang/chalk/issues/351" },
28 | { label = "Resolve coinductive semantics", status="Assigned", href="https://github.com/rust-lang/chalk/issues/399" },
29 | ]
30 |
31 | [[group]]
32 | name = "impl-trait"
33 | label = "Model `impl Trait`"
34 | items = [
35 | { label = "Preliminary model for opaque types where hidden types are known", status="Assigned", ref = "https://github.com/rust-lang/chalk/issues/335" },
36 | ]
37 |
38 | [[group]]
39 | name = "chalk-outlives"
40 | label = "Extend chalk with outlives goals"
41 | href = "https://github.com/rust-lang/chalk/issues/435"
42 | items = [
43 | { label = "add region outlives goals", status = "Complete" },
44 | { label = "add type outlives goals", status = "Complete" },
45 | { label = "add type outlives constraints", status = "Complete" },
46 | ]
47 |
48 | [[group]]
49 | name = "rust-analyzer-integration"
50 | label = "Integrate with rust-analyzer"
51 | requires = ["impl-trait"]
52 | items = [
53 | { label = "Ensure that we never need to ask for impls of unknown types", port = "askfor", requires = ["syntactic-semantic-equality"] },
54 | { label = "Deal with performance problems", status = "Blocked" },
55 | { label = "Deal with memory usage", status = "Blocked" },
56 | ]
57 |
58 | [[group]]
59 | name = "syntactic-semantic-equality"
60 | label = "Separate syntactic equality from semantic equality"
61 | href = "https://github.com/rust-lang/chalk/issues/364"
62 | requires = [
63 | "map-chalk-types-to-rustc-types:debruijn",
64 | "map-chalk-types-to-rustc-types:visit"
65 | ]
66 | status = "Assigned"
67 | items = [
68 | { label = "Implementation" }
69 | ]
70 |
71 | [[group]]
72 | name = "map-chalk-types-to-rustc-types"
73 | label = "Map chalk types to rustc types"
74 | href = "https://github.com/rust-lang/types-team/issues/16"
75 | items = [
76 | { label = "Rename Projection to Alias", status="Complete" },
77 | { label = "Make ty intern method take &self", href="https://github.com/rust-lang-nursery/chalk/issues/328", status="Complete" },
78 | { label = "Make ty data methods take &self", href="https://github.com/rust-lang/chalk/issues/339", status="Complete" },
79 | { label = "Make other intern method take &self", href="https://github.com/rust-lang-nursery/chalk/issues/340", status="Complete" },
80 | { label = "Make other data methods take &self", href="https://github.com/rust-lang/chalk/issues/341", status="Complete" },
81 | { label = "Align placeholders and ty::Param", status="Blocked" },
82 | { label = "Move Identifier to TypeFamily", status="Complete" },
83 | { label = "Adapt rustc's debruijn index model", port="debruijn", status="Complete", href="https://github.com/rust-lang/chalk/issues/334" },
84 | { label = "Adapt rustc's representation of late-bound items", status="Blocked" },
85 | { label = "Remove all vectors, boxes", href="https://github.com/rust-lang/chalk/issues/369", status="Complete" },
86 | { label = "Introduce a `Visit` trait", href="https://github.com/rust-lang/chalk/issues/333", status="Complete", port="visit" },
87 | { label = "Add and integrate flags into types and elsewhere" },
88 | ]
89 |
90 | [[group]]
91 | name = "chalk-builtin"
92 | label = "Extend chalk-solve with knowledge of builtin traits and types"
93 | href = "https://github.com/rust-lang/chalk/issues/363"
94 | items = [
95 | { label="create concept of well-known traits", status="Complete", href="https://github.com/rust-lang/chalk/issues/356" },
96 | { label="support the `Sized` trait", status="Complete", href="https://github.com/rust-lang/chalk/issues/261" },
97 | { label="support the `Clone` trait", status="Complete", href="https://github.com/rust-lang/chalk/issues/363" },
98 | { label="support the `Copy` trait", status="Complete", href="https://github.com/rust-lang/chalk/issues/363" },
99 | { label="model `ObjectSafe` goals", status="Complete", href="https://github.com/rust-lang/chalk/pull/434" },
100 | { label="support the `Unsized` trait", status="Complete", href="https://github.com/rust-lang/chalk/pull/427" },
101 | { label="extend `TypeName` with builtin types", href="https://github.com/rust-lang/chalk/issues/368" },
102 | { label="support the `Fn` traits", status="Complete" },
103 | ]
104 |
105 | [[group]]
106 | name = "chalk-const"
107 | label = "Extend chalk to support constants"
108 | items = [
109 | { label="introduce constant 'kind', alongside types and lifetimes", status="Complete", href="https://github.com/rust-lang/chalk/pull/393" },
110 | ]
111 |
112 | [[group]]
113 | name = "rustc-integration-mvp"
114 | label = "Integrate chalk-solve into rustc"
115 | href = "https://github.com/rust-lang/types-team/issues/18"
116 | requires = [ "map-chalk-types-to-rustc-types", "chalk-const", "chalk-builtin", "chalk-outlives" ]
117 | items = [
118 | { label="remove old chalk support", status="Complete", href="https://github.com/rust-lang/rust/pull/69247" },
119 | { label="exploratory integration to better uncover requirements", href="https://github.com/rust-lang/rust/pull/69406", status="Complete" },
120 | { label="map rustc types to chalk types", status="Complete" },
121 | { label="map rustc predicates to chalk goals, clauses", status="Complete" },
122 | { label="implement RustIrDatabase in trait", status="Complete" },
123 | ]
124 |
125 | [[group]]
126 | name = "features"
127 | label = "Explore proposed language features"
128 | requires = [ "rustc-integration-mvp", "rust-analyzer-integration" ]
129 | status = "Blocked"
130 | items = [
131 | { label="Implied bounds" },
132 | { label="Specialization", href="https://github.com/rust-lang/chalk/issues/9" },
133 | ]
134 |
135 | [[group]]
136 | name = "chalk-debugging"
137 | label = "Improve ability to debug chalk from within rustc or rust-analyzer"
138 | requires = [ ]
139 | items = [
140 | { label="Integrate tracing library", href="https://github.com/rust-lang/chalk/issues/337", status="Complete" },
141 | { label="Extract standalone examples automatically", href="https://github.com/rust-lang/chalk/issues/365", status="Assigned" },
142 | ]
143 |
144 | [[goal]]
145 | name = "library"
146 | label = "Chalk usable as a standalone library for traits solving"
147 | requires = [ "rustc-integration-mvp", "rust-analyzer-integration", "chalk-debugging" ]
148 |
149 | [[goal]]
150 | name = "gats"
151 | label = "Deploy GATs in Rust nightly"
152 | requires = [ "align-rustc-predicate" ]
153 |
--------------------------------------------------------------------------------
/sprints/2020-1.md:
--------------------------------------------------------------------------------
1 | FIXME: add an overview of work done in 2020 sprint 1
2 |
3 | Link to summary blog post:
4 | https://blog.rust-lang.org/inside-rust/2020/03/28/traits-sprint-1.html
5 |
--------------------------------------------------------------------------------
/sprints/2020-2.md:
--------------------------------------------------------------------------------
1 | # wg-traits sprint 2020-03-31 ..
2 |
3 | **Pulled from https://hackmd.io/kYWsWI9IS0213x0qX_1RDw on 2020/5/14**
4 |
5 | * Goal: Rustc integration MVP ([tracking issue](https://github.com/rust-lang/wg-traits/issues/18))
6 | * Initial integration work landed
7 | * Made a lot of progress towards extending chalk to support builtin types and traits
8 | * Currently using some hacks in rustc for some of them
9 | * Next steps:
10 | * Extend chalk to be able to represent all of the Rust types [chalk#368](https://github.com/rust-lang/chalk/issues/368)
11 | * Connect rustc types to the builtin chalk types
12 | * Auto trait handling for builtin chalk types
13 | * Handling int and float literal inference variables
14 | * Region / outlives integration
15 | * Bound inference variables, perhaps?
16 | * Goal: Plan for what const integration looks like ([tracking issue](https://github.com/rust-lang/wg-traits/issues/15))
17 | * Held [initial meeting](https://zulip-archive.rust-lang.org/144729wgtraits/23279designmeeting20200407.html) and designed a minimal subset
18 | * Implementing a [pending PR](https://github.com/rust-lang/chalk/pull/393) which uncovered some interesting questions about how to represent constants
19 | * Next steps:
20 | * [Resolve `GenericArg` handling](https://github.com/rust-lang/chalk/issues/452)
21 | * Land [chalk#393](https://github.com/rust-lang/chalk/pull/393) which will offer basic constant support
22 | * it has been reviewed and we are working out the [list of test cases](https://hackmd.io/Ah_J6nFQSbuUiVOsH5acLg)
23 | * next steps:
24 | * incorporate some mention into the chalk book
25 | * Goal: Move towards alignment of rustc and chalk types, and towards extracting a shared library ([tracking issue](https://github.com/rust-lang/wg-traits/issues/16))
26 | * [Doc from meeting](https://hackmd.io/roRq0qHMQ6CyRJxj_FsPSQ)
27 | * Extended chalk types to support builtin rust types and traits
28 | * Refactoring of predicates on rustc side to be interned and match chalk conventions [rust-lang/rust#72055](https://github.com/rust-lang/rust/pull/72055)
29 | * Next steps:
30 | * Finalize naming conventions and rename as necessary
31 | * Create issues around rustc side
32 | * Goal: basic support for impl Trait ([tracking issue](https://github.com/rust-lang/chalk/issues/335))
33 | * basic support has landed: [PR #324](https://github.com/rust-lang/chalk/pull/324), :tada:
34 | * working now on adding better generics support
35 | * [Next steps](https://github.com/rust-lang/chalk/issues/335#issuecomment-615254659)
36 | * Goal: progress towards removing leak check in rustc ([tracking issue](https://github.com/rust-lang/rust/issues/59490))
37 | * Landed [#70950](https://github.com/rust-lang/rust/pull/70950) which aligns NLL with lexical checker
38 | * but to truly remove leak check we have to resolve some back-compat interactions
39 | * Next steps:
40 | * rustc refactoring to move leak check to occur later, which unblocks lazy norm and a few other changes
41 | * explore a smarter variant of leak check that takes into account implied bounds and is able to continue accepting wasm-bindgen
42 | * Goal: exploration and research
43 | * exploring recursive solver (flodiebold)
44 | * initial version has landed and been integrated into rust-analyzer
45 | * Follow-up items:
46 | * fix coinduction [chalk#399](https://github.com/rust-lang/chalk/issues/399)
47 | * revisiting the chalk-solve crate structure
48 | * documenting how it works in chalk-book
49 | * comparison between it and SLG checker
50 | * explore converting semantic-to-syntactic equality
51 | * [draft PR opened](https://github.com/rust-lang/chalk/pull/401)
52 | * create a chalk file from any given program
53 | * [draft PR opened](https://github.com/rust-lang/chalk/pull/430) and it's starting to work
54 | * Goal: increase Chalk performance (very open-ended)
55 | * Create a set of benchmarks
56 | * no progress
57 | * Add tracing support
58 | * opened a [draft PR](https://github.com/rust-lang/chalk/pull/409)
59 | * Track memory usage and try to decrease as necessary
60 | * no progress
61 | * Goal: add more to Chalk book
62 | * Added [chalk big picture](http://rust-lang.github.io/chalk/book/#high-level-view-of-how-chalk-works) material
63 | * Moved content from [rustc-dev-guide](https://rustc-dev-guide.rust-lang.org/traits/chalk-overview.html)
64 | * Added [table tracking the well-known traits](http://rust-lang.github.io/chalk/book/clauses/well_known_traits.html#current-state)
65 | * Next steps:
66 | * glossary and notation for common terms
67 | * the `?0` notation
68 | * the `^0` notation
69 | * the `!0` notation
70 | * what is a "bound variable", an "inference variable", and a "placeholder variable", and what do they *mean* semantically
71 |
--------------------------------------------------------------------------------
/src/SUMMARY.md:
--------------------------------------------------------------------------------
1 | # Summary
2 |
3 | - [Welcome](./welcome.md)
4 | - [Development roadmap](./roadmap.md)
5 | - [Minutes and design notes](./minutes.md)
6 |
--------------------------------------------------------------------------------
/src/minutes.md:
--------------------------------------------------------------------------------
1 | Minutes from various meetings are located in [the `minutes` directory
2 | on the github repository][minutes].
3 |
4 | [minutes]: https://github.com/rust-lang/types-team/tree/master/minutes
5 |
--------------------------------------------------------------------------------
/src/roadmap.md:
--------------------------------------------------------------------------------
1 | # Development roadmap
2 |
3 | We maintain a [development roadmap][dr] that shows both our current
4 | efforts, future work we have in mind, and the overall goals we are
5 | working towards. Many of the items on that map have links that lead to
6 | corresponding issues on the appropriate tracker. Alternatively, if
7 | you're just looking for issues to pick up, you can take a look at
8 | these issue lists on Github:
9 |
10 | * [current-sprint issues on chalk](https://github.com/rust-lang/chalk/labels/current-sprint)
11 |
12 | We are working from a 6-week "sprint cycle". We're still working out
13 | the details of how we organize our sprints. For now, if you'd like to
14 | claim one of the above issues or get involved, though, drop by on [the
15 | rust-lang Zulip] in the [`#t-types`] stream and say hello!
16 |
17 | [the rust-lang Zulip]: https://rust-lang.zulipchat.com/
18 | [`#t-types`]: https://rust-lang.zulipchat.com/#narrow/stream/144729-t-types
19 | [dr]: roadmap/skill-tree.html
20 |
--------------------------------------------------------------------------------
/src/welcome.md:
--------------------------------------------------------------------------------
1 | # Welcome to the types team
2 |
3 | ## Scope and purpose
4 |
5 | The **types** team is dedicated to improving the trait
6 | system implementation in rustc. This team is a collaboration
7 | between the [lang team] and the compiler team. We have a number of inter-related
8 | goals:
9 |
10 | - designing new trait-related language features;
11 | - documenting and specifying the semantics of traits in Rust today; and,
12 | - improving the trait solver implementation in rustc.
13 |
14 | [lang team]: https://github.com/rust-lang/lang-team/
15 |
16 | A big part of this work is transitioning the compiler to use a
17 | [Chalk-style] solver, but along the way we hope to make targeted fixes
18 | to the existing solver where needed.
19 |
20 | [Chalk-style]: https://github.com/rust-lang-nursery/chalk
21 |
22 | ## Design meetings
23 |
24 | We hold weekly design meetings where we talk in depth about various
25 | topics ([calendar event][ce-design]). These meetings take place on Zulip (see below). The goal is
26 | not just to figure out what we want to do, it's also a way to spread
27 | knowledge. Feel free to come and lurk!
28 |
29 | [ce-design]: https://calendar.google.com/event?action=TEMPLATE&tmeid=MnFmbmdkaGV0aXE3Zjc4cjlpNWVjNDRoZXMgNnU1cnJ0Y2U2bHJ0djA3cGZpM2RhbWdqdXNAZw&tmsrc=6u5rrtce6lrtv07pfi3damgjus%40group.calendar.google.com
30 |
31 | You'll find minutes from past meetings in [the minutes
32 | directory](minutes). We also keep have a
33 | [hackmd](https://hackmd.io/nrhN5A8sR2eY9UdfJTKcJg?edit) where we keep
34 | a log of what's been happening and track possible agendas for upcoming
35 | meetings.
36 |
37 | ## Chat forum
38 |
39 | On [the rust-lang Zulip][z], in [the `#t-types` stream][s].
40 |
41 | [z]: https://rust-lang.zulipchat.com/
42 | [s]: https://rust-lang.zulipchat.com/#narrow/stream/144729-t-types
43 |
44 | ## Dedicated repository
45 |
46 | Documents related to the types team are stored on a
47 | dedicated repository, [rust-lang/types-team]. This repository contains
48 | meeting minutes, past sprints, as well as draft RFCs and other
49 | documents.
50 |
51 | [rust-lang/types-team]: https://github.com/rust-lang/types-team
52 |
--------------------------------------------------------------------------------
/triagebot.toml:
--------------------------------------------------------------------------------
1 | [major-change]
2 | second_label = "final-comment-period"
3 | meeting_label = "to-announce"
4 | open_extra_text = "cc @rust-lang/types"
5 | zulip_stream = 326866 # #T-types/nominated
6 | zulip_ping = "T-types"
7 |
8 | [assign]
9 |
--------------------------------------------------------------------------------