Don't do post-method-probe error reporting steps if we're in a suggestion by compiler-errors · Pull Request #125100 · rust-lang/rust (original) (raw)
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 andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Conversation13 Commits2 Checks6 Files changed
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
[ Show hidden characters]({{ revealButtonHref }})
Currently in method probing, if we fail to pick a method, then we reset and try to collect relevant candidates for method errors:
// things failed, so lets look at all traits, for diagnostic purposes now: |
---|
self.reset(); |
let span = self.span; |
let tcx = self.tcx; |
self.assemble_extension_candidates_for_all_traits(); |
let out_of_scope_traits = match self.pick_core() { |
Some(Ok(p)) => vec![p.item.container_id(self.tcx)], |
Some(Err(MethodError::Ambiguity(v))) => v |
.into_iter() |
.map(|source |
CandidateSource::Trait(id) => id, |
CandidateSource::Impl(impl_id) => match tcx.trait_id_of_impl(impl_id) { |
Some(id) => id, |
None => span_bug!(span, "found inherent method when looking at traits"), |
}, |
}) |
.collect(), |
Some(Err(MethodError::NoMatch(NoMatchData { |
out_of_scope_traits: others, .. |
}))) => { |
assert!(others.is_empty()); |
vec![] |
} |
_ => vec![], |
}; |
if let Some((kind, def_id)) = private_candidate { |
return Err(MethodError::PrivateMatch(kind, def_id, out_of_scope_traits)); |
} |
let similar_candidate = self.probe_for_similar_candidate()?; |
Err(MethodError::NoMatch(NoMatchData { |
static_candidates, |
unsatisfied_predicates, |
out_of_scope_traits, |
similar_candidate, |
mode: self.mode, |
})) |
However, we do method lookups via lookup_method_for_diagnostic
and only care about the result if the method probe was a success.
Namely, we don't need to do a bunch of other lookups on failure, since we throw away these results anyways, such as an expensive call to:
self.assemble_extension_candidates_for_all_traits(); |
---|
And:
let similar_candidate = self.probe_for_similar_candidate()?; |
---|
This PR also renames some methods so it's clear that they're for diagnostics.
r? @nnethercote
rustbot added S-waiting-on-review
Status: Awaiting review from the assignee but also interested parties.
Relevant to the compiler team, which will review and decide on the PR/issue.
labels
@@ -91,7 +91,7 @@ pub enum CandidateSource { |
---|
impl<'a, 'tcx> FnCtxt<'a, 'tcx> { |
/// Determines whether the type `self_ty` supports a visible method named `method_name` or not. |
#[instrument(level = "debug", skip(self))] |
pub fn method_exists( |
pub fn method_exists_for_diagnostic( |
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I find the for_diagnostic
suffix naming convention confusing. I think it means "method exists (as considered for diagnostic purposes)", rather than "method exists for this diagnostic"? It feels like there should be a contrasting method_exists_for_non_diagnostic
method. I'm just not sure how to read it.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, it means "and you should only call this method if you're doing diagnostics".
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Kinda don't want to change it though now lol
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, I can live with it.
r=me once we consider the for_diagnostic
suffix. Is it necessary? I'm having trouble thinking of a better alternative.
Is it necessary?
Well I'd like to make it more difficult for people to call methods that aren't correct on the good path. It's not necessary per se, but we are really bad at modularizing diagnostics code in rustc_hir_typeck
. If and once we finally do that, then it'll be self-explanatory due to (hopefully) mod privacy, but until then, I'd like to keep the suffix or give it a similar name that makes it sure the user knows that this obtusely named method is not meant for the good path.
This regressed in #120730, which added new calls to assemble_extension_candidates_for_traits_in_scope
which significant increases the amount of work we are doing when calls to (e.g.) lookup_method_for_diagnostic
, etc fail. Since this is on the error path, we call this a lot more times than on the good path.
Before 1.78, this file still takes a few seconds. After 1.78, it essentially hangs. After this PR, it should take less than a second.
Beta nominating as it can pretty negatively affect user experience when a programmer has many method errors in large projects.
For example: Slow edit_distance on Zulip
@@ -0,0 +1,157 @@ |
---|
#![allow(non_snake_case)] |
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Excellent that you have a test case! Please add a brief comment explaining what this is testing and pointing to this PR.
r=me with the comment on the test. Thanks for fixing this!
📌 Commit 8f97a25 has been approved by nnethercote
It is now in the queue for this repository.
bors added S-waiting-on-bors
Status: Waiting on bors to run and complete tests. Bors will change the label on completion.
and removed S-waiting-on-review
Status: Awaiting review from the assignee but also interested parties.
labels
bors added a commit to rust-lang-ci/rust that referenced this pull request
…mpiler-errors
Rollup of 7 pull requests
Successful merges:
- rust-lang#119838 (style-guide: When breaking binops handle multi-line first operand better)
- rust-lang#124844 (Use a proper probe for shadowing impl)
- rust-lang#125047 (Migrate
run-make/issue-14500
to newrmake.rs
format) - rust-lang#125080 (only find segs chain for missing methods when no available candidates)
- rust-lang#125088 (Uplift
AliasTy
andAliasTerm
) - rust-lang#125100 (Don't do post-method-probe error reporting steps if we're in a suggestion)
- rust-lang#125118 (Use new utility functions/methods in run-make tests)
r? @ghost
@rustbot
modify labels: rollup
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request
Beta backport accepted as per compiler team on Zulip. A backport PR will be authored by the release team at the end of the current development cycle.
@rustbot label +beta-accepted
bors added a commit to rust-lang-ci/rust that referenced this pull request
[beta] backports
- Do not ICE on foreign malformed
diagnostic::on_unimplemented
rust-lang#124683 - Fix more ICEs in
diagnostic::on_unimplemented
rust-lang#124875 - rustdoc: use stability, instead of features, to decide what to show rust-lang#124864
- Don't do post-method-probe error reporting steps if we're in a suggestion rust-lang#125100
- Make
non-local-def
lint Allow by default rust-lang#124950
r? cuviper
celinval pushed a commit to celinval/rust-dev that referenced this pull request
Update Rust toolchain from nightly-2024-05-14 to nightly-2024-05-15
without any other source changes.
This is an automatically generated pull request. If any of the CI checks
fail, manual intervention is required. In such a case, review the
changes at https://github.com/rust-lang/rust from
rust-lang@ab14f94
up to
rust-lang@8387315.
The log for this commit range is:
rust-lang@8387315ab3 Auto merge of
rust-lang#125125 - lovesegfault:opt-dist-specify-rustc-perf, r=Mark-Simulacrum
rust-lang@c3c9783de2
feat(tools/opt-dist): allow local builds to specify a rustc-perf
checkout
rust-lang@ac385a5af6 Auto merge of
rust-lang#125120 - compiler-errors:rollup-mnjybwv, r=compiler-errors
rust-lang@31016d5879 Rollup merge of
rust-lang#125118 - GuillaumeGomez:cleanup-run-make, r=jieyouxu
rust-lang@d59f430eec Rollup merge of
rust-lang#125100 - compiler-errors:faster, r=nnethercote
rust-lang@712e7c37f7 Rollup merge of
rust-lang#125088 - compiler-errors:uplift-alias-ty, r=lcnr
rust-lang@8c64acdbdc Rollup merge of
rust-lang#125080 - bvanjoi:fix-124946, r=nnethercote
rust-lang@844c7e826e Rollup merge of
rust-lang#125047 - Oneirical:test5, r=jieyouxu
rust-lang@0458d8a53b Rollup merge of
rust-lang#124844 - compiler-errors:shadow-probe, r=lcnr
rust-lang@36287830a2 Rollup merge of
rust-lang#119838 - joshtriplett:style-guide-binop-indent, r=compiler-errors
rust-lang@ade33b02f2 only find segs chain
for missing methods when no available candidates
rust-lang@bdfd941f4d Auto merge of
rust-lang#123816 - tgross35:f16-f128-mangling, r=michaelwoerister
rust-lang@f97d915173 Use new utility
functions/methods in run-make tests
rust-lang@792a9bdd4b Enable v0 mangling
tests and add checks for f16
/f128
rust-lang@809b84edba Add v0 symbol
mangling for f16
and f128
rust-lang@31026b7fe3 Auto merge of
rust-lang#125023 - morr0ne:linux-none-target, r=Nilstrieb
rust-lang@68407f9049 fix typo in
x86_64-unknown-linux-none docs
rust-lang@c45e831d8f Auto merge of
rust-lang#124228 - compiler-errors:lint-overcaptures, r=oli-obk
rust-lang@58426f4a5b Auto merge of
rust-lang#125026 - Oneirical:clink-tests, r=jieyouxu
rust-lang@e098eb14ae Wording improvement
rust-lang@e2d9c0d938 Fix missing word
rust-lang@57c32a193f style-guide: When
breaking binops handle multi-line first operand better
rust-lang@dbd2ca6478 Use a proper probe
for shadowing impl
rust-lang@052de1da4f And finally add
tests
rust-lang@1529c661e4 Warn against
redundant use<...>
rust-lang@f3fb727b08 Don't suggest using
use<> syntax to capture APITs
rust-lang@6afe1352d9 Suggest adding use<>
syntax
rust-lang@554becc180 Add some commenting
rust-lang@d57e57ca1f Implement initial
IMPL_TRAIT_OVERCAPTURES lint
rust-lang@8f97a2588c Add test to make
sure suggestions are still quick
rust-lang@fba5f44bd8 Auto merge of
rust-lang#125098 - jhpratt:rollup-2qm4gga, r=jhpratt
rust-lang@45b50d303c lto function,
static_library call, rename
rust-lang@9f8cdb286e Remove to_term
rust-lang@1ad28a6f53 Uplift AliasTy
rust-lang@812f89728a fix fmt
rust-lang@2e4c90c3f7 Don't do
post-method-probe error reporting steps if we're in a suggestion
rust-lang@32d74f1800 Rollup merge of
rust-lang#125090 - erickt:bump-fuchsia, r=tmandry
rust-lang@209703af85 Rollup merge of
rust-lang#125072 - Darksonn:pin-dyn-dispatch-sound, r=jhpratt
rust-lang@18d9c039bb Rollup merge of
rust-lang#124997 - gurry:124848-ice-should-be-sized, r=Nadrieril
rust-lang@74a78af0e2 Rollup merge of
rust-lang#116675 - joshlf:patch-10, r=scottmcm
rust-lang@9105c57b7f Auto merge of
rust-lang#124256 - nnethercote:rm-NtIdent-NtLifetime, r=petrochenkov
rust-lang@34582118af Auto merge of
rust-lang#125076 - compiler-errors:alias-term, r=lcnr
rust-lang@95e519ecbf Remove NtIdent
and
NtLifetime
.
rust-lang@fa84018c2e Apply nits
rust-lang@58ee9192e0 Migrate fuchsia docs
from pm
to ffx
rust-lang@293b5cb1ca [ptr] Document
maximum allocation size
rust-lang@3bcdf3058e split out AliasTy ->
AliasTerm
rust-lang@b3a78c1d09 Add test for dynamic
dispatch + Pin::new soundness
rust-lang@9a63a42cb7 Remove a Span
from
TokenKind::Interpolated
.
rust-lang@71fd2cf5b4 fix function call
and import
rust-lang@a1b5ea0cc2 make tidy happy
rust-lang@f2de5fb2ae rewrite issue-14500
to rmake
rust-lang@a6f237ca85 docs: fix typo in
platform-support docs
rust-lang@923cdb35aa test: Add assembly
tests for x86_64-unknown-linux-none target
rust-lang@10c358f111 Make tidy happy
rust-lang@e37d2989c1 remove trailing
whitespace
rust-lang@a2e7e79a13 Port
c-link-to-rust-va-list-fn to Rust
rust-lang@9cf080099d docs: Document
x86_64-unknown-linux-none target
rust-lang@a3ef01b1fc Add
x86_64-unknown-linux-none target
rust-lang@fb619ec208 FIx ICE while
casting a type with error
Co-authored-by: tautschnig 1144736+tautschnig@users.noreply.github.com
Labels
Accepted for backporting to the compiler in the beta channel.
Status: Waiting on bors to run and complete tests. Bors will change the label on completion.
Relevant to the compiler team, which will review and decide on the PR/issue.