# Chalk planning ## 2022-09-12 Niko jotting down some notes. Key formality/chalk capabilities and ideas ```mermaid flowchart LR Implications ExistsPredicates GeneralizedForAllPredicates HigherRankedInTraitSystem Implications --> ExistsPredicates Implications --> GeneralizedForAllPredicates HigherRankedInTraitSystem --> Polonius Polonious ``` ### Implications (`P => Q`) Being able to introduce new facts into the environment. Needed to support `exists<T>` goals as where-clauses. Also needed to prove the desired design for GAT implied bounds. Introdues some complications. Have to be able to deal with things like `'a: 'b`. ### ForAll over anything Generalizing forall beyond lifetimes. This is already *mostly* plumbed through rustc, I believe, in the form of placeholders. ### Exists where-clauses Needed for properly modeling RPIT. Easy with ## 2022-09-02 ### OUTCOME * coherence/specialization/wfcheck * move these to a separate solver * remove code from rustc solvers that is geared towards specialization * convert some of the `select_all_or_error` to evaluate or queries today * could enumerate a set of issues for these * try to replace some of the ad-hoc logic with more logical logic --- * chalk-ty library extraction * can we extract the inference context and the operations on it? * mir formality subtyping * different type syntax * richer types (forall T, T ensures P, P => T) * simplesub <-- does this get us into trouble around `fn` types * managing higher-ranked and outlives calculations <-- lcnr * interaction of ty and goals ### biggest goals * a lowering from Rust syntax into program clauses that controls trait matching * a reusable library that encapsulates trait matching, type operations, etc * query setup that allows you to solve constraints without affecting the existing environment ### Chalk deferred items * Const eval * SLG: associated type ambiguity * Placeholder canonicalization * Finishing touches on folder traits * projections: ty -> term * closure bug: https://github.com/rust-lang/chalk/issues/688 * Region constraints?? * Specialization * Sem/syn equality? (not sure, needs thinking) * early bound vs late bound ### A-mir-formality * differences between chalk or rustc * missing pieces: * specialization * TAITs #### associated type normalization, a redive #### implied bounds ### sem-syn equality related developments: * unsoundness-esque interaction with `TypeId` that lcnr found * type alias work * refinement traits ### diagnostics * how many solvers * do we want a separate diagnostic solver? ```rust trait Foo { fn bar<T>(&self, t: T) -> T; } <T as Foo>::bar::<u32>() <T as Foo>::bar(&'a Self, u32) Normalize( <?A as Foo>::bar::<'?x, ?B>(&'?x ?A, ?B), ?B, ) ``` ### shallow subtyping ### rustc architecture * env layer * tracks * placeholders * inference variables * unifications for inference variables (A := B) * relations between inference variables (A <= B) * trait solver proper ("logic layer" in mir-formality) * `(Env, Goal) -> Solution` * type relations code * `(Env, Relation) -> (Env, Goals)` * defines * subtyping * region-outlives * ty-outlives * coherence, wfcheck * checking for overlap * comparing impl against trait * specialization * uses a fresh fulfillment context to compute implication * `compare_method` * compare entailment of various kinds * HIR WF Check * walks the HIR and reports errors, pretty easy case, but does report errors * check const * const qualification * TAITs * check that hidden type is well-formed and meets its bounds * rustdoc * `AutoTraitFinder` * borrow checker * takes as input: * MIR CFG * type checker * takes as input: * MIR * compute implied outlives bounds * require_same_types from check_many_fn * should be a query, but needs diagnostics * `check_opaque_meets_bounds` * part of typecheck, reports errors * `can_type_implement_copy` * probably can just be a call to evaluate * other special traits * e.g., `DispatchFromDyn` * `implied_outlives_bounds` #### creepy coercions * `expected_inputs_for_output` -- part of coercion logic * the "should coerce unsized" apply does some creepy stuff * `can_coerce` * autoderef loop * doesn't really need to normalize at all, could just use `predicate_may_hold` #### low-level methods and functions * trans / codegen_fulfill_obligation * should become normalization queries in the fullness of time * `impossible_predicates` * `type_known_to_meet_bound_modulo_regions` * where is this used?? can we query it? * `fully_normalize` -- can become a query or perhaps just invoke `type_meets_bound` * `type_implements_fn_trait` -- error reporting, clearly a query * `scrape_region_constraints` -- part of the complex NLL query region system #### structural match * `structural_match` ### rustc uses the trait solver..where? * selection context * coherence * HIR type checker enqueues obligations * MIR type checker * query operations * dropck * evaluation * method evaluation asks for evaluations to figure out which * other weird things