about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2017-04-18 15:48:19 -0400
committerNiko Matsakis <niko@alum.mit.edu>2017-04-19 07:20:36 -0400
commitaa6c2b1cb73edad3ca1e8068151dd7254a3ebce1 (patch)
tree6126f726df05ad464aeeab5c734f967f55b90bb6
parent467aaab50ef0c7284121d59d8f7af3184836e586 (diff)
downloadrust-aa6c2b1cb73edad3ca1e8068151dd7254a3ebce1.tar.gz
rust-aa6c2b1cb73edad3ca1e8068151dd7254a3ebce1.zip
propagate obligations during overlap check
-rw-r--r--src/librustc/traits/coherence.rs8
-rw-r--r--src/test/run-pass/issue-41298.rs16
2 files changed, 20 insertions, 4 deletions
diff --git a/src/librustc/traits/coherence.rs b/src/librustc/traits/coherence.rs
index 383fab3fcd7..a943ef30e53 100644
--- a/src/librustc/traits/coherence.rs
+++ b/src/librustc/traits/coherence.rs
@@ -55,16 +55,15 @@ fn overlap<'cx, 'gcx, 'tcx>(selcx: &mut SelectionContext<'cx, 'gcx, 'tcx>,
     debug!("overlap: b_impl_header={:?}", b_impl_header);
 
     // Do `a` and `b` unify? If not, no overlap.
-    match selcx.infcx().eq_impl_headers(true,
+    let obligations = match selcx.infcx().eq_impl_headers(true,
                                         &ObligationCause::dummy(),
                                         &a_impl_header,
                                         &b_impl_header) {
         Ok(InferOk { obligations, .. }) => {
-            // FIXME(#32730) propagate obligations
-            assert!(obligations.is_empty());
+            obligations
         }
         Err(_) => return None
-    }
+    };
 
     debug!("overlap: unification check succeeded");
 
@@ -78,6 +77,7 @@ fn overlap<'cx, 'gcx, 'tcx>(selcx: &mut SelectionContext<'cx, 'gcx, 'tcx>,
                      .map(|p| Obligation { cause: ObligationCause::dummy(),
                                            recursion_depth: 0,
                                            predicate: p })
+                     .chain(obligations)
                      .find(|o| !selcx.evaluate_obligation(o));
 
     if let Some(failing_obligation) = opt_failing_obligation {
diff --git a/src/test/run-pass/issue-41298.rs b/src/test/run-pass/issue-41298.rs
new file mode 100644
index 00000000000..2b9baa74674
--- /dev/null
+++ b/src/test/run-pass/issue-41298.rs
@@ -0,0 +1,16 @@
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+struct Function<T, F> { t: T, f: F }
+
+impl<T, R> Function<T, fn() -> R> { fn foo() { } }
+impl<T, R> Function<T, fn() -> R> { fn bar() { } }
+
+fn main() { }