mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Auto merge of #79266 - b-naber:gat_trait_path_parser, r=petrochenkov
Generic Associated Types in Trait Paths - Ast part The Ast part of https://github.com/rust-lang/rust/pull/78978 r? `@petrochenkov`
This commit is contained in:
commit
cfed9184f4
@ -1845,6 +1845,7 @@ impl UintTy {
|
||||
pub struct AssocTyConstraint {
|
||||
pub id: NodeId,
|
||||
pub ident: Ident,
|
||||
pub gen_args: Option<GenericArgs>,
|
||||
pub kind: AssocTyConstraintKind,
|
||||
pub span: Span,
|
||||
}
|
||||
|
@ -441,11 +441,14 @@ pub fn noop_flat_map_arm<T: MutVisitor>(mut arm: Arm, vis: &mut T) -> SmallVec<[
|
||||
}
|
||||
|
||||
pub fn noop_visit_ty_constraint<T: MutVisitor>(
|
||||
AssocTyConstraint { id, ident, kind, span }: &mut AssocTyConstraint,
|
||||
AssocTyConstraint { id, ident, gen_args, kind, span }: &mut AssocTyConstraint,
|
||||
vis: &mut T,
|
||||
) {
|
||||
vis.visit_id(id);
|
||||
vis.visit_ident(ident);
|
||||
if let Some(ref mut gen_args) = gen_args {
|
||||
vis.visit_generic_args(gen_args);
|
||||
}
|
||||
match kind {
|
||||
AssocTyConstraintKind::Equality { ref mut ty } => {
|
||||
vis.visit_ty(ty);
|
||||
|
@ -485,6 +485,9 @@ pub fn walk_assoc_ty_constraint<'a, V: Visitor<'a>>(
|
||||
constraint: &'a AssocTyConstraint,
|
||||
) {
|
||||
visitor.visit_ident(constraint.ident);
|
||||
if let Some(ref gen_args) = constraint.gen_args {
|
||||
visitor.visit_generic_args(gen_args.span(), gen_args);
|
||||
}
|
||||
match constraint.kind {
|
||||
AssocTyConstraintKind::Equality { ref ty } => {
|
||||
visitor.visit_ty(ty);
|
||||
|
@ -1000,6 +1000,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||
) -> hir::TypeBinding<'hir> {
|
||||
debug!("lower_assoc_ty_constraint(constraint={:?}, itctx={:?})", constraint, itctx);
|
||||
|
||||
if let Some(ref gen_args) = constraint.gen_args {
|
||||
self.sess.span_fatal(
|
||||
gen_args.span(),
|
||||
"generic associated types in trait paths are currently not implemented",
|
||||
);
|
||||
}
|
||||
|
||||
let kind = match constraint.kind {
|
||||
AssocTyConstraintKind::Equality { ref ty } => {
|
||||
hir::TypeBindingKind::Equality { ty: self.lower_ty(ty, itctx) }
|
||||
|
@ -1372,16 +1372,18 @@ fn deny_equality_constraints(
|
||||
if param.ident == *ident {
|
||||
let param = ident;
|
||||
match &full_path.segments[qself.position..] {
|
||||
[PathSegment { ident, .. }] => {
|
||||
[PathSegment { ident, args, .. }] => {
|
||||
// Make a new `Path` from `foo::Bar` to `Foo<Bar = RhsTy>`.
|
||||
let mut assoc_path = full_path.clone();
|
||||
// Remove `Bar` from `Foo::Bar`.
|
||||
assoc_path.segments.pop();
|
||||
let len = assoc_path.segments.len() - 1;
|
||||
let gen_args = args.as_ref().map(|p| (**p).clone());
|
||||
// Build `<Bar = RhsTy>`.
|
||||
let arg = AngleBracketedArg::Constraint(AssocTyConstraint {
|
||||
id: rustc_ast::node_id::DUMMY_NODE_ID,
|
||||
ident: *ident,
|
||||
gen_args,
|
||||
kind: AssocTyConstraintKind::Equality {
|
||||
ty: predicate.rhs_ty.clone(),
|
||||
},
|
||||
|
@ -3,10 +3,9 @@ use super::{Parser, TokenType};
|
||||
use crate::maybe_whole;
|
||||
use rustc_ast::ptr::P;
|
||||
use rustc_ast::token::{self, Token};
|
||||
use rustc_ast::{
|
||||
self as ast, AngleBracketedArg, AngleBracketedArgs, GenericArg, ParenthesizedArgs,
|
||||
};
|
||||
use rustc_ast::{self as ast, AngleBracketedArg, AngleBracketedArgs, ParenthesizedArgs};
|
||||
use rustc_ast::{AnonConst, AssocTyConstraint, AssocTyConstraintKind, BlockCheckMode};
|
||||
use rustc_ast::{GenericArg, GenericArgs};
|
||||
use rustc_ast::{Path, PathSegment, QSelf};
|
||||
use rustc_errors::{pluralize, Applicability, PResult};
|
||||
use rustc_span::source_map::{BytePos, Span};
|
||||
@ -414,32 +413,40 @@ impl<'a> Parser<'a> {
|
||||
|
||||
/// Parses a single argument in the angle arguments `<...>` of a path segment.
|
||||
fn parse_angle_arg(&mut self) -> PResult<'a, Option<AngleBracketedArg>> {
|
||||
if self.check_ident() && self.look_ahead(1, |t| matches!(t.kind, token::Eq | token::Colon))
|
||||
{
|
||||
// Parse associated type constraint.
|
||||
let lo = self.token.span;
|
||||
let ident = self.parse_ident()?;
|
||||
let kind = if self.eat(&token::Eq) {
|
||||
let ty = self.parse_assoc_equality_term(ident, self.prev_token.span)?;
|
||||
AssocTyConstraintKind::Equality { ty }
|
||||
} else if self.eat(&token::Colon) {
|
||||
let bounds = self.parse_generic_bounds(Some(self.prev_token.span))?;
|
||||
AssocTyConstraintKind::Bound { bounds }
|
||||
} else {
|
||||
unreachable!();
|
||||
};
|
||||
let lo = self.token.span;
|
||||
let arg = self.parse_generic_arg()?;
|
||||
match arg {
|
||||
Some(arg) => {
|
||||
if self.check(&token::Colon) | self.check(&token::Eq) {
|
||||
let (ident, gen_args) = self.get_ident_from_generic_arg(arg, lo)?;
|
||||
let kind = if self.eat(&token::Colon) {
|
||||
// Parse associated type constraint bound.
|
||||
|
||||
let span = lo.to(self.prev_token.span);
|
||||
let bounds = self.parse_generic_bounds(Some(self.prev_token.span))?;
|
||||
AssocTyConstraintKind::Bound { bounds }
|
||||
} else if self.eat(&token::Eq) {
|
||||
// Parse associated type equality constraint
|
||||
|
||||
// Gate associated type bounds, e.g., `Iterator<Item: Ord>`.
|
||||
if let AssocTyConstraintKind::Bound { .. } = kind {
|
||||
self.sess.gated_spans.gate(sym::associated_type_bounds, span);
|
||||
let ty = self.parse_assoc_equality_term(ident, self.prev_token.span)?;
|
||||
AssocTyConstraintKind::Equality { ty }
|
||||
} else {
|
||||
unreachable!();
|
||||
};
|
||||
|
||||
let span = lo.to(self.prev_token.span);
|
||||
|
||||
// Gate associated type bounds, e.g., `Iterator<Item: Ord>`.
|
||||
if let AssocTyConstraintKind::Bound { .. } = kind {
|
||||
self.sess.gated_spans.gate(sym::associated_type_bounds, span);
|
||||
}
|
||||
let constraint =
|
||||
AssocTyConstraint { id: ast::DUMMY_NODE_ID, ident, gen_args, kind, span };
|
||||
Ok(Some(AngleBracketedArg::Constraint(constraint)))
|
||||
} else {
|
||||
Ok(Some(AngleBracketedArg::Arg(arg)))
|
||||
}
|
||||
}
|
||||
|
||||
let constraint = AssocTyConstraint { id: ast::DUMMY_NODE_ID, ident, kind, span };
|
||||
Ok(Some(AngleBracketedArg::Constraint(constraint)))
|
||||
} else {
|
||||
Ok(self.parse_generic_arg()?.map(AngleBracketedArg::Arg))
|
||||
_ => Ok(None),
|
||||
}
|
||||
}
|
||||
|
||||
@ -542,4 +549,54 @@ impl<'a> Parser<'a> {
|
||||
};
|
||||
Ok(Some(arg))
|
||||
}
|
||||
|
||||
fn get_ident_from_generic_arg(
|
||||
&self,
|
||||
gen_arg: GenericArg,
|
||||
lo: Span,
|
||||
) -> PResult<'a, (Ident, Option<GenericArgs>)> {
|
||||
let gen_arg_span = gen_arg.span();
|
||||
match gen_arg {
|
||||
GenericArg::Type(t) => match t.into_inner().kind {
|
||||
ast::TyKind::Path(qself, mut path) => {
|
||||
if let Some(qself) = qself {
|
||||
let mut err = self.struct_span_err(
|
||||
gen_arg_span,
|
||||
"qualified paths cannot be used in associated type constraints",
|
||||
);
|
||||
err.span_label(
|
||||
qself.path_span,
|
||||
"not allowed in associated type constraints",
|
||||
);
|
||||
return Err(err);
|
||||
}
|
||||
if path.segments.len() == 1 {
|
||||
let path_seg = path.segments.remove(0);
|
||||
let ident = path_seg.ident;
|
||||
let gen_args = path_seg.args.map(|args| args.into_inner());
|
||||
return Ok((ident, gen_args));
|
||||
}
|
||||
let err = self.struct_span_err(
|
||||
path.span,
|
||||
"paths with multiple segments cannot be used in associated type constraints",
|
||||
);
|
||||
return Err(err);
|
||||
}
|
||||
_ => {
|
||||
let span = lo.to(self.prev_token.span);
|
||||
let err = self.struct_span_err(
|
||||
span,
|
||||
"only path types can be used in associated type constraints",
|
||||
);
|
||||
return Err(err);
|
||||
}
|
||||
},
|
||||
_ => {
|
||||
let span = lo.to(self.prev_token.span);
|
||||
let err = self
|
||||
.struct_span_err(span, "only types can be used in associated type constraints");
|
||||
return Err(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,11 @@
|
||||
#![feature(generic_associated_types)]
|
||||
//~^ WARNING: the feature `generic_associated_types` is incomplete
|
||||
|
||||
trait X {
|
||||
type Y<'a>;
|
||||
}
|
||||
|
||||
fn f1<'a>(arg : Box<dyn X<Y = B = &'a ()>>) {}
|
||||
//~^ ERROR: expected one of `!`, `(`, `+`, `,`, `::`, `<`, or `>`, found `=`
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,17 @@
|
||||
error: expected one of `!`, `(`, `+`, `,`, `::`, `<`, or `>`, found `=`
|
||||
--> $DIR/trait-path-expected-token.rs:8:33
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X<Y = B = &'a ()>>) {}
|
||||
| ^ expected one of 7 possible tokens
|
||||
|
||||
warning: the feature `generic_associated_types` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/trait-path-expected-token.rs:1:12
|
||||
|
|
||||
LL | #![feature(generic_associated_types)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #44265 <https://github.com/rust-lang/rust/issues/44265> for more information
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
@ -0,0 +1,23 @@
|
||||
#![feature(generic_associated_types)]
|
||||
//~^ WARNING: the feature `generic_associated_types` is incomplete
|
||||
|
||||
mod error1 {
|
||||
trait X {
|
||||
type Y<'a>;
|
||||
}
|
||||
|
||||
fn f1<'a>(arg : Box<dyn X< 1 = 32 >>) {}
|
||||
//~^ ERROR: expected expression, found `)`
|
||||
}
|
||||
|
||||
mod error2 {
|
||||
|
||||
trait X {
|
||||
type Y<'a>;
|
||||
}
|
||||
|
||||
fn f2<'a>(arg : Box<dyn X< { 1 } = 32 >>) {}
|
||||
//~^ ERROR: only types can be used in associated type constraints
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,25 @@
|
||||
error: expected expression, found `)`
|
||||
--> $DIR/trait-path-expressions.rs:9:39
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X< 1 = 32 >>) {}
|
||||
| - ^ expected expression
|
||||
| |
|
||||
| while parsing a const generic argument starting here
|
||||
|
||||
error: only types can be used in associated type constraints
|
||||
--> $DIR/trait-path-expressions.rs:19:30
|
||||
|
|
||||
LL | fn f2<'a>(arg : Box<dyn X< { 1 } = 32 >>) {}
|
||||
| ^^^^^
|
||||
|
||||
warning: the feature `generic_associated_types` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/trait-path-expressions.rs:1:12
|
||||
|
|
||||
LL | #![feature(generic_associated_types)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #44265 <https://github.com/rust-lang/rust/issues/44265> for more information
|
||||
|
||||
error: aborting due to 2 previous errors; 1 warning emitted
|
||||
|
@ -0,0 +1,21 @@
|
||||
#![feature(generic_associated_types)]
|
||||
//~^ WARNING: the feature `generic_associated_types` is incomplete
|
||||
|
||||
trait X {
|
||||
type Y<'a>;
|
||||
}
|
||||
|
||||
const _: () = {
|
||||
fn f1<'a>(arg : Box<dyn X< : 32 >>) {}
|
||||
//~^ ERROR: expected one of `>`, const, lifetime, or type, found `:`
|
||||
//~| ERROR: expected parameter name, found `>`
|
||||
//~| ERROR: expected one of `!`, `)`, `+`, `,`, or `::`, found `>`
|
||||
//~| ERROR: constant provided when a type was expected
|
||||
};
|
||||
|
||||
const _: () = {
|
||||
fn f1<'a>(arg : Box<dyn X< = 32 >>) {}
|
||||
//~^ ERROR: expected one of `>`, const, lifetime, or type, found `=`
|
||||
};
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,50 @@
|
||||
error: expected one of `>`, const, lifetime, or type, found `:`
|
||||
--> $DIR/trait-path-missing-gen_arg.rs:9:30
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X< : 32 >>) {}
|
||||
| ^ expected one of `>`, const, lifetime, or type
|
||||
|
|
||||
help: expressions must be enclosed in braces to be used as const generic arguments
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<{ dyn X< : 32 } >>) {}
|
||||
| ^ ^
|
||||
|
||||
error: expected parameter name, found `>`
|
||||
--> $DIR/trait-path-missing-gen_arg.rs:9:36
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X< : 32 >>) {}
|
||||
| ^ expected parameter name
|
||||
|
||||
error: expected one of `!`, `)`, `+`, `,`, or `::`, found `>`
|
||||
--> $DIR/trait-path-missing-gen_arg.rs:9:36
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X< : 32 >>) {}
|
||||
| ^
|
||||
| |
|
||||
| expected one of `!`, `)`, `+`, `,`, or `::`
|
||||
| help: missing `,`
|
||||
|
||||
error: expected one of `>`, const, lifetime, or type, found `=`
|
||||
--> $DIR/trait-path-missing-gen_arg.rs:17:30
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X< = 32 >>) {}
|
||||
| ^ expected one of `>`, const, lifetime, or type
|
||||
|
||||
warning: the feature `generic_associated_types` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/trait-path-missing-gen_arg.rs:1:12
|
||||
|
|
||||
LL | #![feature(generic_associated_types)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #44265 <https://github.com/rust-lang/rust/issues/44265> for more information
|
||||
|
||||
error[E0747]: constant provided when a type was expected
|
||||
--> $DIR/trait-path-missing-gen_arg.rs:9:23
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X< : 32 >>) {}
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 5 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0747`.
|
@ -0,0 +1,35 @@
|
||||
#![feature(generic_associated_types)]
|
||||
//~^ WARNING: the feature `generic_associated_types` is incomplete
|
||||
|
||||
const _: () = {
|
||||
trait X {
|
||||
type Y<'a>;
|
||||
}
|
||||
|
||||
fn f1<'a>(arg : Box<dyn X<X::Y = u32>>) {}
|
||||
//~^ ERROR: paths with multiple segments cannot be used in associated type constraints
|
||||
};
|
||||
|
||||
const _: () = {
|
||||
trait X {
|
||||
type Y<'a>;
|
||||
}
|
||||
|
||||
trait Z {}
|
||||
|
||||
impl<T : X<<Self as X>::Y<'a> = &'a u32>> Z for T {}
|
||||
//~^ ERROR: qualified paths cannot be used in associated type constraints
|
||||
};
|
||||
|
||||
const _: () = {
|
||||
trait X {
|
||||
type Y<'a>;
|
||||
}
|
||||
|
||||
trait Z {}
|
||||
|
||||
impl<T : X<X::Y<'a> = &'a u32>> Z for T {}
|
||||
//~^ ERROR: paths with multiple segments cannot be used in associated type constraints
|
||||
};
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,31 @@
|
||||
error: paths with multiple segments cannot be used in associated type constraints
|
||||
--> $DIR/trait-path-segments.rs:9:31
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X<X::Y = u32>>) {}
|
||||
| ^^^^
|
||||
|
||||
error: qualified paths cannot be used in associated type constraints
|
||||
--> $DIR/trait-path-segments.rs:20:16
|
||||
|
|
||||
LL | impl<T : X<<Self as X>::Y<'a> = &'a u32>> Z for T {}
|
||||
| ^^^^^^^^^-^^^^^^^^
|
||||
| |
|
||||
| not allowed in associated type constraints
|
||||
|
||||
error: paths with multiple segments cannot be used in associated type constraints
|
||||
--> $DIR/trait-path-segments.rs:31:16
|
||||
|
|
||||
LL | impl<T : X<X::Y<'a> = &'a u32>> Z for T {}
|
||||
| ^^^^^^^^
|
||||
|
||||
warning: the feature `generic_associated_types` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/trait-path-segments.rs:1:12
|
||||
|
|
||||
LL | #![feature(generic_associated_types)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #44265 <https://github.com/rust-lang/rust/issues/44265> for more information
|
||||
|
||||
error: aborting due to 3 previous errors; 1 warning emitted
|
||||
|
@ -0,0 +1,10 @@
|
||||
#![feature(generic_associated_types)]
|
||||
|
||||
trait X {
|
||||
type Y<'a>;
|
||||
}
|
||||
|
||||
const _: () = {
|
||||
fn f2<'a>(arg : Box<dyn X<Y<1> = &'a ()>>) {}
|
||||
//~^ ERROR: generic associated types in trait paths are currently not implemented
|
||||
};
|
@ -0,0 +1,8 @@
|
||||
error: generic associated types in trait paths are currently not implemented
|
||||
--> $DIR/trait-path-type-error-once-implemented.rs:8:30
|
||||
|
|
||||
LL | fn f2<'a>(arg : Box<dyn X<Y<1> = &'a ()>>) {}
|
||||
| ^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -0,0 +1,23 @@
|
||||
#![feature(generic_associated_types)]
|
||||
//~^ WARNING: the feature `generic_associated_types` is incomplete
|
||||
|
||||
trait X {
|
||||
type Y<'a>;
|
||||
}
|
||||
|
||||
const _: () = {
|
||||
fn f<'a>(arg : Box<dyn X< [u8; 1] = u32>>) {}
|
||||
//~^ ERROR: only path types can be used in associated type constraints
|
||||
};
|
||||
|
||||
const _: () = {
|
||||
fn f1<'a>(arg : Box<dyn X<(Y<'a>) = &'a ()>>) {}
|
||||
//~^ ERROR: only path types can be used in associated type constraints
|
||||
};
|
||||
|
||||
const _: () = {
|
||||
fn f1<'a>(arg : Box<dyn X< 'a = u32 >>) {}
|
||||
//~^ ERROR: only types can be used in associated type constraints
|
||||
};
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,29 @@
|
||||
error: only path types can be used in associated type constraints
|
||||
--> $DIR/trait-path-types.rs:9:29
|
||||
|
|
||||
LL | fn f<'a>(arg : Box<dyn X< [u8; 1] = u32>>) {}
|
||||
| ^^^^^^^
|
||||
|
||||
error: only path types can be used in associated type constraints
|
||||
--> $DIR/trait-path-types.rs:14:29
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X<(Y<'a>) = &'a ()>>) {}
|
||||
| ^^^^^^^
|
||||
|
||||
error: only types can be used in associated type constraints
|
||||
--> $DIR/trait-path-types.rs:19:30
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X< 'a = u32 >>) {}
|
||||
| ^^
|
||||
|
||||
warning: the feature `generic_associated_types` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/trait-path-types.rs:1:12
|
||||
|
|
||||
LL | #![feature(generic_associated_types)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #44265 <https://github.com/rust-lang/rust/issues/44265> for more information
|
||||
|
||||
error: aborting due to 3 previous errors; 1 warning emitted
|
||||
|
@ -0,0 +1,17 @@
|
||||
#![feature(generic_associated_types)]
|
||||
|
||||
trait X {
|
||||
type Y<'a>;
|
||||
}
|
||||
|
||||
const _: () = {
|
||||
fn f1<'a>(arg : Box<dyn X<Y<'a> = &'a ()>>) {}
|
||||
//~^ ERROR: generic associated types in trait paths are currently not implemented
|
||||
};
|
||||
|
||||
const _: () = {
|
||||
fn f1<'a>(arg : Box<dyn X<Y('a) = &'a ()>>) {}
|
||||
//~^ ERROR: lifetime in trait object type must be followed by `+`
|
||||
};
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,14 @@
|
||||
error: lifetime in trait object type must be followed by `+`
|
||||
--> $DIR/trait-path-unimplemented.rs:13:31
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X<Y('a) = &'a ()>>) {}
|
||||
| ^^
|
||||
|
||||
error: generic associated types in trait paths are currently not implemented
|
||||
--> $DIR/trait-path-unimplemented.rs:8:30
|
||||
|
|
||||
LL | fn f1<'a>(arg : Box<dyn X<Y<'a> = &'a ()>>) {}
|
||||
| ^^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
@ -9,7 +9,7 @@ type Type_1_<'a, T> = &'a T;
|
||||
//type Type_1<'a T> = &'a T; // error: expected `,` or `>` after lifetime name, found `T`
|
||||
|
||||
|
||||
type Type_2 = Type_1_<'static ()>; //~ error: expected one of `,` or `>`, found `(`
|
||||
type Type_2 = Type_1_<'static ()>; //~ error: expected one of `,`, `:`, `=`, or `>`, found `(`
|
||||
|
||||
|
||||
//type Type_3<T> = Box<T,,>; // error: expected type, found `,`
|
||||
|
@ -1,8 +1,8 @@
|
||||
error: expected one of `,` or `>`, found `(`
|
||||
error: expected one of `,`, `:`, `=`, or `>`, found `(`
|
||||
--> $DIR/issue-20616-2.rs:12:31
|
||||
|
|
||||
LL | type Type_2 = Type_1_<'static ()>;
|
||||
| ^ expected one of `,` or `>`
|
||||
| ^ expected one of `,`, `:`, `=`, or `>`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -11,7 +11,7 @@ type Type_1_<'a, T> = &'a T;
|
||||
|
||||
|
||||
type Type_3<T> = Box<T,,>;
|
||||
//~^ error: expected one of `>`, const, identifier, lifetime, or type, found `,`
|
||||
//~^ error: expected one of `>`, const, lifetime, or type, found `,`
|
||||
|
||||
|
||||
//type Type_4<T> = Type_1_<'static,, T>; // error: expected type, found `,`
|
||||
|
@ -1,8 +1,8 @@
|
||||
error: expected one of `>`, const, identifier, lifetime, or type, found `,`
|
||||
error: expected one of `>`, const, lifetime, or type, found `,`
|
||||
--> $DIR/issue-20616-3.rs:13:24
|
||||
|
|
||||
LL | type Type_3<T> = Box<T,,>;
|
||||
| ^ expected one of `>`, const, identifier, lifetime, or type
|
||||
| ^ expected one of `>`, const, lifetime, or type
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -14,7 +14,7 @@ type Type_1_<'a, T> = &'a T;
|
||||
|
||||
|
||||
type Type_4<T> = Type_1_<'static,, T>;
|
||||
//~^ error: expected one of `>`, const, identifier, lifetime, or type, found `,`
|
||||
//~^ error: expected one of `>`, const, lifetime, or type, found `,`
|
||||
|
||||
|
||||
type Type_5_<'a> = Type_1_<'a, ()>;
|
||||
|
@ -1,8 +1,8 @@
|
||||
error: expected one of `>`, const, identifier, lifetime, or type, found `,`
|
||||
error: expected one of `>`, const, lifetime, or type, found `,`
|
||||
--> $DIR/issue-20616-4.rs:16:34
|
||||
|
|
||||
LL | type Type_4<T> = Type_1_<'static,, T>;
|
||||
| ^ expected one of `>`, const, identifier, lifetime, or type
|
||||
| ^ expected one of `>`, const, lifetime, or type
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -20,7 +20,7 @@ type Type_5_<'a> = Type_1_<'a, ()>;
|
||||
|
||||
|
||||
type Type_5<'a> = Type_1_<'a, (),,>;
|
||||
//~^ error: expected one of `>`, const, identifier, lifetime, or type, found `,`
|
||||
//~^ error: expected one of `>`, const, lifetime, or type, found `,`
|
||||
|
||||
|
||||
//type Type_6 = Type_5_<'a,,>; // error: expected type, found `,`
|
||||
|
@ -1,8 +1,8 @@
|
||||
error: expected one of `>`, const, identifier, lifetime, or type, found `,`
|
||||
error: expected one of `>`, const, lifetime, or type, found `,`
|
||||
--> $DIR/issue-20616-5.rs:22:34
|
||||
|
|
||||
LL | type Type_5<'a> = Type_1_<'a, (),,>;
|
||||
| ^ expected one of `>`, const, identifier, lifetime, or type
|
||||
| ^ expected one of `>`, const, lifetime, or type
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -23,7 +23,7 @@ type Type_5_<'a> = Type_1_<'a, ()>;
|
||||
|
||||
|
||||
type Type_6 = Type_5_<'a,,>;
|
||||
//~^ error: expected one of `>`, const, identifier, lifetime, or type, found `,`
|
||||
//~^ error: expected one of `>`, const, lifetime, or type, found `,`
|
||||
|
||||
|
||||
//type Type_7 = Box<(),,>; // error: expected type, found `,`
|
||||
|
@ -1,8 +1,8 @@
|
||||
error: expected one of `>`, const, identifier, lifetime, or type, found `,`
|
||||
error: expected one of `>`, const, lifetime, or type, found `,`
|
||||
--> $DIR/issue-20616-6.rs:25:26
|
||||
|
|
||||
LL | type Type_6 = Type_5_<'a,,>;
|
||||
| ^ expected one of `>`, const, identifier, lifetime, or type
|
||||
| ^ expected one of `>`, const, lifetime, or type
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -26,7 +26,7 @@ type Type_5_<'a> = Type_1_<'a, ()>;
|
||||
|
||||
|
||||
type Type_7 = Box<(),,>;
|
||||
//~^ error: expected one of `>`, const, identifier, lifetime, or type, found `,`
|
||||
//~^ error: expected one of `>`, const, lifetime, or type, found `,`
|
||||
|
||||
|
||||
//type Type_8<'a,,> = &'a (); // error: expected ident, found `,`
|
||||
|
@ -1,8 +1,8 @@
|
||||
error: expected one of `>`, const, identifier, lifetime, or type, found `,`
|
||||
error: expected one of `>`, const, lifetime, or type, found `,`
|
||||
--> $DIR/issue-20616-7.rs:28:22
|
||||
|
|
||||
LL | type Type_7 = Box<(),,>;
|
||||
| ^ expected one of `>`, const, identifier, lifetime, or type
|
||||
| ^ expected one of `>`, const, lifetime, or type
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
fn main () {
|
||||
let sr: Vec<(u32, _, _) = vec![];
|
||||
//~^ ERROR expected one of `,` or `>`, found `=`
|
||||
//~^ ERROR only path types can be used in associated type constraints
|
||||
let sr2: Vec<(u32, _, _)> = sr.iter().map(|(faction, th_sender, th_receiver)| {}).collect();
|
||||
//~^ ERROR a value of type `Vec<(u32, _, _)>` cannot be built
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
error: expected one of `,` or `>`, found `=`
|
||||
--> $DIR/issue-34334.rs:2:29
|
||||
error: only path types can be used in associated type constraints
|
||||
--> $DIR/issue-34334.rs:2:17
|
||||
|
|
||||
LL | let sr: Vec<(u32, _, _) = vec![];
|
||||
| -- ^ expected one of `,` or `>`
|
||||
| -- ^^^^^^^^^^^
|
||||
| |
|
||||
| while parsing the type for `sr`
|
||||
|
||||
|
@ -5,7 +5,7 @@ struct Foo;
|
||||
|
||||
impl Foo {
|
||||
pub fn foo(_: i32, self: Box<Self) {}
|
||||
//~^ ERROR expected one of `!`, `(`, `+`, `,`, `::`, `<`, or `>`, found `)`
|
||||
//~^ ERROR expected one of `!`, `(`, `+`, `,`, `::`, `:`, `<`, `=`, or `>`, found `)`
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,8 +1,8 @@
|
||||
error: expected one of `!`, `(`, `+`, `,`, `::`, `<`, or `>`, found `)`
|
||||
error: expected one of `!`, `(`, `+`, `,`, `::`, `:`, `<`, `=`, or `>`, found `)`
|
||||
--> $DIR/issue-62660.rs:7:38
|
||||
|
|
||||
LL | pub fn foo(_: i32, self: Box<Self) {}
|
||||
| ^ expected one of 7 possible tokens
|
||||
| ^ expected one of 9 possible tokens
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -12,7 +12,7 @@ error: expected one of `!`, `(`, `)`, `+`, `,`, `::`, or `<`, found `;`
|
||||
LL | impl W <s(f;Y(;]
|
||||
| ^ expected one of 7 possible tokens
|
||||
|
||||
error: expected one of `!`, `&&`, `&`, `(`, `)`, `*`, `+`, `,`, `->`, `...`, `::`, `<`, `>`, `?`, `[`, `_`, `async`, `const`, `dyn`, `extern`, `fn`, `for`, `impl`, `unsafe`, lifetime, or path, found `;`
|
||||
error: expected one of `!`, `&&`, `&`, `(`, `)`, `*`, `+`, `,`, `->`, `...`, `::`, `:`, `<`, `=`, `>`, `?`, `[`, `_`, `async`, `const`, `dyn`, `extern`, `fn`, `for`, `impl`, `unsafe`, lifetime, or path, found `;`
|
||||
--> $DIR/issue-63116.rs:3:15
|
||||
|
|
||||
LL | impl W <s(f;Y(;]
|
||||
|
@ -3,6 +3,6 @@ struct Foo<'a, 'b> {
|
||||
}
|
||||
|
||||
fn foo<'a, 'b>(x: &mut Foo<'a; 'b>) {}
|
||||
//~^ ERROR expected one of `,` or `>`, found `;`
|
||||
//~^ ERROR expected one of `,`, `:`, `=`, or `>`, found `;`
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,8 +1,8 @@
|
||||
error: expected one of `,` or `>`, found `;`
|
||||
error: expected one of `,`, `:`, `=`, or `>`, found `;`
|
||||
--> $DIR/lifetime-semicolon.rs:5:30
|
||||
|
|
||||
LL | fn foo<'a, 'b>(x: &mut Foo<'a; 'b>) {}
|
||||
| ^ expected one of `,` or `>`
|
||||
| ^ expected one of `,`, `:`, `=`, or `>`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,2 +1,2 @@
|
||||
type closure = Box<lt/fn()>;
|
||||
//~^ ERROR expected one of `!`, `(`, `+`, `,`, `::`, `<`, or `>`, found `/`
|
||||
//~^ ERROR expected one of `!`, `(`, `+`, `,`, `::`, `:`, `<`, `=`, or `>`, found `/`
|
||||
|
@ -1,8 +1,8 @@
|
||||
error: expected one of `!`, `(`, `+`, `,`, `::`, `<`, or `>`, found `/`
|
||||
error: expected one of `!`, `(`, `+`, `,`, `::`, `:`, `<`, `=`, or `>`, found `/`
|
||||
--> $DIR/removed-syntax-closure-lifetime.rs:1:22
|
||||
|
|
||||
LL | type closure = Box<lt/fn()>;
|
||||
| ^ expected one of 7 possible tokens
|
||||
| ^ expected one of 9 possible tokens
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user