forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of rust-lang#84496 - marmeladema:specialization-test, r=…
…JohnTitor Add some specialization tests Closes rust-lang#33017 Closes rust-lang#51892 r? `@JohnTitor`
- Loading branch information
Showing
4 changed files
with
91 additions
and
0 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
// Test to ensure that trait bounds are propertly | ||
// checked on specializable associated types | ||
|
||
#![allow(incomplete_features)] | ||
#![feature(specialization)] | ||
|
||
trait UncheckedCopy: Sized { | ||
type Output: From<Self> + Copy + Into<Self>; | ||
} | ||
|
||
impl<T> UncheckedCopy for T { | ||
default type Output = Self; | ||
//~^ ERROR: the trait bound `T: Copy` is not satisfied | ||
} | ||
|
||
fn unchecked_copy<T: UncheckedCopy>(other: &T::Output) -> T { | ||
(*other).into() | ||
} | ||
|
||
fn bug(origin: String) { | ||
// Turn the String into it's Output type... | ||
// Which we can just do by `.into()`, the assoc type states `From<Self>`. | ||
let origin_output = origin.into(); | ||
|
||
// Make a copy of String::Output, which is a String... | ||
let mut copy: String = unchecked_copy::<String>(&origin_output); | ||
|
||
// Turn the Output type into a String again, | ||
// Which we can just do by `.into()`, the assoc type states `Into<Self>`. | ||
let mut origin: String = origin_output.into(); | ||
|
||
// assert both Strings use the same buffer. | ||
assert_eq!(copy.as_ptr(), origin.as_ptr()); | ||
|
||
// Any use of the copy we made becomes invalid, | ||
drop(origin); | ||
|
||
// OH NO! UB UB UB UB! | ||
copy.push_str(" world!"); | ||
println!("{}", copy); | ||
} | ||
|
||
fn main() { | ||
bug(String::from("hello")); | ||
} |
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,17 @@ | ||
error[E0277]: the trait bound `T: Copy` is not satisfied | ||
--> $DIR/issue-33017.rs:12:5 | ||
| | ||
LL | type Output: From<Self> + Copy + Into<Self>; | ||
| ---- required by this bound in `UncheckedCopy::Output` | ||
... | ||
LL | default type Output = Self; | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `T` | ||
| | ||
help: consider restricting type parameter `T` | ||
| | ||
LL | impl<T: std::marker::Copy> UncheckedCopy for T { | ||
| ^^^^^^^^^^^^^^^^^^^ | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0277`. |
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,19 @@ | ||
#![allow(incomplete_features)] | ||
#![feature(const_generics)] | ||
#![feature(const_evaluatable_checked)] | ||
#![feature(specialization)] | ||
|
||
pub trait Trait { | ||
type Type; | ||
} | ||
|
||
impl<T: ?Sized> Trait for T { | ||
default type Type = [u8; 1]; | ||
} | ||
|
||
impl<T: Trait> Trait for *const T { | ||
type Type = [u8; std::mem::size_of::<<T as Trait>::Type>()]; | ||
//~^ ERROR: unconstrained generic constant | ||
} | ||
|
||
fn main() {} |
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,10 @@ | ||
error: unconstrained generic constant | ||
--> $DIR/issue-51892.rs:15:5 | ||
| | ||
LL | type Type = [u8; std::mem::size_of::<<T as Trait>::Type>()]; | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | ||
= help: try adding a `where` bound using this expression: `where [(); std::mem::size_of::<<T as Trait>::Type>()]:` | ||
|
||
error: aborting due to previous error | ||
|