-
Notifications
You must be signed in to change notification settings - Fork 13.2k
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
[WIP] Support param bounds on non-lifetime binders #115362
base: master
Are you sure you want to change the base?
[WIP] Support param bounds on non-lifetime binders #115362
Conversation
@bors try @rust-timer queue |
⌛ Trying commit 3471faa6dbd43943bb8dc2e3bdedf59fab546439 with merge ff357375eca19961c0e26a765585b8cf4b3a1b3c... |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
💔 Test failed - checks-actions |
☔ The latest upstream changes (presumably #115361) made this pull request unmergeable. Please resolve the merge conflicts. |
3471faa
to
c915474
Compare
This comment has been minimized.
This comment has been minimized.
☔ The latest upstream changes (presumably #115751) made this pull request unmergeable. Please resolve the merge conflicts. |
c915474
to
53c5310
Compare
This comment has been minimized.
This comment has been minimized.
53c5310
to
cbe1bbd
Compare
This comment has been minimized.
This comment has been minimized.
☔ The latest upstream changes (presumably #116885) made this pull request unmergeable. Please resolve the merge conflicts. |
Obviously, this is still WIP. Here's one observation I made while playing around with this patch: trait Trait<T> {}
fn f(_: impl for<T: ?Sized> Trait<T>) {} This successfully compiles ( |
cbe1bbd
to
82ae54c
Compare
@bors try @rust-timer queue |
This comment has been minimized.
This comment has been minimized.
…where-clauses, r=<try> [WIP] Support param bounds on non-lifetime binders 👀 r? `@ghost`
…where-clauses, r=<try> [WIP] Support param bounds on non-lifetime binders 👀 r? `@ghost`
This comment has been minimized.
This comment has been minimized.
☀️ Try build successful - checks-actions |
This comment has been minimized.
This comment has been minimized.
Finished benchmarking commit (abe0bfa): comparison URL. Overall result: ❌ regressions - please read the text belowBenchmarking this pull request likely means that it is perf-sensitive, so we're automatically marking it as not fit for rolling up. While you can manually mark this PR as fit for rollup, we strongly recommend not doing so since this PR may lead to changes in compiler perf. Next Steps: If you can justify the regressions found in this try perf run, please indicate this with @bors rollup=never Instruction countThis is the most reliable metric that we have; it was used to determine the overall result at the top of this comment. However, even this metric can sometimes exhibit noise.
Max RSS (memory usage)Results (primary 0.9%, secondary 2.5%)This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.
CyclesResults (primary 1.4%, secondary 1.9%)This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.
Binary sizeThis benchmark run did not return any relevant results for this metric. Bootstrap: 777.662s -> 789.655s (1.54%) |
513eeb3
to
a16ef16
Compare
This comment has been minimized.
This comment has been minimized.
a16ef16
to
82e6b20
Compare
This comment has been minimized.
This comment has been minimized.
82e6b20
to
058f940
Compare
I'd like to land this is (mostly) the state that it's in, if only so that we now have a place to experiment with non-lifetime binders (both This is IMO a necessary somewhat drastic hit to performance that I don't think is fixable, since we need to add new clauses to binders. I'm happy to consider optimizations if people think that I'm missing something obvious here, though I'm not certain that the performance hit comes from anything other than just making binders larger in size and giving them more fields to have to be dealt with in common operations. r? lcnr |
changes to the core type system This PR changes a file inside HIR ty lowering was modified cc @fmease Changes to the size of AST and/or HIR nodes. cc @nnethercote Some changes occurred in src/tools/clippy cc @rust-lang/clippy |
cc @rust-lang/types rust-lang/types-team#81 |
I did some perf runs locally and it seems like most is inlining changes around type folders:
Similarly While I can see us playing inliner golf, that's something we could have done before to find some more local optima. So 👍 on landing this and taking the perf hit (most of it is in instructions anyway, cycles is more on the 1% maximum regression side). |
} | ||
hir::GenericParamKind::Const { .. } => { | ||
let param_def_id = param.def_id.to_def_id(); | ||
let ct_ty = tcx.type_of(param_def_id).instantiate_identity(); |
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.
why do we shift types but not consts?
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.
we don't support non lifetime consts :>
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.
er, higher ranked consts.
let ct = self.lower_const_param(param_def_id, param.hir_id); | ||
if let ty::ConstKind::Bound(..) = ct.kind() { | ||
// We don't allow const params in non-lifetime binders today. | ||
tcx.dcx().span_delayed_bug( |
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.
ì guess that's why xd 🤔 why not?
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.
const eval is fucked up
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.
specifically, given a situation like: for<const C: usize> [T; C]: Trait
, that C
in the array type will turn into an anon const that has an escaping bound ^C
. If we were to support higher-ranked consts, then anon consts with bound consts in their scopes would need to insert additional early bound consts to capture them, kinda like how we do for late-bound regions and opaques.
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.
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 actually not true anymore i think, we don't create anon consts for N
arguments anymore
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.
Yep, if we are doing the mGCA style of lowering for bound argument then it ""should""1 just work. We probably still need to ban late-bound const params from any other anon consts that show up, but that can be a property of anon consts and not a property of binders.
Footnotes
-
well, we probably need to make sure that other operations on
ty::Const
will handle bound consts correctly, but they probably do? idk. ↩
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.
for gce its fucked though yeah :3
@@ -2302,6 +2325,7 @@ nop_list_lift! { | |||
poly_existential_predicates; PolyExistentialPredicate<'a> => PolyExistentialPredicate<'tcx> | |||
} | |||
nop_list_lift! { bound_variable_kinds; ty::BoundVariableKind => ty::BoundVariableKind } | |||
nop_list_with_cached_type_info_lift! { clauses; Clause<'a> => Clause<'tcx> } |
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.
naming question.. what is the meaning of nop
here? This lift is definitely not a noop, as we do have check that the list has actually been interned by the TyCtxt
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 what the nop means afaict; instead of re-interning the list, it's able to do the lifting by checking that the interned pointer originates from the tyctxt's arena. It's avoiding doing any actual work, hence "nop".
@@ -2090,6 +2090,6 @@ mod size_asserts { | |||
use super::*; | |||
// tidy-alphabetical-start | |||
static_assert_size!(ty::RegionKind<'_>, 24); | |||
static_assert_size!(ty::TyKind<'_>, 24); | |||
static_assert_size!(ty::TyKind<'_>, 32); |
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 am personally not a big fan of supporting where-bounds inside of types and would like to only allow them in where-bounds. I also believe that this is where pretty much all of the perf regression is coming from.
I do expect that playing around with this feature is more annoying and ugly if we have to split binder for it, so 🤷 i guess i don't mind too much
Currently don't have the mental capacity to review changes related to this feature in-depth r? oli-obk maybe 🤔 |
w.r.t. perf: we have a lot of size assertions in the codebase, but the one on |
Maybe I can intern the pair of clauses lists into one or something 🤔 Ideas would be helpful |
This PR adds resolution and AST lowering for where clauses on binders. The meaning for
for<T>
now becomesfor<T: Sized>
like regular generics positions, and you are now able to writefor<T: Trait>
(andfor<T: ?Sized>
). Binder predicates are only considered in the new solver today. Since non-lifetime binders is an incomplete feature, I don't think we need to do any messaging to tell people that they don't work correctly in the old solver, but I'll see to that in a follow-up.This PR then adds a new
List<ty::Clause>
to binders. Most places in the compiler shouldn't care about them existing, but eventually as support for non-lifetime binders gets fleshed out we should be more careful about asserting that they're handled. This will not happen in this PR.Tracking: