Skip to content

Commit

Permalink
Rollup merge of #86764 - estebank:issue-86756, r=pnkfelix
Browse files Browse the repository at this point in the history
Avoid ICE on type error recovery

Fix #86756
  • Loading branch information
JohnTitor committed Jul 27, 2021
2 parents 99a6474 + 8ea5362 commit 4e1ebf2
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 2 deletions.
12 changes: 10 additions & 2 deletions compiler/rustc_typeck/src/astconv/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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),
),
)
Expand Down
12 changes: 12 additions & 0 deletions src/test/ui/issues/issue-86756.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 46 additions & 0 deletions src/test/ui/issues/issue-86756.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 4e1ebf2

Please sign in to comment.