-
Notifications
You must be signed in to change notification settings - Fork 12.9k
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
Handle lifetimes correctly in sym
in inline and global asm
#116087
Conversation
(rustbot has picked a reviewer for you, use r? to override) |
This comment has been minimized.
This comment has been minimized.
3246226
to
97d5dfd
Compare
This comment has been minimized.
This comment has been minimized.
Some changes occurred in compiler/rustc_codegen_cranelift cc @bjorn3 Some changes occurred in src/tools/clippy cc @rust-lang/clippy |
This comment has been minimized.
This comment has been minimized.
4a4079c
to
6d97415
Compare
sym
in inline and global asmsym
in inline and global asm
@@ -128,7 +128,7 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Generics { | |||
Node::Expr(&Expr { kind: ExprKind::InlineAsm(asm), .. }) | |||
if asm.operands.iter().any(|(op, _op_sp)| match op { | |||
hir::InlineAsmOperand::Const { anon_const } | |||
| hir::InlineAsmOperand::SymFn { anon_const } => { | |||
| hir::InlineAsmOperand::SymFnInGlobal { anon_const } => { |
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 not reachable here since this is only reached for ExprKind::InlineAsm
, not `ItemKind::GlobalAsm``.
Why is it necessary to change |
inline consts ( |
☔ The latest upstream changes (presumably #116310) made this pull request unmergeable. Please resolve the merge conflicts. |
Is anon const actually the desirable semantics here, or it just happens to be the current semantics?
That's what I'd expect to do. |
This is not possible at the moment. Global-asm aren't type-checked in the sense of HIR bodies, nor are they represented with a HIR body. I'd rather just altogether deny lifetime arguments in |
What do you mean by not possible?
Why it it ok to have type arguments, but not lifetime arguments? fn foo<T: Copy>() {}
sym foo::<NonCopy> The question about anon consts vs inline consts also wasn't answered. |
That's because enum discriminants actually correspond to expressions in HIR.
Because we explicitly erase lifetime arguments during writeback in HIR.
They are bodies. They just don't have a parent body, which is required for inline-consts to make sense. Inline consts are type-checked in the parent body, like closures. It's like having a closure with no enclosing body -- it doesn't make sense. @petrochenkov: Remind me what specific question about inline you want answered, though? |
What would be the preferable semantics for |
Okay, then Yes, |
I predict this is going to be prohibitively complicated.
This is not exactly the same situation as const initializers or enum variant discriminants, since they never have the possibility of participating in region inference with infer lifetimes that may be inherited from the parent, nor can they reference late-bound regions (which are very very broken, even with Their restrictions means that it's okay for them to be represented as an |
Don't care to work on this anymore. |
Fixes #111709
Fixes #96304
sym
in global-asm can never reference regions other than'static
, so it suffices to fold the constant and replace erased regions with'static
(see first commit). However, we want to be able to mention both early- and late-bound (and local, e.g. #111709) regions from the function in inline-asm.This change is a bit invasive, but I'm not really convinced it can be simpler, at least without having to teach
global_asm!
how to be an inference body or something.This conceptually reverts part of dc345d8 for inline asm, insofar as we return to treating
SymFn
in non-global_asm bodies as a regular HIR exprs.cc @Amanieu who stabilized
sym
in #93333