-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Closed
Labels
A-GATsArea: Generic associated types (GATs)Area: Generic associated types (GATs)C-bugCategory: This is a bug.Category: This is a bug.F-generic_associated_types`#![feature(generic_associated_types)]` a.k.a. GATs`#![feature(generic_associated_types)]` a.k.a. GATs
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
gtsiam and qwertz19281
Metadata
Metadata
Assignees
Labels
A-GATsArea: Generic associated types (GATs)Area: Generic associated types (GATs)C-bugCategory: This is a bug.Category: This is a bug.F-generic_associated_types`#![feature(generic_associated_types)]` a.k.a. GATs`#![feature(generic_associated_types)]` a.k.a. GATs