Closed
Description
I tried this code:
#![feature(generic_associated_types)]
use std::marker::PhantomData;
pub trait Type {
type Ref<'a>;
}
pub trait AsBytes {
fn as_bytes(&self) -> &[u8];
}
impl AsBytes for &str {
fn as_bytes(&self) -> &[u8] {
(*self).as_bytes()
}
}
pub struct Utf8;
impl Type for Utf8 {
type Ref<'a> = &'a str;
}
pub struct Bytes<T: Type> {
_marker: PhantomData<T>,
}
impl<T: Type> Bytes<T>
where
for<'a> T::Ref<'a>: AsBytes,
{
pub fn new() -> Self {
Self {
_marker: PhantomData,
}
}
}
fn main() {
let _b = Bytes::<Utf8>::new();
}
I expected to see this happen: I had expected compilation to succeed
Instead, this happened: Compilation fails with the error message below.
error[E0277]: the trait bound `for<'a> <Utf8 as Type>::Ref<'a>: AsBytes` is not satisfied
--> src\main.rs:41:14
|
41 | let _b = Bytes::<Utf8>::new();
| ^^^^^^^^^^^^^^^^^^ the trait `for<'a> AsBytes` is not implemented for `<Utf8 as Type>::Ref<'a>`
|
note: required by `Bytes::<T>::new`
--> src\main.rs:33:5
|
33 | pub fn new() -> Self {
| ^^^^^^^^^^^^^^^^^^^^
help: consider further restricting the associated type
|
40 | fn main() where for<'a> <Utf8 as Type>::Ref<'a>: AsBytes {
| ++++++++++++++++++++++++++++++++++++++++++++++
Meta
rustc --version --verbose
:
rustc 1.58.0-nightly (e269e6bf4 2021-10-26)
binary: rustc
commit-hash: e269e6bf47f40c9046cd44ab787881d700099252
commit-date: 2021-10-26
host: x86_64-pc-windows-msvc
release: 1.58.0-nightly
LLVM version: 13.0.0