delegation: supporting inherent impls - #160505
Conversation
|
@bors try @rust-timer queue |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
delegation: supporting inherent methods
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
|
Finished benchmarking commit (38e5ff7): comparison URL. Overall result: ❌ regressions - no action neededBenchmarking means the PR may be perf-sensitive. Consider adding rollup=never if this change is not fit for rolling up. @rustbot label: -S-waiting-on-perf -perf-regression Instruction countOur most reliable metric. Used to determine the overall result above. However, even this metric can be noisy.
Max RSS (memory usage)Results (primary 1.9%, secondary -0.0%)A less reliable metric. May be of interest, but not used to determine the overall result above.
CyclesResults (primary -1.1%, secondary 0.4%)A less reliable metric. May be of interest, but not used to determine the overall result above.
Binary sizeThis perf run didn't have relevant results for this metric. Bootstrap: 489.838s -> 487.916s (-0.39%) |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
|
@bors try @rust-timer queue |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
delegation: supporting inherent impls
This comment has been minimized.
This comment has been minimized.
|
Finished benchmarking commit (40975b9): comparison URL. Overall result: ❌ regressions - no action neededBenchmarking means the PR may be perf-sensitive. Consider adding rollup=never if this change is not fit for rolling up. @rustbot label: -S-waiting-on-perf -perf-regression Instruction countOur most reliable metric. Used to determine the overall result above. However, even this metric can be noisy.
Max RSS (memory usage)Results (primary 1.1%, secondary -0.2%)A less reliable metric. May be of interest, but not used to determine the overall result above.
CyclesResults (primary 2.2%, secondary 0.2%)A less reliable metric. May be of interest, but not used to determine the overall result above.
Binary sizeResults (primary -0.1%, secondary -0.1%)A less reliable metric. May be of interest, but not used to determine the overall result above.
Bootstrap: 458.664s -> 461.027s (0.52%) |
This comment has been minimized.
This comment has been minimized.
1b2180a to
3a919c6
Compare
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
8376dfe to
5aca266
Compare
|
☔ The latest upstream changes (presumably #160974) made this pull request unmergeable. Please resolve the merge conflicts by rebasing. |
This PR adds support for delegation to inherent impl functions on the delegation side.
Support for inherent impls in delegation consists of two problems: we need to resolve inherent function through
ProbeContextroutine and then we need to generate delegation function knowing theDefIdof the signature function. The first problem is a fundamental problem given current compiler architecture, and it is not solved in this PR. To imitate working resolution for tests we adopt simple resolution by name only in inherent impls (not trait impls, which would work if we implement fair resolution throughProbeContext). Aresolve_type_relative_delegationsquery was created which tries to resolve unresolved delegations after resolve stage. In future, when we will be able to fairly resolve delegations throughProbeContextcontents of this query can be changed and all other logic implemented in this pull request will work.This PR solves the second problem adjusting all delegation-related code such that it can handle delegations to inherent functions.
Free to inherent impl
Unlike free to trait delegation where we generated explicit
Selfparam, here we just use default parameter.Trait to inherent impl
In trait to inherent impl delegation we replace the type of self parameter from impl's type to
Selfgeneric param (if the signature function is a method).Note that we didn't specified target expression, so we would get errors like:
Trait impl to inherent impl
Here the resolution should look signature in trait as in other cases where we delegate from trait impl. We generate function whose signature matches the resolved function in trait. We propagate only child generics if they are not specified.
Inherent impl to inherent impl
In inherent impl to inherent impl delegation we replace signature self type with delegation parent self type in case of methods.
We did not specify target expression so we would get errors like:
Generics
TODO
Other concerns
Glob and list delegations
List delegations are supported, glob delegations are not supported:
Self type adjustments and target expression deletion
Adjustments for receiver are applied, adjustments for other parameters whose types contain
Selfare not applied asSelfacts as a type alias to the struct, not a generic param which will can get replaced. The deletion of target expression should work as before.Recursive delegations
Works as before, we just check the resolution chain and we do not care whether it came from resolution at resolve stage or from resolution of type relative delegations.
Checking generic arguments in impl
In the example below there will be ICE as lifetime
'ais missing from structSin inherent impl. This causes ICE as we get generic arguments of the signature from inherent impl (not from the struct declaration) and we will miss one, so there can be ICE when trying to instantiate signature or predicates with wrong number of generic args. So we check this at AST -> HIR lowering, as if we check it duringhir_analysisand return error signature and empty clauses there will be another ICE. So I think it is better to handle it earlier and generate error delegation instead.r? @petrochenkov