about summary refs log tree commit diff
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2020-07-20 12:30:12 -0700
committerGitHub <noreply@github.com>2020-07-20 12:30:12 -0700
commit105cd4955425de2613ac2ae6c2d2d1baf17ebd2b (patch)
tree37fa8469c82a1f828ee1d6a53d6a6c7da4d44826
parentf9a3086363f214f2b56bef30f0ac572e1a9127f1 (diff)
parenta11024f4f312a49db84d816bf43c7c55d8a21074 (diff)
downloadrust-105cd4955425de2613ac2ae6c2d2d1baf17ebd2b.tar.gz
rust-105cd4955425de2613ac2ae6c2d2d1baf17ebd2b.zip
Rollup merge of #72714 - JohnTitor:debug-assert, r=nikomatsakis
Fix debug assertion in typeck

Fixes #72410
-rw-r--r--src/librustc_typeck/collect.rs2
-rw-r--r--src/test/ui/traits/issue-72410.rs18
-rw-r--r--src/test/ui/traits/issue-72410.stderr18
3 files changed, 37 insertions, 1 deletions
diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs
index ec534aa925d..c3b54f14614 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 00000000000..c95f1dfdca5
--- /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 00000000000..1db2320841f
--- /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`.