Don't cancel stashed TraitMissingMethod errors.

This gives one extra error message on two tests, but is necessary to fix
bigger problems caused by the cancellation of stashed errors.

(Note: why not just avoid stashing altogether? Because that resulted in
additional output changes.)
This commit is contained in:
Nicholas Nethercote 2024-02-26 17:22:24 +11:00
parent c4ec196c7e
commit ec25d6db53
5 changed files with 38 additions and 13 deletions

View File

@ -879,17 +879,14 @@ pub fn resolve_ty_and_res_fully_qualified_call(
); );
} }
// emit or cancel the diagnostic for bare traits // Emit the diagnostic for bare traits. (We used to cancel for slightly better
// error messages, but cancelling stashed diagnostics is no longer allowed because
// it causes problems when tracking whether errors have actually occurred.)
if span.edition().at_least_rust_2021() if span.edition().at_least_rust_2021()
&& let Some(diag) = && let Some(diag) =
self.dcx().steal_diagnostic(qself.span, StashKey::TraitMissingMethod) self.dcx().steal_diagnostic(qself.span, StashKey::TraitMissingMethod)
{ {
if trait_missing_method { diag.emit();
// cancel the diag for bare traits when meeting `MyTrait::missing_method`
diag.cancel();
} else {
diag.emit();
}
} }
if item_name.name != kw::Empty { if item_name.name != kw::Empty {

View File

@ -7,5 +7,7 @@ fn has() {}
trait HasNot {} trait HasNot {}
fn main() { fn main() {
HasNot::has(); //~ ERROR HasNot::has();
//~^ ERROR trait objects must include the `dyn` keyword
//~| ERROR no function or associated item named `has` found for trait `HasNot`
} }

View File

@ -1,3 +1,14 @@
error[E0782]: trait objects must include the `dyn` keyword
--> $DIR/issue-111312.rs:10:5
|
LL | HasNot::has();
| ^^^^^^
|
help: add `dyn` keyword before this trait
|
LL | <dyn HasNot>::has();
| ++++ +
error[E0599]: no function or associated item named `has` found for trait `HasNot` error[E0599]: no function or associated item named `has` found for trait `HasNot`
--> $DIR/issue-111312.rs:10:13 --> $DIR/issue-111312.rs:10:13
| |
@ -10,6 +21,7 @@ note: `Has` defines an item `has`
LL | trait Has { LL | trait Has {
| ^^^^^^^^^ | ^^^^^^^^^
error: aborting due to 1 previous error error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0599`. Some errors have detailed explanations: E0599, E0782.
For more information about an error, try `rustc --explain E0599`.

View File

@ -1,5 +1,7 @@
//@ edition: 2021 //@ edition: 2021
fn main() { fn main() {
std::any::Any::create(); //~ ERROR std::any::Any::create();
//~^ ERROR trait objects must include the `dyn` keyword
//~| ERROR no function or associated item named `create` found for trait `Any`
} }

View File

@ -1,9 +1,21 @@
error[E0782]: trait objects must include the `dyn` keyword
--> $DIR/issue-111727.rs:4:5
|
LL | std::any::Any::create();
| ^^^^^^^^^^^^^
|
help: add `dyn` keyword before this trait
|
LL | <dyn std::any::Any>::create();
| ++++ +
error[E0599]: no function or associated item named `create` found for trait `Any` error[E0599]: no function or associated item named `create` found for trait `Any`
--> $DIR/issue-111727.rs:4:20 --> $DIR/issue-111727.rs:4:20
| |
LL | std::any::Any::create(); LL | std::any::Any::create();
| ^^^^^^ function or associated item not found in `Any` | ^^^^^^ function or associated item not found in `Any`
error: aborting due to 1 previous error error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0599`. Some errors have detailed explanations: E0599, E0782.
For more information about an error, try `rustc --explain E0599`.