Skip to content

Commit

Permalink
A test case for a bug I found in the new SVH while reviewing it.
Browse files Browse the repository at this point in the history
Namely: non-pub `use` declarations *are* significant to the SVH
computation, since they can change which traits are part of the method
resolution step, and thus affect which methods get called from the
(potentially inlined) code.
  • Loading branch information
pnkfelix committed May 15, 2014
1 parent a92d162 commit 930308b
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 0 deletions.
32 changes: 32 additions & 0 deletions src/test/auxiliary/svh-uta-base.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright 2014 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.

//! "compile-fail/svh-uta-trait.rs" is checking that we detect a
//! change from `use foo::TraitB` to use `foo::TraitB` in the hash
//! (SVH) computation (#14132), since that will affect method
//! resolution.
//!
//! This is the upstream crate.
#![crate_id = "uta"]

mod traits {
pub trait TraitA { fn val(&self) -> int { 2 } }
pub trait TraitB { fn val(&self) -> int { 3 } }
}

impl traits::TraitA for () {}
impl traits::TraitB for () {}

pub fn foo<T>(_: int) -> int {
use traits::TraitA;
let v = ();
v.val()
}
32 changes: 32 additions & 0 deletions src/test/auxiliary/svh-uta-change-use-trait.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright 2014 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.

//! "compile-fail/svh-uta-trait.rs" is checking that we detect a
//! change from `use foo::TraitB` to use `foo::TraitB` in the hash
//! (SVH) computation (#14132), since that will affect method
//! resolution.
//!
//! This is the upstream crate.
#![crate_id = "uta"]

mod traits {
pub trait TraitA { fn val(&self) -> int { 2 } }
pub trait TraitB { fn val(&self) -> int { 3 } }
}

impl traits::TraitA for () {}
impl traits::TraitB for () {}

pub fn foo<T>(_: int) -> int {
use traits::TraitB;
let v = ();
v.val()
}
22 changes: 22 additions & 0 deletions src/test/auxiliary/svh-utb.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Copyright 2014 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.

//! "compile-fail/svh-uta-trait.rs" is checking that we detect a
//! change from `use foo::TraitB` to use `foo::TraitB` in the hash
//! (SVH) computation (#14132), since that will affect method
//! resolution.
//!
//! This is the downstream crate.
#![crate_id = "utb"]

extern crate uta;

pub fn foo() { assert_eq!(uta::foo::<()>(0), 3); }
27 changes: 27 additions & 0 deletions src/test/compile-fail/svh-use-trait.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// Copyright 2014 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.

// note that these aux-build directives must be in this order
// aux-build:svh-uta-base.rs
// aux-build:svh-utb.rs
// aux-build:svh-uta-change-use-trait.rs

//! "compile-fail/svh-uta-trait.rs" is checking that we detect a
//! change from `use foo::TraitB` to use `foo::TraitB` in the hash
//! (SVH) computation (#14132), since that will affect method
//! resolution.
extern crate uta;
extern crate utb; //~ ERROR: found possibly newer version of crate `uta` which `utb` depends
//~^ NOTE: perhaps this crate needs to be recompiled

fn main() {
utb::foo()
}

0 comments on commit 930308b

Please sign in to comment.