File: overlapping-impls-in-new-solver-issue-135514.rs

package info (click to toggle)
rustc 1.88.0%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 934,128 kB
  • sloc: xml: 158,127; python: 36,062; javascript: 19,855; sh: 19,700; cpp: 18,947; ansic: 12,993; asm: 4,792; makefile: 690; lisp: 29; perl: 29; ruby: 19; sql: 11
file content (40 lines) | stat: -rw-r--r-- 839 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// Regression test for #135514 where the new solver didn't properly record deps for incremental
// compilation, similarly to `track-deps-in-new-solver.rs`.
//
// In this specially crafted example, @steffahn was able to trigger unsoundness with an overlapping
// impl that was accepted during the incremental rebuild.

//@ revisions: cpass1 cfail2
//@ compile-flags: -Znext-solver

pub trait Trait {}

pub struct S0<T>(T);

pub struct S<T>(T);
impl<T> Trait for S<T> where S0<T>: Trait {}

pub struct W;

pub trait Other {
    type Choose<L, R>;
}

// first impl
impl<T: Trait> Other for T {
    type Choose<L, R> = L;
}

// second impl
impl<T> Other for S<T> {
    //[cfail2]~^ ERROR conflicting implementations of trait
    type Choose<L, R> = R;
}

#[cfg(cpass1)]
impl Trait for W {}

#[cfg(cfail2)]
impl Trait for S<W> {}

fn main() {}