diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2017-04-18 15:48:19 -0400 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2017-04-19 07:20:36 -0400 |
| commit | aa6c2b1cb73edad3ca1e8068151dd7254a3ebce1 (patch) | |
| tree | 6126f726df05ad464aeeab5c734f967f55b90bb6 | |
| parent | 467aaab50ef0c7284121d59d8f7af3184836e586 (diff) | |
| download | rust-aa6c2b1cb73edad3ca1e8068151dd7254a3ebce1.tar.gz rust-aa6c2b1cb73edad3ca1e8068151dd7254a3ebce1.zip | |
propagate obligations during overlap check
| -rw-r--r-- | src/librustc/traits/coherence.rs | 8 | ||||
| -rw-r--r-- | src/test/run-pass/issue-41298.rs | 16 |
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() { } |
