-
Notifications
You must be signed in to change notification settings - Fork 14.1k
MGCA: Syntactically distinguish anon const const args #149136
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?
Conversation
|
Some changes occurred in compiler/rustc_builtin_macros/src/autodiff.rs cc @ZuseZ4 |
|
|
This comment has been minimized.
This comment has been minimized.
| && let StmtKind::Expr(expr) = &stmt.kind | ||
| && matches!(expr.kind, ExprKind::Path(..) | ExprKind::Struct(..)) | ||
| { | ||
| return self.lower_expr_to_const_arg_direct(expr); |
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 think that this very basic recursive setup means that under mgca we'd now accept {{ N }} and {{{{{{ <T as Trait>::ASSOC }}}}}} and whatnot. ie arbitrary braces surrounding direct args. this seems fine:tm: to me for now
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.
tests/ui/const-generics/mgca/multi_braced_direct_const_args.rs
a786e30 to
09d75e3
Compare
This comment has been minimized.
This comment has been minimized.
09d75e3 to
5c64af2
Compare
|
Some changes occurred in src/tools/clippy cc @rust-lang/clippy |
|
☔ The latest upstream changes (presumably #149387) made this pull request unmergeable. Please resolve the merge conflicts. |
r? oli-obk
tracking issue: #132980
This PR requires that when
feature(min_generic_const_args)is enabled, anon const const args are syntactically distinguishable from other kinds of args. We useconst { ... }in const argument position to denote an anon const:This restriction is only placed when mgca is enabled. There should be no effect on stable.
This restriction allows us to create
DefIds for anon consts only when actually required. When it is syntactically ambiguous whether a const argument is an anon const or not we are forced to conservatively create aDefIdfor every const argument even if it doesn't wind up needing one.This works fine on stable but under
mgcawe can wind up with anon consts nested inside non-anon-const const arguments resulting in a brokenDefIdtree. See #148838 where an anon const arg inside of a path arg winds up with a parent of a conservatively createdDefIdthat doesn't actually correspond to an anon const, resulting in an ICE.With #149114 every field initialiser in a const argument would become a place where there could possibly be an anon const. This would also get worse once we support tuple constructors- now every function argument is a place where there could possibly be an anon const.
We introduce this restriction to avoid creating massive amounts of unused
DefIds that make the parent tree significantly more complicated, and to avoid having to paper over this issue in things likegenerics_of.Fixes #148838
It also must be syntactically clear from context whether
'_means an inference lifetime or an elided lifetime parameter. This restriction will allow us to properly resolve'_in const arguments in mgca. This PR doesn't actually fix handle this, but we could do so trivially after this lands.