mirror of https://github.com/rust-lang/rust
57 lines
1.2 KiB
Rust
57 lines
1.2 KiB
Rust
trait Document {
|
|
type Cursor<'a>: DocCursor<'a>;
|
|
//~^ ERROR: missing required bound on `Cursor`
|
|
|
|
fn cursor(&self) -> Self::Cursor<'_>;
|
|
}
|
|
|
|
struct DocumentImpl {}
|
|
|
|
impl Document for DocumentImpl {
|
|
type Cursor<'a> = DocCursorImpl<'a>;
|
|
|
|
fn cursor(&self) -> Self::Cursor<'_> {
|
|
DocCursorImpl { document: &self }
|
|
}
|
|
}
|
|
|
|
trait DocCursor<'a> {}
|
|
|
|
struct DocCursorImpl<'a> {
|
|
document: &'a DocumentImpl,
|
|
}
|
|
|
|
impl<'a> DocCursor<'a> for DocCursorImpl<'a> {}
|
|
|
|
struct Lexer<'d, Cursor>
|
|
where
|
|
Cursor: DocCursor<'d>,
|
|
{
|
|
cursor: Cursor,
|
|
_phantom: std::marker::PhantomData<&'d ()>,
|
|
}
|
|
|
|
impl<'d, Cursor> Lexer<'d, Cursor>
|
|
where
|
|
Cursor: DocCursor<'d>,
|
|
{
|
|
pub fn from<Doc>(document: &'d Doc) -> Lexer<'d, Cursor>
|
|
where
|
|
Doc: Document<Cursor<'d> = Cursor>,
|
|
{
|
|
Lexer { cursor: document.cursor(), _phantom: std::marker::PhantomData }
|
|
}
|
|
}
|
|
|
|
fn create_doc() -> impl Document<Cursor<'_> = DocCursorImpl<'_>> {
|
|
//~^ ERROR `'_` cannot be used here [E0637]
|
|
//~| ERROR: missing lifetime specifier
|
|
DocumentImpl {}
|
|
}
|
|
|
|
pub fn main() {
|
|
let doc = create_doc();
|
|
let lexer: Lexer<'_, DocCursorImpl<'_>> = Lexer::from(&doc);
|
|
//~^ ERROR: `doc` does not live long enough
|
|
}
|