Rollup merge of #86764 - estebank:issue-86756, r=pnkfelix
Avoid ICE on type error recovery Fix #86756
This commit is contained in:
commit
4e1ebf23cd
3 changed files with 68 additions and 2 deletions
|
@ -21,7 +21,7 @@ use rustc_hir::def_id::{DefId, LocalDefId};
|
|||
use rustc_hir::intravisit::{walk_generics, Visitor as _};
|
||||
use rustc_hir::lang_items::LangItem;
|
||||
use rustc_hir::{Constness, GenericArg, GenericArgs};
|
||||
use rustc_middle::ty::subst::{self, InternalSubsts, Subst, SubstsRef};
|
||||
use rustc_middle::ty::subst::{self, GenericArgKind, InternalSubsts, Subst, SubstsRef};
|
||||
use rustc_middle::ty::GenericParamDefKind;
|
||||
use rustc_middle::ty::{self, Const, DefIdTree, Ty, TyCtxt, TypeFoldable};
|
||||
use rustc_session::lint::builtin::AMBIGUOUS_ASSOCIATED_ITEMS;
|
||||
|
@ -488,12 +488,20 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||
tcx.ty_error().into()
|
||||
} else {
|
||||
// This is a default type parameter.
|
||||
let substs = substs.unwrap();
|
||||
if substs.iter().any(|arg| match arg.unpack() {
|
||||
GenericArgKind::Type(ty) => ty.references_error(),
|
||||
_ => false,
|
||||
}) {
|
||||
// Avoid ICE #86756 when type error recovery goes awry.
|
||||
return tcx.ty_error().into();
|
||||
}
|
||||
self.astconv
|
||||
.normalize_ty(
|
||||
self.span,
|
||||
tcx.at(self.span).type_of(param.def_id).subst_spanned(
|
||||
tcx,
|
||||
substs.unwrap(),
|
||||
substs,
|
||||
Some(self.span),
|
||||
),
|
||||
)
|
||||
|
|
12
src/test/ui/issues/issue-86756.rs
Normal file
12
src/test/ui/issues/issue-86756.rs
Normal file
|
@ -0,0 +1,12 @@
|
|||
trait Foo<T, T = T> {}
|
||||
//~^ ERROR the name `T` is already used for a generic parameter in this item's generic parameters
|
||||
|
||||
fn eq<A, B>() {
|
||||
eq::<dyn, Foo>
|
||||
//~^ ERROR cannot find type `dyn` in this scope
|
||||
//~| ERROR missing generics for trait `Foo`
|
||||
//~| WARN trait objects without an explicit `dyn` are deprecated
|
||||
//~| WARN this is accepted in the current edition
|
||||
}
|
||||
|
||||
fn main() {}
|
46
src/test/ui/issues/issue-86756.stderr
Normal file
46
src/test/ui/issues/issue-86756.stderr
Normal file
|
@ -0,0 +1,46 @@
|
|||
error[E0403]: the name `T` is already used for a generic parameter in this item's generic parameters
|
||||
--> $DIR/issue-86756.rs:1:14
|
||||
|
|
||||
LL | trait Foo<T, T = T> {}
|
||||
| - ^ already used
|
||||
| |
|
||||
| first use of `T`
|
||||
|
||||
error[E0412]: cannot find type `dyn` in this scope
|
||||
--> $DIR/issue-86756.rs:5:10
|
||||
|
|
||||
LL | fn eq<A, B>() {
|
||||
| - help: you might be missing a type parameter: `, dyn`
|
||||
LL | eq::<dyn, Foo>
|
||||
| ^^^ not found in this scope
|
||||
|
||||
warning: trait objects without an explicit `dyn` are deprecated
|
||||
--> $DIR/issue-86756.rs:5:15
|
||||
|
|
||||
LL | eq::<dyn, Foo>
|
||||
| ^^^ help: use `dyn`: `dyn Foo`
|
||||
|
|
||||
= note: `#[warn(bare_trait_objects)]` on by default
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
|
||||
= note: for more information, see issue #80165 <https://github.com/rust-lang/rust/issues/80165>
|
||||
|
||||
error[E0107]: missing generics for trait `Foo`
|
||||
--> $DIR/issue-86756.rs:5:15
|
||||
|
|
||||
LL | eq::<dyn, Foo>
|
||||
| ^^^ expected at least 1 generic argument
|
||||
|
|
||||
note: trait defined here, with at least 1 generic parameter: `T`
|
||||
--> $DIR/issue-86756.rs:1:7
|
||||
|
|
||||
LL | trait Foo<T, T = T> {}
|
||||
| ^^^ -
|
||||
help: add missing generic argument
|
||||
|
|
||||
LL | eq::<dyn, Foo<T>>
|
||||
| ^^^^^^
|
||||
|
||||
error: aborting due to 3 previous errors; 1 warning emitted
|
||||
|
||||
Some errors have detailed explanations: E0107, E0403, E0412.
|
||||
For more information about an error, try `rustc --explain E0107`.
|
Loading…
Add table
Reference in a new issue