Skip to content

Commit 416580e

Browse files
nikomatsakisbrson
authored andcommittedNov 3, 2016
add rust-lang#32791 test case
1 parent 65c8432 commit 416580e

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
#![crate_type = "lib"]
12+
13+
use std::ops::Mul;
14+
15+
pub trait A {}
16+
pub trait B {
17+
type AT: A;
18+
}
19+
pub trait C {
20+
type BT: B;
21+
}
22+
23+
pub struct AV;
24+
impl A for AV {}
25+
26+
pub struct BV;
27+
impl B for BV {
28+
type AT = AV;
29+
}
30+
31+
pub struct CV;
32+
impl C for CV {
33+
type BT = BV;
34+
}
35+
36+
pub struct WrapperB<T>(pub T);
37+
pub struct WrapperC<T>(pub T);
38+
39+
impl<C1> Mul<WrapperB<<C1::BT as B>::AT>> for WrapperC<C1>
40+
where C1: C
41+
{
42+
type Output = u8;
43+
fn mul(self, _: WrapperB<<C1::BT as B>::AT>) -> Self::Output {
44+
loop {}
45+
}
46+
}
47+
impl<C1> Mul<WrapperC<C1>> for WrapperC<C1> {
48+
type Output = u8;
49+
fn mul(self, _: WrapperC<C1>) -> Self::Output {
50+
loop {}
51+
}
52+
}

‎src/test/run-pass/issue-37291/main.rs

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// aux-build:lib.rs
12+
13+
// Regression test for #37291. The problem was that the starting
14+
// environment for a specialization check was not including the
15+
// where-clauses from the impl when attempting to normalize the impl's
16+
// trait-ref, so things like `<C as Foo>::Item` could not resolve,
17+
// since the `C: Foo` trait bound was not included in the environment.
18+
19+
extern crate lib;
20+
21+
use lib::{CV, WrapperB, WrapperC};
22+
23+
fn main() {
24+
let a = WrapperC(CV);
25+
let b = WrapperC(CV);
26+
if false {
27+
let _ = a * b;
28+
}
29+
}

0 commit comments

Comments
 (0)
Please sign in to comment.