Skip to content

Commit 3310f72

Browse files
transmute test
1 parent 20679b1 commit 3310f72

File tree

3 files changed

+63
-2
lines changed

3 files changed

+63
-2
lines changed

compiler/rustc_middle/src/ty/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -653,8 +653,8 @@ pub enum AliasRelationDirection {
653653
impl std::fmt::Display for AliasRelationDirection {
654654
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
655655
match self {
656-
AliasRelationDirection::Equate => write!(f, " == "),
657-
AliasRelationDirection::Subtype => write!(f, " <: "),
656+
AliasRelationDirection::Equate => write!(f, "=="),
657+
AliasRelationDirection::Subtype => write!(f, "<:"),
658658
}
659659
}
660660
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// compile-flags: -Ztrait-solver=next
2+
3+
#![feature(specialization)]
4+
//~^ WARN the feature `specialization` is incomplete
5+
6+
trait Default {
7+
type Id;
8+
9+
fn intu(&self) -> &Self::Id;
10+
}
11+
12+
impl<T> Default for T {
13+
default type Id = T;
14+
15+
fn intu(&self) -> &Self::Id {
16+
self
17+
//~^ ERROR cannot satisfy `T <: <T as Default>::Id`
18+
}
19+
}
20+
21+
fn transmute<T: Default<Id = U>, U: Copy>(t: T) -> U {
22+
*t.intu()
23+
}
24+
25+
use std::num::NonZeroU8;
26+
fn main() {
27+
let s = transmute::<u8, Option<NonZeroU8>>(0);
28+
//~^ ERROR cannot satisfy `<u8 as Default>::Id == Option<NonZeroU8>
29+
assert_eq!(s, None);
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
2+
--> $DIR/specialization-transmute.rs:3:12
3+
|
4+
LL | #![feature(specialization)]
5+
| ^^^^^^^^^^^^^^
6+
|
7+
= note: see issue #31844 <https://github.com/rust-lang/rust/issues/31844> for more information
8+
= help: consider using `min_specialization` instead, which is more stable and complete
9+
= note: `#[warn(incomplete_features)]` on by default
10+
11+
error[E0284]: type annotations needed: cannot satisfy `T <: <T as Default>::Id`
12+
--> $DIR/specialization-transmute.rs:16:9
13+
|
14+
LL | self
15+
| ^^^^ cannot satisfy `T <: <T as Default>::Id`
16+
17+
error[E0284]: type annotations needed: cannot satisfy `<u8 as Default>::Id == Option<NonZeroU8>`
18+
--> $DIR/specialization-transmute.rs:27:13
19+
|
20+
LL | let s = transmute::<u8, Option<NonZeroU8>>(0);
21+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot satisfy `<u8 as Default>::Id == Option<NonZeroU8>`
22+
|
23+
note: required by a bound in `transmute`
24+
--> $DIR/specialization-transmute.rs:21:25
25+
|
26+
LL | fn transmute<T: Default<Id = U>, U: Copy>(t: T) -> U {
27+
| ^^^^^^ required by this bound in `transmute`
28+
29+
error: aborting due to 2 previous errors; 1 warning emitted
30+
31+
For more information about this error, try `rustc --explain E0284`.

0 commit comments

Comments
 (0)