From a11024f4f312a49db84d816bf43c7c55d8a21074 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Fri, 29 May 2020 08:27:59 +0900 Subject: [PATCH] Fix debug assertion in typeck --- src/librustc_typeck/collect.rs | 2 +- src/test/ui/traits/issue-72410.rs | 18 ++++++++++++++++++ src/test/ui/traits/issue-72410.stderr | 18 ++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/traits/issue-72410.rs create mode 100644 src/test/ui/traits/issue-72410.stderr diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index ec534aa925d4f..c3b54f1461426 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -1927,7 +1927,7 @@ fn explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericPredicat let re_root_empty = tcx.lifetimes.re_root_empty; let predicate = ty::OutlivesPredicate(ty, re_root_empty); predicates.push(( - ty::PredicateKind::TypeOutlives(ty::Binder::dummy(predicate)) + ty::PredicateKind::TypeOutlives(ty::Binder::bind(predicate)) .to_predicate(tcx), span, )); diff --git a/src/test/ui/traits/issue-72410.rs b/src/test/ui/traits/issue-72410.rs new file mode 100644 index 0000000000000..c95f1dfdca53a --- /dev/null +++ b/src/test/ui/traits/issue-72410.rs @@ -0,0 +1,18 @@ +// Regression test for #72410, this should be used with debug assertion enabled. + +// should be fine +pub trait Foo { + fn map() + where + Self: Sized, + for<'a> &'a mut [u8]: ; +} + +// should fail +pub trait Bar { + fn map() + where for<'a> &'a mut [dyn Bar]: ; + //~^ ERROR: the trait `Bar` cannot be made into an object +} + +fn main() {} diff --git a/src/test/ui/traits/issue-72410.stderr b/src/test/ui/traits/issue-72410.stderr new file mode 100644 index 0000000000000..1db2320841ff7 --- /dev/null +++ b/src/test/ui/traits/issue-72410.stderr @@ -0,0 +1,18 @@ +error[E0038]: the trait `Bar` cannot be made into an object + --> $DIR/issue-72410.rs:14:19 + | +LL | pub trait Bar { + | --- this trait cannot be made into an object... +LL | fn map() + | --- ...because associated function `map` has no `self` parameter +LL | where for<'a> &'a mut [dyn Bar]: ; + | ^^^^^^^^^^^^^^^^^ the trait `Bar` cannot be made into an object + | +help: consider turning `map` into a method by giving it a `&self` argument or constraining it so it does not apply to trait objects + | +LL | where for<'a> &'a mut [dyn Bar]:, Self: Sized ; + | ^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0038`.