mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-01 06:51:58 +00:00
Rollup merge of #91450 - hkmatsumoto:hide-type-error, r=estebank
Don't suggest types whose inner type is erroneous Currently, we check if the returned type equals to `tcx.ty_error()` not to emit erroneous types, but this has a pitfall; for example, `Option<[type error]> != tcx.ty_error()` holds. Fixes #91371.
This commit is contained in:
commit
609d9a0108
@ -41,7 +41,7 @@ use rustc_middle::ty::subst::InternalSubsts;
|
||||
use rustc_middle::ty::util::Discr;
|
||||
use rustc_middle::ty::util::IntTypeExt;
|
||||
use rustc_middle::ty::{self, AdtKind, Const, DefIdTree, Ty, TyCtxt};
|
||||
use rustc_middle::ty::{ReprOptions, ToPredicate, WithConstness};
|
||||
use rustc_middle::ty::{ReprOptions, ToPredicate, TypeFoldable, WithConstness};
|
||||
use rustc_session::lint;
|
||||
use rustc_session::parse::feature_err;
|
||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||
@ -1777,7 +1777,7 @@ fn fn_sig(tcx: TyCtxt<'_>, def_id: DefId) -> ty::PolyFnSig<'_> {
|
||||
visitor.visit_ty(ty);
|
||||
let mut diag = bad_placeholder_type(tcx, visitor.0, "return type");
|
||||
let ret_ty = fn_sig.skip_binder().output();
|
||||
if ret_ty != tcx.ty_error() {
|
||||
if !ret_ty.references_error() {
|
||||
if !ret_ty.is_closure() {
|
||||
let ret_ty_str = match ret_ty.kind() {
|
||||
// Suggest a function pointer return type instead of a unique function definition
|
||||
|
7
src/test/ui/typeck/issue-91450-inner-ty-error.rs
Normal file
7
src/test/ui/typeck/issue-91450-inner-ty-error.rs
Normal file
@ -0,0 +1,7 @@
|
||||
// Regression test for #91450.
|
||||
// This test ensures that the compiler does not suggest `Foo<[type error]>` in diagnostic messages.
|
||||
|
||||
fn foo() -> Option<_> {} //~ ERROR: [E0308]
|
||||
//~^ ERROR: the type placeholder `_` is not allowed
|
||||
|
||||
fn main() {}
|
21
src/test/ui/typeck/issue-91450-inner-ty-error.stderr
Normal file
21
src/test/ui/typeck/issue-91450-inner-ty-error.stderr
Normal file
@ -0,0 +1,21 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-91450-inner-ty-error.rs:4:13
|
||||
|
|
||||
LL | fn foo() -> Option<_> {}
|
||||
| --- ^^^^^^^^^ expected enum `Option`, found `()`
|
||||
| |
|
||||
| implicitly returns `()` as its body has no tail or `return` expression
|
||||
|
|
||||
= note: expected enum `Option<_>`
|
||||
found unit type `()`
|
||||
|
||||
error[E0121]: the type placeholder `_` is not allowed within types on item signatures for return types
|
||||
--> $DIR/issue-91450-inner-ty-error.rs:4:20
|
||||
|
|
||||
LL | fn foo() -> Option<_> {}
|
||||
| ^ not allowed in type signatures
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0121, E0308.
|
||||
For more information about an error, try `rustc --explain E0121`.
|
Loading…
Reference in New Issue
Block a user