-
-
Notifications
You must be signed in to change notification settings - Fork 14.6k
Make some MIR ref types closer to the source they are lowered from #150171
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
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -760,10 +760,12 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> { | |
| } | ||
|
|
||
| let num_stmts = self.source[loc.block].statements.len(); | ||
| let new_temp = self.promoted.local_decls.push(LocalDecl::new( | ||
| self.source.local_decls[temp].ty, | ||
| self.source.local_decls[temp].source_info.span, | ||
| )); | ||
| let new_local_decl = { | ||
| let temp = &self.source.local_decls[temp]; | ||
| let local_decl = LocalDecl::new(temp.ty, temp.source_info.span); | ||
| if temp.mutability == Mutability::Not { local_decl.immutable() } else { local_decl } | ||
| }; | ||
| let new_temp = self.promoted.local_decls.push(new_local_decl); | ||
|
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This wasn’t discussed in For example, the promoted const in the following code: static FOO: () = {
let _ = &&FOO;
};is currently lowered to: I think it would make more sense for It seems very unlikely that _2 would ever be truly mutable (for example, being reassigned with a different value), but anyway
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Mutability of local variables is pretty much entirely irrelevant in MIR. I don't think it's worth changing this, and it definitely should be separated from the other change which is about the actual types we see in MIR. |
||
|
|
||
| debug!("promote({:?} @ {:?}/{:?}, {:?})", temp, loc, num_stmts, self.keep_original); | ||
|
|
||
|
|
||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. None of these tests actually demonstrate the type of these temporaries changing, right? This just removes some mutability, which is largely irrelevant on the MIR level. Could you add a test that shows the new logic in action? Ideally add the test in a first commit before the other changes, and then in the 2nd commit just have the diff of what that commit does to the test, so one can see it in action. |
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 will only find
&rawone level up, but will fail to detect&raw static.field1.field2or similar expressions.I am not very familiar with this code -- isn't there some existing infrastructure to figure out the "place context" we are in?
As usual I am not sure whom to ping for MIR building things...
Cc @oli-obk @matthewjasper @saethlin
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.
Oh, exactly
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.
Should we also handle cases like
&raw const STATIC[idx]or&raw mut STATIC[start..end]?Coming back to the original issue: since
std::ops::Index::indextakes&Selfas its receiver, the technically correct form would beunsafe { &*&raw const STATIC }[idx]. That said,unsafe { &*&raw const STATIC[idx] }might already be sufficient to convey the user’s intent—that they are explicitly acknowledging and accepting the potential UB. 🤔