diff options
Diffstat (limited to 'tests/ui/coherence/coherence-overlap-unnormalizable-projection-0.rs')
| -rw-r--r-- | tests/ui/coherence/coherence-overlap-unnormalizable-projection-0.rs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/tests/ui/coherence/coherence-overlap-unnormalizable-projection-0.rs b/tests/ui/coherence/coherence-overlap-unnormalizable-projection-0.rs new file mode 100644 index 00000000000..b8b6d8846ef --- /dev/null +++ b/tests/ui/coherence/coherence-overlap-unnormalizable-projection-0.rs @@ -0,0 +1,42 @@ +// Regression test for soundness issue #114061: +// "Coherence incorrectly considers `unnormalizable_projection: Trait` to not hold even if it could" +#![crate_type = "lib"] + +//@ revisions: classic next +//@[next] compile-flags: -Znext-solver + +trait WhereBound {} +impl WhereBound for () {} + + +pub trait WithAssoc<'a> { + type Assoc; +} + +// These two impls of `Trait` overlap: + +pub trait Trait {} +impl<T> Trait for T +where + T: 'static, + for<'a> T: WithAssoc<'a>, + for<'a> <T as WithAssoc<'a>>::Assoc: WhereBound, +{ +} + +impl<T> Trait for Box<T> {} //~ ERROR conflicting implementations of trait `Trait` for type `Box<_>` + +// A downstream crate could write: +// +// use upstream::*; +// +// struct Local; +// impl WithAssoc<'_> for Box<Local> { +// type Assoc = (); +// } +// +// fn impls_trait<T: Trait>() {} +// +// fn main() { +// impls_trait::<Box<Local>>(); +// } |
