about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2021-06-30 16:26:20 -0700
committerEsteban Küber <esteban@kuber.com.ar>2021-07-01 11:19:31 -0700
commit8ea53624c9a2c4aa6bd207dd25b8d2b19610c99f (patch)
treec3e14ff180fb21df6a58d718267def6e2ecc2bc0
parent3cb1c1134050c059a15d9ca7a00d4dd89111a373 (diff)
downloadrust-8ea53624c9a2c4aa6bd207dd25b8d2b19610c99f.tar.gz
rust-8ea53624c9a2c4aa6bd207dd25b8d2b19610c99f.zip
Avoid ICE on type error recovery
Fix #86756
-rw-r--r--compiler/rustc_typeck/src/astconv/mod.rs12
-rw-r--r--src/test/ui/issues/issue-86756.rs12
-rw-r--r--src/test/ui/issues/issue-86756.stderr46
3 files changed, 68 insertions, 2 deletions
diff --git a/compiler/rustc_typeck/src/astconv/mod.rs b/compiler/rustc_typeck/src/astconv/mod.rs
index 10a7d69d5d3..e44a48cdf09 100644
--- a/compiler/rustc_typeck/src/astconv/mod.rs
+++ b/compiler/rustc_typeck/src/astconv/mod.rs
@@ -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),
                                         ),
                                     )
diff --git a/src/test/ui/issues/issue-86756.rs b/src/test/ui/issues/issue-86756.rs
new file mode 100644
index 00000000000..7f864eb2850
--- /dev/null
+++ b/src/test/ui/issues/issue-86756.rs
@@ -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() {}
diff --git a/src/test/ui/issues/issue-86756.stderr b/src/test/ui/issues/issue-86756.stderr
new file mode 100644
index 00000000000..1ef21986726
--- /dev/null
+++ b/src/test/ui/issues/issue-86756.stderr
@@ -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`.