-
Notifications
You must be signed in to change notification settings - Fork 12.8k
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
Add some high-level docs to FnCtxt
and ItemCtxt
#100256
Conversation
I haven't understood the difference between these before, but `@compiler-errors` helped me clear it up. Hopefully this will help other people who've been confused!
Please let me know if I mixed these up or if there are any other inaccuracies :) |
@@ -26,6 +26,8 @@ use rustc_trait_selection::traits::{ObligationCause, ObligationCauseCode}; | |||
use std::cell::{Cell, RefCell}; | |||
use std::ops::Deref; | |||
|
|||
/// The `FnCtxt` stores type-checking context needed to type-check function bodies, | |||
/// in contrast to [`ItemCtxt`], which is used to type-check item *signatures*. |
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.
It's a bit more accurate to mention:
- that this is used to lower things where we don't care about the body. For example,
ItemCtxt
is used to check structs and stuff too.
i. An important distinction is thatFnCtxt
has anInferCtxt
, whileItemCtxt
expects no inference to go on in there. - This is also (via the
AstConv
trait) primarily used for lowering things from HIR -> middle representations of things. For example, we use it in thetcx.type_of
query, which does little checking and mostly lowering.
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.
Thanks! I added the info you suggested.
The one thing is that I couldn't find an InferCtxt
field -- or any mention of InferCtxt
for that matter -- in FnCtxt
. Is it accessed in some indirect way?
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.
Is it accessed in some indirect way
Yea, good question. It's stored in inh: &Inherited
-- this is how several FnCtxt
s actually share the same InferCtxt
. This Inherited
struct is important because closures can share inference variables and other info to their containing functions, for example.
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.
Ah, that makes sense! Thanks :)
This comment has been minimized.
This comment has been minimized.
3e79ff2
to
2887e03
Compare
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.
This is a good addition, thanks.
r=me once CI is green.
@bors r=compiler-errors rollup |
…r-errors Add some high-level docs to `FnCtxt` and `ItemCtxt` I haven't understood the difference between these before, but ``@compiler-errors`` helped me clear it up. Hopefully this will help other people who've been confused! r? `@compiler-errors`
@bors r- |
2887e03
to
31a0518
Compare
r=me when things work |
Should be good now. @bors r=compiler-errors |
…iaskrgr Rollup of 14 pull requests Successful merges: - rust-lang#98775 (rustdoc: improve scroll locking in the rustdoc mobile sidebars) - rust-lang#99479 (rustdoc-json: Remove doc FIXME for Import::id and explain) - rust-lang#100040 (Error on broken pipe but do not backtrace or ICE) - rust-lang#100072 (linker-plugin-lto.md: Correct the name of example c file) - rust-lang#100098 (Some "this expression has a field"-related fixes) - rust-lang#100226 (Do not manually craft a span pointing inside a multibyte character.) - rust-lang#100240 (Fail gracefully when const pattern is not structural match.) - rust-lang#100256 (Add some high-level docs to `FnCtxt` and `ItemCtxt`) - rust-lang#100261 (Set tainted errors bit before emitting coerce suggestions.) - rust-lang#100275 (also update anyhow in codegen_cranelift) - rust-lang#100281 (Remove more Clean trait implementations) - rust-lang#100314 (Mention `unit-test` in MIR opt test README) - rust-lang#100319 (Remove more Clean trait implementations) - rust-lang#100323 ([rustdoc] Don't render impl blocks with doc comment if they only contain private items by default) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
I haven't understood the difference between these before, but
@compiler-errors
helped me clear it up. Hopefully this will help otherpeople who've been confused!
r? @compiler-errors