parent
3cb1c11340
commit
8ea53624c9
@ -21,7 +21,7 @@ use rustc_hir::def_id::{DefId, LocalDefId};
|
|||||||
use rustc_hir::intravisit::{walk_generics, Visitor as _};
|
use rustc_hir::intravisit::{walk_generics, Visitor as _};
|
||||||
use rustc_hir::lang_items::LangItem;
|
use rustc_hir::lang_items::LangItem;
|
||||||
use rustc_hir::{Constness, GenericArg, GenericArgs};
|
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::GenericParamDefKind;
|
||||||
use rustc_middle::ty::{self, Const, DefIdTree, Ty, TyCtxt, TypeFoldable};
|
use rustc_middle::ty::{self, Const, DefIdTree, Ty, TyCtxt, TypeFoldable};
|
||||||
use rustc_session::lint::builtin::AMBIGUOUS_ASSOCIATED_ITEMS;
|
use rustc_session::lint::builtin::AMBIGUOUS_ASSOCIATED_ITEMS;
|
||||||
@ -488,12 +488,20 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||||||
tcx.ty_error().into()
|
tcx.ty_error().into()
|
||||||
} else {
|
} else {
|
||||||
// This is a default type parameter.
|
// 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
|
self.astconv
|
||||||
.normalize_ty(
|
.normalize_ty(
|
||||||
self.span,
|
self.span,
|
||||||
tcx.at(self.span).type_of(param.def_id).subst_spanned(
|
tcx.at(self.span).type_of(param.def_id).subst_spanned(
|
||||||
tcx,
|
tcx,
|
||||||
substs.unwrap(),
|
substs,
|
||||||
Some(self.span),
|
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…
x
Reference in New Issue
Block a user