Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Handle custom deref returning fat pointers
Closes #16930
- Loading branch information
Showing
4 changed files
with
81 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
// 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. | ||
|
||
// Test that a custom deref with a fat pointer return type does not ICE | ||
|
||
pub struct Arr { | ||
ptr: Box<[uint]> | ||
} | ||
|
||
impl Deref<[uint]> for Arr { | ||
fn deref(&self) -> &[uint] { | ||
fail!(); | ||
} | ||
} | ||
|
||
impl DerefMut<[uint]> for Arr { | ||
fn deref_mut(&mut self) -> &mut [uint] { | ||
&mut *self.ptr | ||
} | ||
} | ||
|
||
pub fn foo(arr: &mut Arr) { | ||
assert!(arr.len() == 3); | ||
let x: &mut [uint] = &mut **arr; | ||
assert!(x[0] == 1); | ||
assert!(x[1] == 2); | ||
assert!(x[2] == 3); | ||
} | ||
|
||
fn main() { | ||
let mut a = Arr { ptr: box [1, 2, 3] }; | ||
foo(&mut a); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
// 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. | ||
|
||
// Test that a custom deref with a fat pointer return type does not ICE | ||
|
||
pub struct Arr { | ||
ptr: Box<[uint]> | ||
} | ||
|
||
impl Deref<[uint]> for Arr { | ||
fn deref(&self) -> &[uint] { | ||
&*self.ptr | ||
} | ||
} | ||
|
||
pub fn foo(arr: &Arr) { | ||
assert!(arr.len() == 3); | ||
let x: &[uint] = &**arr; | ||
assert!(x[0] == 1); | ||
assert!(x[1] == 2); | ||
assert!(x[2] == 3); | ||
} | ||
|
||
fn main() { | ||
let a = Arr { ptr: box [1, 2, 3] }; | ||
foo(&a); | ||
} |
ab3999f
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
saw approval from nikomatsakis
at nrc@ab3999f
ab3999f
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
merging nick29581/rust/dst-bug-deref = ab3999f into auto
ab3999f
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nick29581/rust/dst-bug-deref = ab3999f merged ok, testing candidate = a4d257b
ab3999f
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
all tests pass:
success: http://buildbot.rust-lang.org/builders/auto-mac-32-opt/builds/1153
success: http://buildbot.rust-lang.org/builders/auto-mac-64-opt/builds/1153
success: http://buildbot.rust-lang.org/builders/auto-mac-64-nopt-c/builds/1152
success: http://buildbot.rust-lang.org/builders/auto-mac-64-nopt-t/builds/1153
success: http://buildbot.rust-lang.org/builders/auto-linux-32-opt/builds/1148
success: http://buildbot.rust-lang.org/builders/auto-linux-32-nopt-c/builds/1149
success: http://buildbot.rust-lang.org/builders/auto-linux-32-nopt-t/builds/1148
success: http://buildbot.rust-lang.org/builders/auto-linux-64-opt/builds/1154
success: http://buildbot.rust-lang.org/builders/auto-linux-64-nopt-c/builds/1149
success: http://buildbot.rust-lang.org/builders/auto-linux-64-nopt-t/builds/1148
success: http://buildbot.rust-lang.org/builders/auto-linux-64-x-android-t/builds/1151
success: http://buildbot.rust-lang.org/builders/auto-win-32-opt/builds/1152
success: http://buildbot.rust-lang.org/builders/auto-win-32-nopt-t/builds/1150
success: http://buildbot.rust-lang.org/builders/auto-win-32-nopt-c/builds/1151
ab3999f
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fast-forwarding master to auto = a4d257b