-
Notifications
You must be signed in to change notification settings - Fork 533
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Update ParamEnv
section for TypingEnv
changes
#2265
base: master
Are you sure you want to change the base?
Conversation
When needing a `ParamEnv` in the compiler there are a few options for obtaining one: | ||
- The correct env is already in scope simply use it (or pass it down the call stack to where you are). | ||
- The [`tcx.param_env(def_id)` query][param_env_query] | ||
- Use [`ParamEnv::new`][param_env_new] to construct an env with an arbitrary set of where clauses. Then call [`traits::normalize_param_env_or_error`][normalize_env_or_error] which will handle normalizing and elaborating all the where clauses in the env for you. | ||
- Creating an empty environment with [`ParamEnv::empty`][env_empty] | ||
|
||
In the large majority of cases, when a `ParamEnv` is required it already exists somewhere in scope or above in the call stack and should be passed down. A non exhaustive list of places where you might find an existing `ParamEnv`: | ||
- During typeck `FnCtxt` has a [`param_env` field][fnctxt_param_env] | ||
- When writing late lints the `LateContext` has a [`param_env` field][latectxt_param_env] | ||
- During well formedness checking the `WfCheckingCtxt` has a [`param_env` field][wfckctxt_param_env] | ||
- The `TypeChecker` used by Mir Typeck has a [`param_env` field][mirtypeck_param_env] | ||
- In the next-gen trait solver all `Goal`s have a [`param_env` field][goal_param_env] specifying what environment to prove the goal in | ||
- When editing an existing [`TypeRelation`][typerelation] if it implements [`PredicateEmittingRelation`][predicate_emitting_relation] then a [`param_env` method][typerelation_param_env] will be available. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would flip this: pretty much everyone who needs to look at this dev guide chapter should work on things which already have a ParamEnv
/TypingEnv
in scope. I would like to make this very explicit and more strongly highlight "or pass it down the call stack to where you are".
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's true 🤔 u right
[pe]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.ParamEnv.html | ||
[normalize_env_or_error]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_trait_selection/traits/fn.normalize_param_env_or_error.html | ||
|
||
### Bundling |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would not talk about ParamEnvAnd
much. You should pretty much always use PseudoCanonicalInput
via Infcx::pseudo_canonicalize_query
or CanonicalQueryInput<'tcx, ParamEnvAnd<'tcx, V>>
via fn canonicalize_query
.
I feel like we should probably change canonicalize_query
to take the param_env + value separately and only use ParamEnvAnd
directly inside of CanonicalQueryInput
, removing the and
function.
|
||
Depending on what context we are performing type system operations in, different behaviour may be required. For example during coherence there are stronger requirements about when we can consider goals to not hold or when we can consider types to be unequal. | ||
|
||
Tracking which "phase" of the compiler type system operations are being performed in is done by the [`TypingMode`][tenv] enum. The documentation on the `TypingMode` enum is quite good so instead of repeating it here verbatim we would reccomend reading the API documentation directly. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tracking which "phase" of the compiler type system operations are being performed in is done by the [`TypingMode`][tenv] enum. The documentation on the `TypingMode` enum is quite good so instead of repeating it here verbatim we would reccomend reading the API documentation directly. | |
Tracking which "phase" of the compiler type system operations are being performed in is done by the [`TypingMode`][tenv] enum. The documentation on the `TypingMode` enum is quite good so instead of repeating it here verbatim we would recommend reading the API documentation directly. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
❤️ :3
some nits
title.
cc @lcnr