Auto merge of #109128 - chenyukang:yukang/remove-type-ascription, r=estebank

Remove type ascription from parser and diagnostics

Mostly based on https://github.com/rust-lang/rust/pull/106826

Part of #101728

r? `@estebank`
This commit is contained in:
bors 2023-05-02 09:41:35 +00:00
commit 98c33e47a4
97 changed files with 762 additions and 1150 deletions

View file

@ -1589,7 +1589,6 @@ pub enum ClosureBinder {
pub struct MacCall { pub struct MacCall {
pub path: Path, pub path: Path,
pub args: P<DelimArgs>, pub args: P<DelimArgs>,
pub prior_type_ascription: Option<(Span, bool)>,
} }
impl MacCall { impl MacCall {

View file

@ -631,7 +631,7 @@ pub fn noop_visit_attribute<T: MutVisitor>(attr: &mut Attribute, vis: &mut T) {
} }
pub fn noop_visit_mac<T: MutVisitor>(mac: &mut MacCall, vis: &mut T) { pub fn noop_visit_mac<T: MutVisitor>(mac: &mut MacCall, vis: &mut T) {
let MacCall { path, args, prior_type_ascription: _ } = mac; let MacCall { path, args } = mac;
vis.visit_path(path); vis.visit_path(path);
visit_delim_args(args, vis); visit_delim_args(args, vis);
} }

View file

@ -53,8 +53,6 @@ pub enum AssocOp {
DotDot, DotDot,
/// `..=` range /// `..=` range
DotDotEq, DotDotEq,
/// `:`
Colon,
} }
#[derive(PartialEq, Debug)] #[derive(PartialEq, Debug)]
@ -96,7 +94,6 @@ pub fn from_token(t: &Token) -> Option<AssocOp> {
token::DotDotEq => Some(DotDotEq), token::DotDotEq => Some(DotDotEq),
// DotDotDot is no longer supported, but we need some way to display the error // DotDotDot is no longer supported, but we need some way to display the error
token::DotDotDot => Some(DotDotEq), token::DotDotDot => Some(DotDotEq),
token::Colon => Some(Colon),
// `<-` should probably be `< -` // `<-` should probably be `< -`
token::LArrow => Some(Less), token::LArrow => Some(Less),
_ if t.is_keyword(kw::As) => Some(As), _ if t.is_keyword(kw::As) => Some(As),
@ -133,7 +130,7 @@ pub fn from_ast_binop(op: BinOpKind) -> Self {
pub fn precedence(&self) -> usize { pub fn precedence(&self) -> usize {
use AssocOp::*; use AssocOp::*;
match *self { match *self {
As | Colon => 14, As => 14,
Multiply | Divide | Modulus => 13, Multiply | Divide | Modulus => 13,
Add | Subtract => 12, Add | Subtract => 12,
ShiftLeft | ShiftRight => 11, ShiftLeft | ShiftRight => 11,
@ -156,7 +153,7 @@ pub fn fixity(&self) -> Fixity {
Assign | AssignOp(_) => Fixity::Right, Assign | AssignOp(_) => Fixity::Right,
As | Multiply | Divide | Modulus | Add | Subtract | ShiftLeft | ShiftRight | BitAnd As | Multiply | Divide | Modulus | Add | Subtract | ShiftLeft | ShiftRight | BitAnd
| BitXor | BitOr | Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual | BitXor | BitOr | Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual
| LAnd | LOr | Colon => Fixity::Left, | LAnd | LOr => Fixity::Left,
DotDot | DotDotEq => Fixity::None, DotDot | DotDotEq => Fixity::None,
} }
} }
@ -166,8 +163,9 @@ pub fn is_comparison(&self) -> bool {
match *self { match *self {
Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual => true, Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual => true,
Assign | AssignOp(_) | As | Multiply | Divide | Modulus | Add | Subtract Assign | AssignOp(_) | As | Multiply | Divide | Modulus | Add | Subtract
| ShiftLeft | ShiftRight | BitAnd | BitXor | BitOr | LAnd | LOr | DotDot | DotDotEq | ShiftLeft | ShiftRight | BitAnd | BitXor | BitOr | LAnd | LOr | DotDot | DotDotEq => {
| Colon => false, false
}
} }
} }
@ -177,7 +175,7 @@ pub fn is_assign_like(&self) -> bool {
Assign | AssignOp(_) => true, Assign | AssignOp(_) => true,
Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual | As | Multiply Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual | As | Multiply
| Divide | Modulus | Add | Subtract | ShiftLeft | ShiftRight | BitAnd | BitXor | Divide | Modulus | Add | Subtract | ShiftLeft | ShiftRight | BitAnd | BitXor
| BitOr | LAnd | LOr | DotDot | DotDotEq | Colon => false, | BitOr | LAnd | LOr | DotDot | DotDotEq => false,
} }
} }
@ -202,7 +200,7 @@ pub fn to_ast_binop(&self) -> Option<BinOpKind> {
BitOr => Some(BinOpKind::BitOr), BitOr => Some(BinOpKind::BitOr),
LAnd => Some(BinOpKind::And), LAnd => Some(BinOpKind::And),
LOr => Some(BinOpKind::Or), LOr => Some(BinOpKind::Or),
Assign | AssignOp(_) | As | DotDot | DotDotEq | Colon => None, Assign | AssignOp(_) | As | DotDot | DotDotEq => None,
} }
} }
@ -223,10 +221,9 @@ pub fn can_continue_expr_unambiguously(&self) -> bool {
Greater | // `{ 42 } > 3` Greater | // `{ 42 } > 3`
GreaterEqual | // `{ 42 } >= 3` GreaterEqual | // `{ 42 } >= 3`
AssignOp(_) | // `{ 42 } +=` AssignOp(_) | // `{ 42 } +=`
As | // `{ 42 } as usize`
// Equal | // `{ 42 } == { 42 }` Accepting these here would regress incorrect // Equal | // `{ 42 } == { 42 }` Accepting these here would regress incorrect
// NotEqual | // `{ 42 } != { 42 }` struct literals parser recovery. // NotEqual | // `{ 42 } != { 42 } struct literals parser recovery.
Colon, // `{ 42 }: usize` As // `{ 42 } as usize`
) )
} }
} }
@ -254,7 +251,6 @@ pub enum ExprPrecedence {
Binary(BinOpKind), Binary(BinOpKind),
Cast, Cast,
Type,
Assign, Assign,
AssignOp, AssignOp,
@ -313,7 +309,6 @@ pub fn order(self) -> i8 {
// Binop-like expr kinds, handled by `AssocOp`. // Binop-like expr kinds, handled by `AssocOp`.
ExprPrecedence::Binary(op) => AssocOp::from_ast_binop(op).precedence() as i8, ExprPrecedence::Binary(op) => AssocOp::from_ast_binop(op).precedence() as i8,
ExprPrecedence::Cast => AssocOp::As.precedence() as i8, ExprPrecedence::Cast => AssocOp::As.precedence() as i8,
ExprPrecedence::Type => AssocOp::Colon.precedence() as i8,
ExprPrecedence::Assign | ExprPrecedence::Assign |
ExprPrecedence::AssignOp => AssocOp::Assign.precedence() as i8, ExprPrecedence::AssignOp => AssocOp::Assign.precedence() as i8,

View file

@ -341,10 +341,16 @@ pub(super) fn print_expr_outer_attr_style(&mut self, expr: &ast::Expr, is_inline
self.print_type(ty); self.print_type(ty);
} }
ast::ExprKind::Type(expr, ty) => { ast::ExprKind::Type(expr, ty) => {
let prec = AssocOp::Colon.precedence() as i8; self.word("type_ascribe!(");
self.print_expr_maybe_paren(expr, prec); self.ibox(0);
self.word_space(":"); self.print_expr(expr);
self.word(",");
self.space_if_not_bol();
self.print_type(ty); self.print_type(ty);
self.end();
self.word(")");
} }
ast::ExprKind::Let(pat, scrutinee, _) => { ast::ExprKind::Let(pat, scrutinee, _) => {
self.print_let(pat, scrutinee); self.print_let(pat, scrutinee);

View file

@ -68,9 +68,7 @@ pub fn parse_asm_args<'a>(
if !p.eat(&token::Comma) { if !p.eat(&token::Comma) {
if allow_templates { if allow_templates {
// After a template string, we always expect *only* a comma... // After a template string, we always expect *only* a comma...
let mut err = diag.create_err(errors::AsmExpectedComma { span: p.token.span }); return Err(diag.create_err(errors::AsmExpectedComma { span: p.token.span }));
p.maybe_annotate_with_ascription(&mut err, false);
return Err(err);
} else { } else {
// ...after that delegate to `expect` to also include the other expected tokens. // ...after that delegate to `expect` to also include the other expected tokens.
return Err(p.expect(&token::Comma).err().unwrap()); return Err(p.expect(&token::Comma).err().unwrap());

View file

@ -61,7 +61,6 @@ pub fn expand_assert<'cx>(
delim: MacDelimiter::Parenthesis, delim: MacDelimiter::Parenthesis,
tokens, tokens,
}), }),
prior_type_ascription: None,
})), })),
); );
expr_if_not(cx, call_site_span, cond_expr, then, None) expr_if_not(cx, call_site_span, cond_expr, then, None)

View file

@ -182,7 +182,6 @@ fn build_panic(&self, expr_str: &str, panic_path: Path) -> P<Expr> {
delim: MacDelimiter::Parenthesis, delim: MacDelimiter::Parenthesis,
tokens: initial.into_iter().chain(captures).collect::<TokenStream>(), tokens: initial.into_iter().chain(captures).collect::<TokenStream>(),
}), }),
prior_type_ascription: None,
})), })),
) )
} }

View file

@ -63,7 +63,6 @@ fn expand<'cx>(
delim: MacDelimiter::Parenthesis, delim: MacDelimiter::Parenthesis,
tokens: tts, tokens: tts,
}), }),
prior_type_ascription: None,
})), })),
), ),
) )

View file

@ -992,7 +992,6 @@ pub struct ExpansionData {
pub depth: usize, pub depth: usize,
pub module: Rc<ModuleData>, pub module: Rc<ModuleData>,
pub dir_ownership: DirOwnership, pub dir_ownership: DirOwnership,
pub prior_type_ascription: Option<(Span, bool)>,
/// Some parent node that is close to this macro call /// Some parent node that is close to this macro call
pub lint_node_id: NodeId, pub lint_node_id: NodeId,
pub is_trailing_mac: bool, pub is_trailing_mac: bool,
@ -1043,7 +1042,6 @@ pub fn new(
depth: 0, depth: 0,
module: Default::default(), module: Default::default(),
dir_ownership: DirOwnership::Owned { relative: None }, dir_ownership: DirOwnership::Owned { relative: None },
prior_type_ascription: None,
lint_node_id: ast::CRATE_NODE_ID, lint_node_id: ast::CRATE_NODE_ID,
is_trailing_mac: false, is_trailing_mac: false,
}, },

View file

@ -657,8 +657,6 @@ fn expand_invoc(
self.parse_ast_fragment(tok_result, fragment_kind, &mac.path, span) self.parse_ast_fragment(tok_result, fragment_kind, &mac.path, span)
} }
SyntaxExtensionKind::LegacyBang(expander) => { SyntaxExtensionKind::LegacyBang(expander) => {
let prev = self.cx.current_expansion.prior_type_ascription;
self.cx.current_expansion.prior_type_ascription = mac.prior_type_ascription;
let tok_result = expander.expand(self.cx, span, mac.args.tokens.clone()); let tok_result = expander.expand(self.cx, span, mac.args.tokens.clone());
let result = if let Some(result) = fragment_kind.make_from(tok_result) { let result = if let Some(result) = fragment_kind.make_from(tok_result) {
result result
@ -666,7 +664,6 @@ fn expand_invoc(
self.error_wrong_fragment_kind(fragment_kind, &mac, span); self.error_wrong_fragment_kind(fragment_kind, &mac, span);
fragment_kind.dummy(span) fragment_kind.dummy(span)
}; };
self.cx.current_expansion.prior_type_ascription = prev;
result result
} }
_ => unreachable!(), _ => unreachable!(),

View file

@ -250,8 +250,7 @@ fn expand_macro<'cx>(
trace_macros_note(&mut cx.expansions, sp, msg); trace_macros_note(&mut cx.expansions, sp, msg);
} }
let mut p = Parser::new(sess, tts, false, None); let p = Parser::new(sess, tts, false, None);
p.last_type_ascription = cx.current_expansion.prior_type_ascription;
if is_local { if is_local {
cx.resolver.record_macro_rule_usage(node_id, i); cx.resolver.record_macro_rule_usage(node_id, i);

View file

@ -21,7 +21,6 @@ fn mac_placeholder() -> P<ast::MacCall> {
delim: ast::MacDelimiter::Parenthesis, delim: ast::MacDelimiter::Parenthesis,
tokens: ast::tokenstream::TokenStream::new(Vec::new()), tokens: ast::tokenstream::TokenStream::new(Vec::new()),
}), }),
prior_type_ascription: None,
}) })
} }

View file

@ -1407,10 +1407,16 @@ pub fn print_expr(&mut self, expr: &hir::Expr<'_>) {
self.print_type(ty); self.print_type(ty);
} }
hir::ExprKind::Type(expr, ty) => { hir::ExprKind::Type(expr, ty) => {
let prec = AssocOp::Colon.precedence() as i8; self.word("type_ascribe!(");
self.print_expr_maybe_paren(expr, prec); self.ibox(0);
self.word_space(":"); self.print_expr(expr);
self.word(",");
self.space_if_not_bol();
self.print_type(ty); self.print_type(ty);
self.end();
self.word(")");
} }
hir::ExprKind::DropTemps(init) => { hir::ExprKind::DropTemps(init) => {
// Print `{`: // Print `{`:

View file

@ -685,10 +685,9 @@ enum ArmType {
/// For example, if we are constructing a witness for the match against /// For example, if we are constructing a witness for the match against
/// ///
/// ```compile_fail,E0004 /// ```compile_fail,E0004
/// # #![feature(type_ascription)]
/// struct Pair(Option<(u32, u32)>, bool); /// struct Pair(Option<(u32, u32)>, bool);
/// # fn foo(p: Pair) { /// # fn foo(p: Pair) {
/// match (p: Pair) { /// match p {
/// Pair(None, _) => {} /// Pair(None, _) => {}
/// Pair(_, false) => {} /// Pair(_, false) => {}
/// } /// }

View file

@ -420,6 +420,15 @@ parse_maybe_fn_typo_with_impl = you might have meant to write `impl` instead of
parse_expected_fn_path_found_fn_keyword = expected identifier, found keyword `fn` parse_expected_fn_path_found_fn_keyword = expected identifier, found keyword `fn`
.suggestion = use `Fn` to refer to the trait .suggestion = use `Fn` to refer to the trait
parse_path_single_colon = path separator must be a double colon
.suggestion = use a double colon instead
parse_colon_as_semi = statements are terminated with a semicolon
.suggestion = use a semicolon instead
parse_type_ascription_removed =
if you meant to annotate an expression with a type, the type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
parse_where_clause_before_tuple_struct_body = where clauses are not allowed before tuple struct bodies parse_where_clause_before_tuple_struct_body = where clauses are not allowed before tuple struct bodies
.label = unexpected where clause .label = unexpected where clause
.name_label = while parsing this tuple struct .name_label = while parsing this tuple struct

View file

@ -1340,6 +1340,28 @@ pub(crate) struct ExpectedFnPathFoundFnKeyword {
pub fn_token_span: Span, pub fn_token_span: Span,
} }
#[derive(Diagnostic)]
#[diag(parse_path_single_colon)]
pub(crate) struct PathSingleColon {
#[primary_span]
#[suggestion(applicability = "machine-applicable", code = "::")]
pub span: Span,
#[note(parse_type_ascription_removed)]
pub type_ascription: Option<()>,
}
#[derive(Diagnostic)]
#[diag(parse_colon_as_semi)]
pub(crate) struct ColonAsSemi {
#[primary_span]
#[suggestion(applicability = "machine-applicable", code = ";")]
pub span: Span,
#[note(parse_type_ascription_removed)]
pub type_ascription: Option<()>,
}
#[derive(Diagnostic)] #[derive(Diagnostic)]
#[diag(parse_where_clause_before_tuple_struct_body)] #[diag(parse_where_clause_before_tuple_struct_body)]
pub(crate) struct WhereClauseBeforeTupleStructBody { pub(crate) struct WhereClauseBeforeTupleStructBody {

View file

@ -4,7 +4,7 @@
TokenExpectType, TokenType, TokenExpectType, TokenType,
}; };
use crate::errors::{ use crate::errors::{
AmbiguousPlus, AttributeOnParamType, BadQPathStage2, BadTypePlus, BadTypePlusSub, AmbiguousPlus, AttributeOnParamType, BadQPathStage2, BadTypePlus, BadTypePlusSub, ColonAsSemi,
ComparisonOperatorsCannotBeChained, ComparisonOperatorsCannotBeChainedSugg, ComparisonOperatorsCannotBeChained, ComparisonOperatorsCannotBeChainedSugg,
ConstGenericWithoutBraces, ConstGenericWithoutBracesSugg, DocCommentDoesNotDocumentAnything, ConstGenericWithoutBraces, ConstGenericWithoutBracesSugg, DocCommentDoesNotDocumentAnything,
DocCommentOnParamType, DoubleColonInBound, ExpectedIdentifier, ExpectedSemi, ExpectedSemiSugg, DocCommentOnParamType, DoubleColonInBound, ExpectedIdentifier, ExpectedSemi, ExpectedSemiSugg,
@ -84,6 +84,7 @@ fn recovered(qself: Option<P<QSelf>>, path: ast::Path) -> Self {
} }
impl RecoverQPath for Pat { impl RecoverQPath for Pat {
const PATH_STYLE: PathStyle = PathStyle::Pat;
fn to_ty(&self) -> Option<P<Ty>> { fn to_ty(&self) -> Option<P<Ty>> {
self.to_ty() self.to_ty()
} }
@ -663,7 +664,6 @@ fn is_ident_eq_keyword(found: &TokenKind, expected: &TokenType) -> bool {
err.span_label(sp, label_exp); err.span_label(sp, label_exp);
err.span_label(self.token.span, "unexpected token"); err.span_label(self.token.span, "unexpected token");
} }
self.maybe_annotate_with_ascription(&mut err, false);
Err(err) Err(err)
} }
@ -788,59 +788,6 @@ pub fn maybe_suggest_struct_literal(
None None
} }
pub fn maybe_annotate_with_ascription(
&mut self,
err: &mut Diagnostic,
maybe_expected_semicolon: bool,
) {
if let Some((sp, likely_path)) = self.last_type_ascription.take() {
let sm = self.sess.source_map();
let next_pos = sm.lookup_char_pos(self.token.span.lo());
let op_pos = sm.lookup_char_pos(sp.hi());
let allow_unstable = self.sess.unstable_features.is_nightly_build();
if likely_path {
err.span_suggestion(
sp,
"maybe write a path separator here",
"::",
if allow_unstable {
Applicability::MaybeIncorrect
} else {
Applicability::MachineApplicable
},
);
self.sess.type_ascription_path_suggestions.borrow_mut().insert(sp);
} else if op_pos.line != next_pos.line && maybe_expected_semicolon {
err.span_suggestion(
sp,
"try using a semicolon",
";",
Applicability::MaybeIncorrect,
);
} else if allow_unstable {
err.span_label(sp, "tried to parse a type due to this type ascription");
} else {
err.span_label(sp, "tried to parse a type due to this");
}
if allow_unstable {
// Give extra information about type ascription only if it's a nightly compiler.
err.note(
"`#![feature(type_ascription)]` lets you annotate an expression with a type: \
`<expr>: <type>`",
);
if !likely_path {
// Avoid giving too much info when it was likely an unrelated typo.
err.note(
"see issue #23416 <https://github.com/rust-lang/rust/issues/23416> \
for more information",
);
}
}
}
}
/// Eats and discards tokens until one of `kets` is encountered. Respects token trees, /// Eats and discards tokens until one of `kets` is encountered. Respects token trees,
/// passes through any errors encountered. Used for error recovery. /// passes through any errors encountered. Used for error recovery.
pub(super) fn eat_to_tokens(&mut self, kets: &[&TokenKind]) { pub(super) fn eat_to_tokens(&mut self, kets: &[&TokenKind]) {
@ -1622,12 +1569,36 @@ pub(super) fn unexpected_try_recover(
} }
pub(super) fn expect_semi(&mut self) -> PResult<'a, ()> { pub(super) fn expect_semi(&mut self) -> PResult<'a, ()> {
if self.eat(&token::Semi) { if self.eat(&token::Semi) || self.recover_colon_as_semi() {
return Ok(()); return Ok(());
} }
self.expect(&token::Semi).map(drop) // Error unconditionally self.expect(&token::Semi).map(drop) // Error unconditionally
} }
pub(super) fn recover_colon_as_semi(&mut self) -> bool {
let line_idx = |span: Span| {
self.sess
.source_map()
.span_to_lines(span)
.ok()
.and_then(|lines| Some(lines.lines.get(0)?.line_index))
};
if self.may_recover()
&& self.token == token::Colon
&& self.look_ahead(1, |next| line_idx(self.token.span) < line_idx(next.span))
{
self.sess.emit_err(ColonAsSemi {
span: self.token.span,
type_ascription: self.sess.unstable_features.is_nightly_build().then_some(()),
});
self.bump();
return true;
}
false
}
/// Consumes alternative await syntaxes like `await!(<expr>)`, `await <expr>`, /// Consumes alternative await syntaxes like `await!(<expr>)`, `await <expr>`,
/// `await? <expr>`, `await(<expr>)`, and `await { <expr> }`. /// `await? <expr>`, `await(<expr>)`, and `await { <expr> }`.
pub(super) fn recover_incorrect_await_syntax( pub(super) fn recover_incorrect_await_syntax(
@ -1790,24 +1761,6 @@ pub(super) fn recover_parens_around_for_head(
} }
} }
pub(super) fn could_ascription_be_path(&self, node: &ast::ExprKind) -> bool {
(self.token == token::Lt && // `foo:<bar`, likely a typoed turbofish.
self.look_ahead(1, |t| t.is_ident() && !t.is_reserved_ident()))
|| self.token.is_ident() &&
matches!(node, ast::ExprKind::Path(..) | ast::ExprKind::Field(..)) &&
!self.token.is_reserved_ident() && // v `foo:bar(baz)`
self.look_ahead(1, |t| t == &token::OpenDelim(Delimiter::Parenthesis))
|| self.look_ahead(1, |t| t == &token::OpenDelim(Delimiter::Brace)) // `foo:bar {`
|| self.look_ahead(1, |t| t == &token::Colon) && // `foo:bar::<baz`
self.look_ahead(2, |t| t == &token::Lt) &&
self.look_ahead(3, |t| t.is_ident())
|| self.look_ahead(1, |t| t == &token::Colon) && // `foo:bar:baz`
self.look_ahead(2, |t| t.is_ident())
|| self.look_ahead(1, |t| t == &token::ModSep)
&& (self.look_ahead(2, |t| t.is_ident()) || // `foo:bar::baz`
self.look_ahead(2, |t| t == &token::Lt)) // `foo:bar::<baz>`
}
pub(super) fn recover_seq_parse_error( pub(super) fn recover_seq_parse_error(
&mut self, &mut self,
delim: Delimiter, delim: Delimiter,
@ -1902,7 +1855,6 @@ pub(super) fn recover_stmt_(
&& brace_depth == 0 && brace_depth == 0
&& bracket_depth == 0 => && bracket_depth == 0 =>
{ {
debug!("recover_stmt_ return - Semi");
break; break;
} }
_ => self.bump(), _ => self.bump(),

View file

@ -174,10 +174,8 @@ pub(super) fn parse_expr_assoc_with(
self.parse_expr_prefix(attrs)? self.parse_expr_prefix(attrs)?
} }
}; };
let last_type_ascription_set = self.last_type_ascription.is_some();
if !self.should_continue_as_assoc_expr(&lhs) { if !self.should_continue_as_assoc_expr(&lhs) {
self.last_type_ascription = None;
return Ok(lhs); return Ok(lhs);
} }
@ -301,9 +299,6 @@ pub(super) fn parse_expr_assoc_with(
if op == AssocOp::As { if op == AssocOp::As {
lhs = self.parse_assoc_op_cast(lhs, lhs_span, ExprKind::Cast)?; lhs = self.parse_assoc_op_cast(lhs, lhs_span, ExprKind::Cast)?;
continue; continue;
} else if op == AssocOp::Colon {
lhs = self.parse_assoc_op_ascribe(lhs, lhs_span)?;
continue;
} else if op == AssocOp::DotDot || op == AssocOp::DotDotEq { } else if op == AssocOp::DotDot || op == AssocOp::DotDotEq {
// If we didn't have to handle `x..`/`x..=`, it would be pretty easy to // If we didn't have to handle `x..`/`x..=`, it would be pretty easy to
// generalise it to the Fixity::None code. // generalise it to the Fixity::None code.
@ -364,7 +359,7 @@ pub(super) fn parse_expr_assoc_with(
let aopexpr = self.mk_assign_op(source_map::respan(cur_op_span, aop), lhs, rhs); let aopexpr = self.mk_assign_op(source_map::respan(cur_op_span, aop), lhs, rhs);
self.mk_expr(span, aopexpr) self.mk_expr(span, aopexpr)
} }
AssocOp::As | AssocOp::Colon | AssocOp::DotDot | AssocOp::DotDotEq => { AssocOp::As | AssocOp::DotDot | AssocOp::DotDotEq => {
self.span_bug(span, "AssocOp should have been handled by special case") self.span_bug(span, "AssocOp should have been handled by special case")
} }
}; };
@ -373,9 +368,7 @@ pub(super) fn parse_expr_assoc_with(
break; break;
} }
} }
if last_type_ascription_set {
self.last_type_ascription = None;
}
Ok(lhs) Ok(lhs)
} }
@ -743,7 +736,7 @@ fn parse_assoc_op_cast(
( (
// `foo: ` // `foo: `
ExprKind::Path(None, ast::Path { segments, .. }), ExprKind::Path(None, ast::Path { segments, .. }),
TokenKind::Ident(kw::For | kw::Loop | kw::While, false), token::Ident(kw::For | kw::Loop | kw::While, false),
) if segments.len() == 1 => { ) if segments.len() == 1 => {
let snapshot = self.create_snapshot_for_diagnostic(); let snapshot = self.create_snapshot_for_diagnostic();
let label = Label { let label = Label {
@ -838,21 +831,19 @@ fn parse_and_disallow_postfix_after_cast(
&mut self, &mut self,
cast_expr: P<Expr>, cast_expr: P<Expr>,
) -> PResult<'a, P<Expr>> { ) -> PResult<'a, P<Expr>> {
if let ExprKind::Type(_, _) = cast_expr.kind {
panic!("ExprKind::Type must not be parsed");
}
let span = cast_expr.span; let span = cast_expr.span;
let (cast_kind, maybe_ascription_span) =
if let ExprKind::Type(ascripted_expr, _) = &cast_expr.kind {
("type ascription", Some(ascripted_expr.span.shrink_to_hi().with_hi(span.hi())))
} else {
("cast", None)
};
let with_postfix = self.parse_expr_dot_or_call_with_(cast_expr, span)?; let with_postfix = self.parse_expr_dot_or_call_with_(cast_expr, span)?;
// Check if an illegal postfix operator has been added after the cast. // Check if an illegal postfix operator has been added after the cast.
// If the resulting expression is not a cast, it is an illegal postfix operator. // If the resulting expression is not a cast, it is an illegal postfix operator.
if !matches!(with_postfix.kind, ExprKind::Cast(_, _) | ExprKind::Type(_, _)) { if !matches!(with_postfix.kind, ExprKind::Cast(_, _)) {
let msg = format!( let msg = format!(
"{cast_kind} cannot be followed by {}", "cast cannot be followed by {}",
match with_postfix.kind { match with_postfix.kind {
ExprKind::Index(_, _) => "indexing", ExprKind::Index(_, _) => "indexing",
ExprKind::Try(_) => "`?`", ExprKind::Try(_) => "`?`",
@ -878,44 +869,13 @@ fn parse_and_disallow_postfix_after_cast(
); );
}; };
// If type ascription is "likely an error", the user will already be getting a useful suggest_parens(&mut err);
// help message, and doesn't need a second.
if self.last_type_ascription.map_or(false, |last_ascription| last_ascription.1) {
self.maybe_annotate_with_ascription(&mut err, false);
} else if let Some(ascription_span) = maybe_ascription_span {
let is_nightly = self.sess.unstable_features.is_nightly_build();
if is_nightly {
suggest_parens(&mut err);
}
err.span_suggestion(
ascription_span,
&format!(
"{}remove the type ascription",
if is_nightly { "alternatively, " } else { "" }
),
"",
if is_nightly {
Applicability::MaybeIncorrect
} else {
Applicability::MachineApplicable
},
);
} else {
suggest_parens(&mut err);
}
err.emit(); err.emit();
}; };
Ok(with_postfix) Ok(with_postfix)
} }
fn parse_assoc_op_ascribe(&mut self, lhs: P<Expr>, lhs_span: Span) -> PResult<'a, P<Expr>> {
let maybe_path = self.could_ascription_be_path(&lhs.kind);
self.last_type_ascription = Some((self.prev_token.span, maybe_path));
let lhs = self.parse_assoc_op_cast(lhs, lhs_span, ExprKind::Type)?;
self.sess.gated_spans.gate(sym::type_ascription, lhs.span);
Ok(lhs)
}
/// Parse `& mut? <expr>` or `& raw [ const | mut ] <expr>`. /// Parse `& mut? <expr>` or `& raw [ const | mut ] <expr>`.
fn parse_expr_borrow(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> { fn parse_expr_borrow(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> {
self.expect_and()?; self.expect_and()?;
@ -1010,7 +970,7 @@ fn parse_expr_dot_or_call_with_(&mut self, mut e: P<Expr>, lo: Span) -> PResult<
}; };
if has_dot { if has_dot {
// expr.f // expr.f
e = self.parse_expr_dot_suffix(lo, e)?; e = self.parse_dot_suffix_expr(lo, e)?;
continue; continue;
} }
if self.expr_is_complete(&e) { if self.expr_is_complete(&e) {
@ -1024,13 +984,7 @@ fn parse_expr_dot_or_call_with_(&mut self, mut e: P<Expr>, lo: Span) -> PResult<
} }
} }
fn look_ahead_type_ascription_as_field(&mut self) -> bool { fn parse_dot_suffix_expr(&mut self, lo: Span, base: P<Expr>) -> PResult<'a, P<Expr>> {
self.look_ahead(1, |t| t.is_ident())
&& self.look_ahead(2, |t| t == &token::Colon)
&& self.look_ahead(3, |t| t.can_begin_expr())
}
fn parse_expr_dot_suffix(&mut self, lo: Span, base: P<Expr>) -> PResult<'a, P<Expr>> {
match self.token.uninterpolate().kind { match self.token.uninterpolate().kind {
token::Ident(..) => self.parse_dot_suffix(base, lo), token::Ident(..) => self.parse_dot_suffix(base, lo),
token::Literal(token::Lit { kind: token::Integer, symbol, suffix }) => { token::Literal(token::Lit { kind: token::Integer, symbol, suffix }) => {
@ -1183,9 +1137,7 @@ fn parse_expr_tuple_field_access(
/// Parse a function call expression, `expr(...)`. /// Parse a function call expression, `expr(...)`.
fn parse_expr_fn_call(&mut self, lo: Span, fun: P<Expr>) -> P<Expr> { fn parse_expr_fn_call(&mut self, lo: Span, fun: P<Expr>) -> P<Expr> {
let snapshot = if self.token.kind == token::OpenDelim(Delimiter::Parenthesis) let snapshot = if self.token.kind == token::OpenDelim(Delimiter::Parenthesis) {
&& self.look_ahead_type_ascription_as_field()
{
Some((self.create_snapshot_for_diagnostic(), fun.kind.clone())) Some((self.create_snapshot_for_diagnostic(), fun.kind.clone()))
} else { } else {
None None
@ -1216,7 +1168,6 @@ fn maybe_recover_struct_lit_bad_delims(
if !self.may_recover() { if !self.may_recover() {
return None; return None;
} }
match (seq.as_mut(), snapshot) { match (seq.as_mut(), snapshot) {
(Err(err), Some((mut snapshot, ExprKind::Path(None, path)))) => { (Err(err), Some((mut snapshot, ExprKind::Path(None, path)))) => {
snapshot.bump(); // `(` snapshot.bump(); // `(`
@ -1260,9 +1211,7 @@ fn maybe_recover_struct_lit_bad_delims(
return Some(self.mk_expr_err(span)); return Some(self.mk_expr_err(span));
} }
Ok(_) => {} Ok(_) => {}
Err(mut err) => { Err(err) => err.cancel(),
err.emit();
}
} }
} }
_ => {} _ => {}
@ -1516,7 +1465,6 @@ fn parse_expr_path_start(&mut self) -> PResult<'a, P<Expr>> {
let mac = P(MacCall { let mac = P(MacCall {
path, path,
args: self.parse_delim_args()?, args: self.parse_delim_args()?,
prior_type_ascription: self.last_type_ascription,
}); });
(lo.to(self.prev_token.span), ExprKind::MacCall(mac)) (lo.to(self.prev_token.span), ExprKind::MacCall(mac))
} else if self.check(&token::OpenDelim(Delimiter::Brace)) } else if self.check(&token::OpenDelim(Delimiter::Brace))
@ -1535,7 +1483,7 @@ fn parse_expr_path_start(&mut self) -> PResult<'a, P<Expr>> {
} }
/// Parse `'label: $expr`. The label is already parsed. /// Parse `'label: $expr`. The label is already parsed.
fn parse_expr_labeled( pub(super) fn parse_expr_labeled(
&mut self, &mut self,
label_: Label, label_: Label,
mut consume_colon: bool, mut consume_colon: bool,
@ -3013,6 +2961,11 @@ pub(super) fn parse_struct_fields(
} else { } else {
e.span_label(pth.span, "while parsing this struct"); e.span_label(pth.span, "while parsing this struct");
} }
if !recover {
return Err(e);
}
e.emit(); e.emit();
// If the next token is a comma, then try to parse // If the next token is a comma, then try to parse
@ -3024,6 +2977,7 @@ pub(super) fn parse_struct_fields(
break; break;
} }
} }
None None
} }
}; };

View file

@ -443,7 +443,7 @@ fn parse_item_macro(&mut self, vis: &Visibility) -> PResult<'a, MacCall> {
Ok(args) => { Ok(args) => {
self.eat_semi_for_macro_if_needed(&args); self.eat_semi_for_macro_if_needed(&args);
self.complain_if_pub_macro(vis, false); self.complain_if_pub_macro(vis, false);
Ok(MacCall { path, args, prior_type_ascription: self.last_type_ascription }) Ok(MacCall { path, args })
} }
Err(mut err) => { Err(mut err) => {

View file

@ -148,9 +148,6 @@ pub struct Parser<'a> {
max_angle_bracket_count: u32, max_angle_bracket_count: u32,
last_unexpected_token_span: Option<Span>, last_unexpected_token_span: Option<Span>,
/// Span pointing at the `:` for the last type ascription the parser has seen, and whether it
/// looked like it could have been a mistyped path or literal `Option:Some(42)`).
pub last_type_ascription: Option<(Span, bool /* likely path typo */)>,
/// If present, this `Parser` is not parsing Rust code but rather a macro call. /// If present, this `Parser` is not parsing Rust code but rather a macro call.
subparser_name: Option<&'static str>, subparser_name: Option<&'static str>,
capture_state: CaptureState, capture_state: CaptureState,
@ -165,7 +162,7 @@ pub struct Parser<'a> {
// This type is used a lot, e.g. it's cloned when matching many declarative macro rules with nonterminals. Make sure // This type is used a lot, e.g. it's cloned when matching many declarative macro rules with nonterminals. Make sure
// it doesn't unintentionally get bigger. // it doesn't unintentionally get bigger.
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] #[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
rustc_data_structures::static_assert_size!(Parser<'_>, 288); rustc_data_structures::static_assert_size!(Parser<'_>, 272);
/// Stores span information about a closure. /// Stores span information about a closure.
#[derive(Clone)] #[derive(Clone)]
@ -470,7 +467,6 @@ pub fn new(
unmatched_angle_bracket_count: 0, unmatched_angle_bracket_count: 0,
max_angle_bracket_count: 0, max_angle_bracket_count: 0,
last_unexpected_token_span: None, last_unexpected_token_span: None,
last_type_ascription: None,
subparser_name, subparser_name,
capture_state: CaptureState { capture_state: CaptureState {
capturing: Capturing::No, capturing: Capturing::No,
@ -941,10 +937,14 @@ fn parse_seq_to_before_tokens<T>(
// propagate the help message from sub error 'e' to main error 'expect_err; // propagate the help message from sub error 'e' to main error 'expect_err;
expect_err.children.push(xx.clone()); expect_err.children.push(xx.clone());
} }
expect_err.emit();
e.cancel(); e.cancel();
break; if self.token == token::Colon {
// we will try to recover in `maybe_recover_struct_lit_bad_delims`
return Err(expect_err);
} else {
expect_err.emit();
break;
}
} }
} }
} }

View file

@ -406,11 +406,11 @@ fn parse_pat_with_range_pat(
// Parse pattern starting with a path // Parse pattern starting with a path
let (qself, path) = if self.eat_lt() { let (qself, path) = if self.eat_lt() {
// Parse a qualified path // Parse a qualified path
let (qself, path) = self.parse_qpath(PathStyle::Expr)?; let (qself, path) = self.parse_qpath(PathStyle::Pat)?;
(Some(qself), path) (Some(qself), path)
} else { } else {
// Parse an unqualified path // Parse an unqualified path
(None, self.parse_path(PathStyle::Expr)?) (None, self.parse_path(PathStyle::Pat)?)
}; };
let span = lo.to(self.prev_token.span); let span = lo.to(self.prev_token.span);
@ -666,7 +666,7 @@ fn recover_additional_muts(&mut self) {
fn parse_pat_mac_invoc(&mut self, path: Path) -> PResult<'a, PatKind> { fn parse_pat_mac_invoc(&mut self, path: Path) -> PResult<'a, PatKind> {
self.bump(); self.bump();
let args = self.parse_delim_args()?; let args = self.parse_delim_args()?;
let mac = P(MacCall { path, args, prior_type_ascription: self.last_type_ascription }); let mac = P(MacCall { path, args });
Ok(PatKind::MacCall(mac)) Ok(PatKind::MacCall(mac))
} }
@ -789,11 +789,11 @@ fn parse_pat_range_end(&mut self) -> PResult<'a, P<Expr>> {
let lo = self.token.span; let lo = self.token.span;
let (qself, path) = if self.eat_lt() { let (qself, path) = if self.eat_lt() {
// Parse a qualified path // Parse a qualified path
let (qself, path) = self.parse_qpath(PathStyle::Expr)?; let (qself, path) = self.parse_qpath(PathStyle::Pat)?;
(Some(qself), path) (Some(qself), path)
} else { } else {
// Parse an unqualified path // Parse an unqualified path
(None, self.parse_path(PathStyle::Expr)?) (None, self.parse_path(PathStyle::Pat)?)
}; };
let hi = self.prev_token.span; let hi = self.prev_token.span;
Ok(self.mk_expr(lo.to(hi), ExprKind::Path(qself, path))) Ok(self.mk_expr(lo.to(hi), ExprKind::Path(qself, path)))

View file

@ -1,5 +1,6 @@
use super::ty::{AllowPlus, RecoverQPath, RecoverReturnSign}; use super::ty::{AllowPlus, RecoverQPath, RecoverReturnSign};
use super::{Parser, Restrictions, TokenType}; use super::{Parser, Restrictions, TokenType};
use crate::errors::PathSingleColon;
use crate::{errors, maybe_whole}; use crate::{errors, maybe_whole};
use rustc_ast::ptr::P; use rustc_ast::ptr::P;
use rustc_ast::token::{self, Delimiter, Token, TokenKind}; use rustc_ast::token::{self, Delimiter, Token, TokenKind};
@ -8,7 +9,7 @@
AssocConstraintKind, BlockCheckMode, GenericArg, GenericArgs, Generics, ParenthesizedArgs, AssocConstraintKind, BlockCheckMode, GenericArg, GenericArgs, Generics, ParenthesizedArgs,
Path, PathSegment, QSelf, Path, PathSegment, QSelf,
}; };
use rustc_errors::{Applicability, PResult}; use rustc_errors::{Applicability, IntoDiagnostic, PResult};
use rustc_span::source_map::{BytePos, Span}; use rustc_span::source_map::{BytePos, Span};
use rustc_span::symbol::{kw, sym, Ident}; use rustc_span::symbol::{kw, sym, Ident};
use std::mem; use std::mem;
@ -24,7 +25,19 @@ pub enum PathStyle {
/// In all such contexts the non-path interpretation is preferred by default for practical /// In all such contexts the non-path interpretation is preferred by default for practical
/// reasons, but the path interpretation can be forced by the disambiguator `::`, e.g. /// reasons, but the path interpretation can be forced by the disambiguator `::`, e.g.
/// `x<y>` - comparisons, `x::<y>` - unambiguously a path. /// `x<y>` - comparisons, `x::<y>` - unambiguously a path.
///
/// Also, a path may never be followed by a `:`. This means that we can eagerly recover if
/// we encounter it.
Expr, Expr,
/// The same as `Expr`, but may be followed by a `:`.
/// For example, this code:
/// ```rust
/// struct S;
///
/// let S: S;
/// // ^ Followed by a `:`
/// ```
Pat,
/// In other contexts, notably in types, no ambiguity exists and paths can be written /// In other contexts, notably in types, no ambiguity exists and paths can be written
/// without the disambiguator, e.g., `x<y>` - unambiguously a path. /// without the disambiguator, e.g., `x<y>` - unambiguously a path.
/// Paths with disambiguators are still accepted, `x::<Y>` - unambiguously a path too. /// Paths with disambiguators are still accepted, `x::<Y>` - unambiguously a path too.
@ -38,6 +51,12 @@ pub enum PathStyle {
Mod, Mod,
} }
impl PathStyle {
fn has_generic_ambiguity(&self) -> bool {
matches!(self, Self::Expr | Self::Pat)
}
}
impl<'a> Parser<'a> { impl<'a> Parser<'a> {
/// Parses a qualified path. /// Parses a qualified path.
/// Assumes that the leading `<` has been parsed already. /// Assumes that the leading `<` has been parsed already.
@ -183,7 +202,6 @@ pub(super) fn parse_path_inner(
segments.push(PathSegment::path_root(lo.shrink_to_lo().with_ctxt(mod_sep_ctxt))); segments.push(PathSegment::path_root(lo.shrink_to_lo().with_ctxt(mod_sep_ctxt)));
} }
self.parse_path_segments(&mut segments, style, ty_generics)?; self.parse_path_segments(&mut segments, style, ty_generics)?;
Ok(Path { segments, span: lo.to(self.prev_token.span), tokens: None }) Ok(Path { segments, span: lo.to(self.prev_token.span), tokens: None })
} }
@ -195,7 +213,7 @@ pub(super) fn parse_path_segments(
) -> PResult<'a, ()> { ) -> PResult<'a, ()> {
loop { loop {
let segment = self.parse_path_segment(style, ty_generics)?; let segment = self.parse_path_segment(style, ty_generics)?;
if style == PathStyle::Expr { if style.has_generic_ambiguity() {
// In order to check for trailing angle brackets, we must have finished // In order to check for trailing angle brackets, we must have finished
// recursing (`parse_path_segment` can indirectly call this function), // recursing (`parse_path_segment` can indirectly call this function),
// that is, the next token must be the highlighted part of the below example: // that is, the next token must be the highlighted part of the below example:
@ -217,6 +235,29 @@ pub(super) fn parse_path_segments(
segments.push(segment); segments.push(segment);
if self.is_import_coupler() || !self.eat(&token::ModSep) { if self.is_import_coupler() || !self.eat(&token::ModSep) {
if style == PathStyle::Expr
&& self.may_recover()
&& self.token == token::Colon
&& self.look_ahead(1, |token| token.is_ident() && !token.is_reserved_ident())
{
// Emit a special error message for `a::b:c` to help users
// otherwise, `a: c` might have meant to introduce a new binding
if self.token.span.lo() == self.prev_token.span.hi()
&& self.look_ahead(1, |token| self.token.span.hi() == token.span.lo())
{
self.bump(); // bump past the colon
self.sess.emit_err(PathSingleColon {
span: self.prev_token.span,
type_ascription: self
.sess
.unstable_features
.is_nightly_build()
.then_some(()),
});
}
continue;
}
return Ok(()); return Ok(());
} }
} }
@ -270,8 +311,25 @@ pub(super) fn parse_path_segment(
ty_generics, ty_generics,
)?; )?;
self.expect_gt().map_err(|mut err| { self.expect_gt().map_err(|mut err| {
// Try to recover a `:` into a `::`
if self.token == token::Colon
&& self.look_ahead(1, |token| {
token.is_ident() && !token.is_reserved_ident()
})
{
err.cancel();
err = PathSingleColon {
span: self.token.span,
type_ascription: self
.sess
.unstable_features
.is_nightly_build()
.then_some(()),
}
.into_diagnostic(self.diagnostic());
}
// Attempt to find places where a missing `>` might belong. // Attempt to find places where a missing `>` might belong.
if let Some(arg) = args else if let Some(arg) = args
.iter() .iter()
.rev() .rev()
.find(|arg| !matches!(arg, AngleBracketedArg::Constraint(_))) .find(|arg| !matches!(arg, AngleBracketedArg::Constraint(_)))

View file

@ -10,6 +10,8 @@
use crate::errors; use crate::errors;
use crate::maybe_whole; use crate::maybe_whole;
use crate::errors::MalformedLoopLabel;
use ast::Label;
use rustc_ast as ast; use rustc_ast as ast;
use rustc_ast::ptr::P; use rustc_ast::ptr::P;
use rustc_ast::token::{self, Delimiter, TokenKind}; use rustc_ast::token::{self, Delimiter, TokenKind};
@ -19,7 +21,8 @@
use rustc_ast::{StmtKind, DUMMY_NODE_ID}; use rustc_ast::{StmtKind, DUMMY_NODE_ID};
use rustc_errors::{Applicability, DiagnosticBuilder, ErrorGuaranteed, PResult}; use rustc_errors::{Applicability, DiagnosticBuilder, ErrorGuaranteed, PResult};
use rustc_span::source_map::{BytePos, Span}; use rustc_span::source_map::{BytePos, Span};
use rustc_span::symbol::{kw, sym}; use rustc_span::symbol::{kw, sym, Ident};
use std::mem; use std::mem;
use thin_vec::{thin_vec, ThinVec}; use thin_vec::{thin_vec, ThinVec};
@ -186,7 +189,7 @@ fn parse_stmt_mac(&mut self, lo: Span, attrs: AttrVec, path: ast::Path) -> PResu
_ => MacStmtStyle::NoBraces, _ => MacStmtStyle::NoBraces,
}; };
let mac = P(MacCall { path, args, prior_type_ascription: self.last_type_ascription }); let mac = P(MacCall { path, args });
let kind = if (style == MacStmtStyle::Braces let kind = if (style == MacStmtStyle::Braces
&& self.token != token::Dot && self.token != token::Dot
@ -546,10 +549,36 @@ pub(crate) fn parse_block_tail(
} }
let stmt = match self.parse_full_stmt(recover) { let stmt = match self.parse_full_stmt(recover) {
Err(mut err) if recover.yes() => { Err(mut err) if recover.yes() => {
self.maybe_annotate_with_ascription(&mut err, false);
if let Some(ref mut snapshot) = snapshot { if let Some(ref mut snapshot) = snapshot {
snapshot.recover_diff_marker(); snapshot.recover_diff_marker();
} }
if self.token == token::Colon {
// if next token is following a colon, it's likely a path
// and we can suggest a path separator
let ident_span = self.prev_token.span;
self.bump();
if self.token.span.lo() == self.prev_token.span.hi() {
err.span_suggestion_verbose(
self.prev_token.span,
"maybe write a path separator here",
"::",
Applicability::MaybeIncorrect,
);
}
if self.look_ahead(1, |token| token == &token::Eq) {
err.span_suggestion_verbose(
ident_span.shrink_to_lo(),
"you might have meant to introduce a new binding",
"let ",
Applicability::MaybeIncorrect,
);
}
if self.sess.unstable_features.is_nightly_build() {
// FIXME(Nilstrieb): Remove this again after a few months.
err.note("type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>");
}
}
err.emit(); err.emit();
self.recover_stmt_(SemiColonMode::Ignore, BlockMode::Ignore); self.recover_stmt_(SemiColonMode::Ignore, BlockMode::Ignore);
Some(self.mk_stmt_err(self.token.span)) Some(self.mk_stmt_err(self.token.span))
@ -580,19 +609,25 @@ pub fn parse_full_stmt(
}; };
let mut eat_semi = true; let mut eat_semi = true;
let mut add_semi_to_stmt = false;
match &mut stmt.kind { match &mut stmt.kind {
// Expression without semicolon. // Expression without semicolon.
StmtKind::Expr(expr) StmtKind::Expr(expr)
if self.token != token::Eof && classify::expr_requires_semi_to_be_stmt(expr) => { if self.token != token::Eof && classify::expr_requires_semi_to_be_stmt(expr) => {
// Just check for errors and recover; do not eat semicolon yet. // Just check for errors and recover; do not eat semicolon yet.
// `expect_one_of` returns PResult<'a, bool /* recovered */> // `expect_one_of` returns PResult<'a, bool /* recovered */>
let replace_with_err =
match self.expect_one_of(&[], &[token::Semi, token::CloseDelim(Delimiter::Brace)]) { let expect_result = self.expect_one_of(&[], &[token::Semi, token::CloseDelim(Delimiter::Brace)]);
let replace_with_err = 'break_recover: {
match expect_result {
// Recover from parser, skip type error to avoid extra errors. // Recover from parser, skip type error to avoid extra errors.
Ok(true) => true, Ok(true) => true,
Err(mut e) => { Err(mut e) => {
if let TokenKind::DocComment(..) = self.token.kind && if let TokenKind::DocComment(..) = self.token.kind
let Ok(snippet) = self.span_to_snippet(self.token.span) { && let Ok(snippet) = self.span_to_snippet(self.token.span)
{
let sp = self.token.span; let sp = self.token.span;
let marker = &snippet[..3]; let marker = &snippet[..3];
let (comment_marker, doc_comment_marker) = marker.split_at(2); let (comment_marker, doc_comment_marker) = marker.split_at(2);
@ -606,21 +641,72 @@ pub fn parse_full_stmt(
format!("{} {}", comment_marker, doc_comment_marker), format!("{} {}", comment_marker, doc_comment_marker),
Applicability::MaybeIncorrect, Applicability::MaybeIncorrect,
); );
}
if let Err(mut e) =
self.check_mistyped_turbofish_with_multiple_type_params(e, expr)
{
if recover.no() {
return Err(e);
} }
e.emit();
self.recover_stmt(); if self.recover_colon_as_semi() {
// recover_colon_as_semi has already emitted a nicer error.
e.delay_as_bug();
add_semi_to_stmt = true;
eat_semi = false;
break 'break_recover false;
}
match &expr.kind {
ExprKind::Path(None, ast::Path { segments, .. }) if segments.len() == 1 => {
if self.token == token::Colon
&& self.look_ahead(1, |token| {
token.is_whole_block() || matches!(
token.kind,
token::Ident(kw::For | kw::Loop | kw::While, false)
| token::OpenDelim(Delimiter::Brace)
)
})
{
let snapshot = self.create_snapshot_for_diagnostic();
let label = Label {
ident: Ident::from_str_and_span(
&format!("'{}", segments[0].ident),
segments[0].ident.span,
),
};
match self.parse_expr_labeled(label, false) {
Ok(labeled_expr) => {
e.delay_as_bug();
self.sess.emit_err(MalformedLoopLabel {
span: label.ident.span,
correct_label: label.ident,
});
*expr = labeled_expr;
break 'break_recover false;
}
Err(err) => {
err.cancel();
self.restore_snapshot(snapshot);
}
}
}
}
_ => {}
}
if let Err(mut e) =
self.check_mistyped_turbofish_with_multiple_type_params(e, expr)
{
if recover.no() {
return Err(e);
}
e.emit();
self.recover_stmt();
}
true
} }
true Ok(false) => false
} }
_ => false
}; };
if replace_with_err { if replace_with_err {
// We already emitted an error, so don't emit another type error // We already emitted an error, so don't emit another type error
let sp = expr.span.to(self.prev_token.span); let sp = expr.span.to(self.prev_token.span);
@ -643,9 +729,10 @@ pub fn parse_full_stmt(
StmtKind::Empty | StmtKind::Item(_) | StmtKind::Local(_) | StmtKind::Semi(_) => eat_semi = false, StmtKind::Empty | StmtKind::Item(_) | StmtKind::Local(_) | StmtKind::Semi(_) => eat_semi = false,
} }
if eat_semi && self.eat(&token::Semi) { if add_semi_to_stmt || (eat_semi && self.eat(&token::Semi)) {
stmt = stmt.add_trailing_semicolon(); stmt = stmt.add_trailing_semicolon();
} }
stmt.span = stmt.span.to(self.prev_token.span); stmt.span = stmt.span.to(self.prev_token.span);
Ok(Some(stmt)) Ok(Some(stmt))
} }

View file

@ -317,7 +317,6 @@ fn parse_ty_common(
let msg = format!("expected type, found {}", super::token_descr(&self.token)); let msg = format!("expected type, found {}", super::token_descr(&self.token));
let mut err = self.struct_span_err(self.token.span, &msg); let mut err = self.struct_span_err(self.token.span, &msg);
err.span_label(self.token.span, "expected type"); err.span_label(self.token.span, "expected type");
self.maybe_annotate_with_ascription(&mut err, true);
return Err(err); return Err(err);
}; };
@ -651,11 +650,7 @@ fn parse_path_start_ty(
let path = self.parse_path_inner(PathStyle::Type, ty_generics)?; let path = self.parse_path_inner(PathStyle::Type, ty_generics)?;
if self.eat(&token::Not) { if self.eat(&token::Not) {
// Macro invocation in type position // Macro invocation in type position
Ok(TyKind::MacCall(P(MacCall { Ok(TyKind::MacCall(P(MacCall { path, args: self.parse_delim_args()? })))
path,
args: self.parse_delim_args()?,
prior_type_ascription: self.last_type_ascription,
})))
} else if allow_plus == AllowPlus::Yes && self.check_plus() { } else if allow_plus == AllowPlus::Yes && self.check_plus() {
// `Trait1 + Trait2 + 'a` // `Trait1 + Trait2 + 'a`
self.parse_remaining_bounds_path(ThinVec::new(), path, lo, true) self.parse_remaining_bounds_path(ThinVec::new(), path, lo, true)

View file

@ -1345,7 +1345,13 @@ pub(crate) fn resolve_path_with_ribs(
ribs: Option<&PerNS<Vec<Rib<'a>>>>, ribs: Option<&PerNS<Vec<Rib<'a>>>>,
ignore_binding: Option<&'a NameBinding<'a>>, ignore_binding: Option<&'a NameBinding<'a>>,
) -> PathResult<'a> { ) -> PathResult<'a> {
debug!("resolve_path(path={:?}, opt_ns={:?}, finalize={:?})", path, opt_ns, finalize); debug!(
"resolve_path(path={:?}, opt_ns={:?}, finalize={:?}) path_len: {}",
path,
opt_ns,
finalize,
path.len()
);
let mut module = None; let mut module = None;
let mut allow_super = true; let mut allow_super = true;

View file

@ -548,9 +548,6 @@ struct DiagnosticMetadata<'ast> {
/// they are used (in a `break` or `continue` statement) /// they are used (in a `break` or `continue` statement)
unused_labels: FxHashMap<NodeId, Span>, unused_labels: FxHashMap<NodeId, Span>,
/// Only used for better errors on `fn(): fn()`.
current_type_ascription: Vec<Span>,
/// Only used for better errors on `let x = { foo: bar };`. /// Only used for better errors on `let x = { foo: bar };`.
/// In the case of a parse error with `let x = { foo: bar, };`, this isn't needed, it's only /// In the case of a parse error with `let x = { foo: bar, };`, this isn't needed, it's only
/// needed for cases where this parses as a correct type ascription. /// needed for cases where this parses as a correct type ascription.
@ -4064,17 +4061,8 @@ fn resolve_expr(&mut self, expr: &'ast Expr, parent: Option<&'ast Expr>) {
} }
} }
} }
ExprKind::Type(ref type_expr, ref ty) => { ExprKind::Type(ref _type_expr, ref _ty) => {
// `ParseSess::type_ascription_path_suggestions` keeps spans of colon tokens in
// type ascription. Here we are trying to retrieve the span of the colon token as
// well, but only if it's written without spaces `expr:Ty` and therefore confusable
// with `expr::Ty`, only in this case it will match the span from
// `type_ascription_path_suggestions`.
self.diagnostic_metadata
.current_type_ascription
.push(type_expr.span.between(ty.span));
visit::walk_expr(self, expr); visit::walk_expr(self, expr);
self.diagnostic_metadata.current_type_ascription.pop();
} }
// `async |x| ...` gets desugared to `|x| async {...}`, so we need to // `async |x| ...` gets desugared to `|x| async {...}`, so we need to
// resolve the arguments within the proper scopes so that usages of them inside the // resolve the arguments within the proper scopes so that usages of them inside the

View file

@ -28,7 +28,7 @@
use rustc_span::edition::Edition; use rustc_span::edition::Edition;
use rustc_span::hygiene::MacroKind; use rustc_span::hygiene::MacroKind;
use rustc_span::symbol::{kw, sym, Ident, Symbol}; use rustc_span::symbol::{kw, sym, Ident, Symbol};
use rustc_span::{BytePos, Span}; use rustc_span::Span;
use std::iter; use std::iter;
use std::ops::Deref; use std::ops::Deref;
@ -350,18 +350,15 @@ pub(crate) fn smart_resolve_report_errors(
return (err, candidates); return (err, candidates);
} }
if !self.type_ascription_suggestion(&mut err, base_error.span) { let mut fallback = self.suggest_trait_and_bounds(&mut err, source, res, span, &base_error);
let mut fallback =
self.suggest_trait_and_bounds(&mut err, source, res, span, &base_error);
// if we have suggested using pattern matching, then don't add needless suggestions // if we have suggested using pattern matching, then don't add needless suggestions
// for typos. // for typos.
fallback |= self.suggest_typo(&mut err, source, path, span, &base_error); fallback |= self.suggest_typo(&mut err, source, path, span, &base_error);
if fallback { if fallback {
// Fallback label. // Fallback label.
err.span_label(base_error.span, &base_error.fallback_label); err.span_label(base_error.span, &base_error.fallback_label);
}
} }
self.err_code_special_cases(&mut err, source, path, span); self.err_code_special_cases(&mut err, source, path, span);
@ -494,24 +491,6 @@ fn try_lookup_name_relaxed(
.filter(|(_, enum_ty_path)| !enum_ty_path.starts_with("std::prelude::")) .filter(|(_, enum_ty_path)| !enum_ty_path.starts_with("std::prelude::"))
.collect(); .collect();
if !enum_candidates.is_empty() { if !enum_candidates.is_empty() {
if let (PathSource::Type, Some(span)) =
(source, self.diagnostic_metadata.current_type_ascription.last())
{
if self
.r
.tcx
.sess
.parse_sess
.type_ascription_path_suggestions
.borrow()
.contains(span)
{
// Already reported this issue on the lhs of the type ascription.
err.downgrade_to_delayed_bug();
return (true, candidates);
}
}
enum_candidates.sort(); enum_candidates.sort();
// Contextualize for E0412 "cannot find type", but don't belabor the point // Contextualize for E0412 "cannot find type", but don't belabor the point
@ -1393,26 +1372,6 @@ fn smart_resolve_context_dependent_help(
Res::Def(DefKind::Enum, def_id), Res::Def(DefKind::Enum, def_id),
PathSource::TupleStruct(..) | PathSource::Expr(..), PathSource::TupleStruct(..) | PathSource::Expr(..),
) => { ) => {
if self
.diagnostic_metadata
.current_type_ascription
.last()
.map(|sp| {
self.r
.tcx
.sess
.parse_sess
.type_ascription_path_suggestions
.borrow()
.contains(&sp)
})
.unwrap_or(false)
{
err.downgrade_to_delayed_bug();
// We already suggested changing `:` into `::` during parsing.
return false;
}
self.suggest_using_enum_variant(err, source, def_id, span); self.suggest_using_enum_variant(err, source, def_id, span);
} }
(Res::Def(DefKind::Struct, def_id), source) if ns == ValueNS => { (Res::Def(DefKind::Struct, def_id), source) if ns == ValueNS => {
@ -1817,80 +1776,6 @@ fn likely_rust_type(path: &[Segment]) -> Option<Symbol> {
}) })
} }
/// Only used in a specific case of type ascription suggestions
fn get_colon_suggestion_span(&self, start: Span) -> Span {
let sm = self.r.tcx.sess.source_map();
start.to(sm.next_point(start))
}
fn type_ascription_suggestion(&self, err: &mut Diagnostic, base_span: Span) -> bool {
let sm = self.r.tcx.sess.source_map();
let base_snippet = sm.span_to_snippet(base_span);
if let Some(&sp) = self.diagnostic_metadata.current_type_ascription.last() {
if let Ok(snippet) = sm.span_to_snippet(sp) {
let len = snippet.trim_end().len() as u32;
if snippet.trim() == ":" {
let colon_sp =
sp.with_lo(sp.lo() + BytePos(len - 1)).with_hi(sp.lo() + BytePos(len));
let mut show_label = true;
if sm.is_multiline(sp) {
err.span_suggestion_short(
colon_sp,
"maybe you meant to write `;` here",
";",
Applicability::MaybeIncorrect,
);
} else {
let after_colon_sp =
self.get_colon_suggestion_span(colon_sp.shrink_to_hi());
if snippet.len() == 1 {
// `foo:bar`
err.span_suggestion(
colon_sp,
"maybe you meant to write a path separator here",
"::",
Applicability::MaybeIncorrect,
);
show_label = false;
if !self
.r
.tcx
.sess
.parse_sess
.type_ascription_path_suggestions
.borrow_mut()
.insert(colon_sp)
{
err.downgrade_to_delayed_bug();
}
}
if let Ok(base_snippet) = base_snippet {
// Try to find an assignment
let eq_span = sm.span_look_ahead(after_colon_sp, Some("="), Some(50));
if let Ok(ref snippet) = sm.span_to_snippet(eq_span) && snippet == "=" {
err.span_suggestion(
base_span,
"maybe you meant to write an assignment here",
format!("let {}", base_snippet),
Applicability::MaybeIncorrect,
);
show_label = false;
}
}
}
if show_label {
err.span_label(
base_span,
"expecting a type here because of type ascription",
);
}
return show_label;
}
}
}
false
}
// try to give a suggestion for this pattern: `name = blah`, which is common in other languages // try to give a suggestion for this pattern: `name = blah`, which is common in other languages
// suggest `let name = blah` to introduce a new binding // suggest `let name = blah` to introduce a new binding
fn let_binding_suggestion(&mut self, err: &mut Diagnostic, ident_span: Span) -> bool { fn let_binding_suggestion(&mut self, err: &mut Diagnostic, ident_span: Span) -> bool {

View file

@ -214,8 +214,6 @@ pub struct ParseSess {
pub env_depinfo: Lock<FxHashSet<(Symbol, Option<Symbol>)>>, pub env_depinfo: Lock<FxHashSet<(Symbol, Option<Symbol>)>>,
/// File paths accessed during the build. /// File paths accessed during the build.
pub file_depinfo: Lock<FxHashSet<Symbol>>, pub file_depinfo: Lock<FxHashSet<Symbol>>,
/// All the type ascriptions expressions that have had a suggestion for likely path typo.
pub type_ascription_path_suggestions: Lock<FxHashSet<Span>>,
/// Whether cfg(version) should treat the current release as incomplete /// Whether cfg(version) should treat the current release as incomplete
pub assume_incomplete_release: bool, pub assume_incomplete_release: bool,
/// Spans passed to `proc_macro::quote_span`. Each span has a numerical /// Spans passed to `proc_macro::quote_span`. Each span has a numerical
@ -258,7 +256,6 @@ pub fn with_span_handler(handler: Handler, source_map: Lrc<SourceMap>) -> Self {
reached_eof: AtomicBool::new(false), reached_eof: AtomicBool::new(false),
env_depinfo: Default::default(), env_depinfo: Default::default(),
file_depinfo: Default::default(), file_depinfo: Default::default(),
type_ascription_path_suggestions: Default::default(),
assume_incomplete_release: false, assume_incomplete_release: false,
proc_macro_quoted_spans: Default::default(), proc_macro_quoted_spans: Default::default(),
attr_id_generator: AttrIdGenerator::new(), attr_id_generator: AttrIdGenerator::new(),

View file

@ -163,7 +163,8 @@ fn hir_from_snippet(expr: &hir::Expr<'_>, get_snippet: impl Fn(Span) -> Cow<'a,
get_snippet(rhs.span), get_snippet(rhs.span),
), ),
hir::ExprKind::Cast(lhs, ty) => Sugg::BinOp(AssocOp::As, get_snippet(lhs.span), get_snippet(ty.span)), hir::ExprKind::Cast(lhs, ty) => Sugg::BinOp(AssocOp::As, get_snippet(lhs.span), get_snippet(ty.span)),
hir::ExprKind::Type(lhs, ty) => Sugg::BinOp(AssocOp::Colon, get_snippet(lhs.span), get_snippet(ty.span)), //FIXME(chenyukang), remove this after type ascription is removed from AST
hir::ExprKind::Type(lhs, ty) => Sugg::BinOp(AssocOp::As, get_snippet(lhs.span), get_snippet(ty.span)),
} }
} }
@ -258,8 +259,9 @@ pub fn ast(
snippet_with_context(cx, lhs.span, ctxt, default, app).0, snippet_with_context(cx, lhs.span, ctxt, default, app).0,
snippet_with_context(cx, ty.span, ctxt, default, app).0, snippet_with_context(cx, ty.span, ctxt, default, app).0,
), ),
//FIXME(chenyukang), remove this after type ascription is removed from AST
ast::ExprKind::Type(ref lhs, ref ty) => Sugg::BinOp( ast::ExprKind::Type(ref lhs, ref ty) => Sugg::BinOp(
AssocOp::Colon, AssocOp::As,
snippet_with_context(cx, lhs.span, ctxt, default, app).0, snippet_with_context(cx, lhs.span, ctxt, default, app).0,
snippet_with_context(cx, ty.span, ctxt, default, app).0, snippet_with_context(cx, ty.span, ctxt, default, app).0,
), ),
@ -392,7 +394,6 @@ fn binop_to_string(op: AssocOp, lhs: &str, rhs: &str) -> String {
AssocOp::As => format!("{lhs} as {rhs}"), AssocOp::As => format!("{lhs} as {rhs}"),
AssocOp::DotDot => format!("{lhs}..{rhs}"), AssocOp::DotDot => format!("{lhs}..{rhs}"),
AssocOp::DotDotEq => format!("{lhs}..={rhs}"), AssocOp::DotDotEq => format!("{lhs}..={rhs}"),
AssocOp::Colon => format!("{lhs}: {rhs}"),
} }
} }
@ -602,13 +603,13 @@ enum Associativity {
#[must_use] #[must_use]
fn associativity(op: AssocOp) -> Associativity { fn associativity(op: AssocOp) -> Associativity {
use rustc_ast::util::parser::AssocOp::{ use rustc_ast::util::parser::AssocOp::{
Add, As, Assign, AssignOp, BitAnd, BitOr, BitXor, Colon, Divide, DotDot, DotDotEq, Equal, Greater, Add, As, Assign, AssignOp, BitAnd, BitOr, BitXor, Divide, DotDot, DotDotEq, Equal, Greater,
GreaterEqual, LAnd, LOr, Less, LessEqual, Modulus, Multiply, NotEqual, ShiftLeft, ShiftRight, Subtract, GreaterEqual, LAnd, LOr, Less, LessEqual, Modulus, Multiply, NotEqual, ShiftLeft, ShiftRight, Subtract,
}; };
match op { match op {
Assign | AssignOp(_) => Associativity::Right, Assign | AssignOp(_) => Associativity::Right,
Add | BitAnd | BitOr | BitXor | LAnd | LOr | Multiply | As | Colon => Associativity::Both, Add | BitAnd | BitOr | BitXor | LAnd | LOr | Multiply | As => Associativity::Both,
Divide | Equal | Greater | GreaterEqual | Less | LessEqual | Modulus | NotEqual | ShiftLeft | ShiftRight Divide | Equal | Greater | GreaterEqual | Less | LessEqual | Modulus | NotEqual | ShiftLeft | ShiftRight
| Subtract => Associativity::Left, | Subtract => Associativity::Left,
DotDot | DotDotEq => Associativity::None, DotDot | DotDotEq => Associativity::None,

View file

@ -1,10 +0,0 @@
fn main() {
let xxxxxxxxxxx = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy : SomeTrait<AA, BB, CC>;
let xxxxxxxxxxxxxxx = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;
let z = funk(yyyyyyyyyyyyyyy, zzzzzzzzzzzzzzzz, wwwwww): AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;
x : u32 - 1u32 / 10f32 : u32
}

View file

@ -1,10 +1,6 @@
// rustfmt-format_macro_bodies: true // rustfmt-format_macro_bodies: true
macro_rules! foo { macro_rules! foo {
($a: ident : $b: ty) => { ($a: ident : $b: ty) => { $a(42): $b; };
$a(42): $b; ($a: ident $b: ident $c: ident) => { $a=$b+$c; };
};
($a: ident $b: ident $c: ident) => {
$a = $b + $c;
};
} }

View file

@ -1,10 +1,6 @@
// rustfmt-format_macro_matchers: false // rustfmt-format_macro_matchers: false
macro_rules! foo { macro_rules! foo {
($a: ident : $b: ty) => { ($a: ident : $b: ty) => { $a(42): $b; };
$a(42): $b; ($a: ident $b: ident $c: ident) => { $a=$b+$c; };
};
($a: ident $b: ident $c: ident) => {
$a = $b + $c;
};
} }

View file

@ -1,10 +1,6 @@
// rustfmt-format_macro_matchers: true // rustfmt-format_macro_matchers: true
macro_rules! foo { macro_rules! foo {
($a:ident : $b:ty) => { ($a: ident : $b: ty) => { $a(42): $b; };
$a(42): $b; ($a: ident $b: ident $c: ident) => { $a=$b+$c; };
};
($a:ident $b:ident $c:ident) => {
$a = $b + $c;
};
} }

View file

@ -122,7 +122,7 @@ fn main() {
20, 21, 22); 20, 21, 22);
// #1092 // #1092
chain!(input, a: take!(max_size), || []); chain!(input, a:take!(max_size), || []);
// #2727 // #2727
foo!("bar"); foo!("bar");
@ -156,17 +156,13 @@ macro_rules! foo {
} }
fn issue1739() { fn issue1739() {
sql_function!( sql_function!(add_rss_item,
add_rss_item, add_rss_item_t,
add_rss_item_t, (a: types::Integer,
( b: types::Timestamptz,
a: types::Integer, c: types::Text,
b: types::Timestamptz, d: types::Text,
c: types::Text, e: types::Text));
d: types::Text,
e: types::Text
)
);
w.slice_mut(s![ w.slice_mut(s![
.., ..,
@ -232,7 +228,7 @@ fn issue_3174() {
"debugMessage": debug.message, "debugMessage": debug.message,
}) })
} else { } else {
json!({ "errorKind": format!("{:?}", error.err_kind()) }) json!({"errorKind": format!("{:?}", error.err_kind())})
}; };
} }

View file

@ -1,12 +0,0 @@
fn main() {
let xxxxxxxxxxx =
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy: SomeTrait<AA, BB, CC>;
let xxxxxxxxxxxxxxx =
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;
let z = funk(yyyyyyyyyyyyyyy, zzzzzzzzzzzzzzzz, wwwwww):
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;
x: u32 - 1u32 / 10f32: u32
}

View file

@ -129,7 +129,7 @@ fn issue3117() {
fn issue3139() { fn issue3139() {
assert_eq!( assert_eq!(
to_json_value(&None::<i32>).unwrap(), to_json_value(&None::<i32>).unwrap(),
json!({ "test": None::<i32> }) json!( { "test": None :: <i32> } )
); );
} }

View file

@ -9,6 +9,6 @@
macro_rules! static_assert { macro_rules! static_assert {
($test:expr) => { ($test:expr) => {
#[allow(dead_code)] #[allow(dead_code)]
const _: () = [()][!($test: bool) as usize]; const _: () = [()][!($test) as usize];
} }
} }

View file

@ -65,6 +65,7 @@ error: unexpected `,` in pattern
LL | let women, men: (Vec<Genome>, Vec<Genome>) = genomes.iter().cloned() LL | let women, men: (Vec<Genome>, Vec<Genome>) = genomes.iter().cloned()
| ^ | ^
| |
= note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
help: try adding parentheses to match on a tuple help: try adding parentheses to match on a tuple
| |
LL | let (women, men): (Vec<Genome>, Vec<Genome>) = genomes.iter().cloned() LL | let (women, men): (Vec<Genome>, Vec<Genome>) = genomes.iter().cloned()

View file

@ -1,5 +1,5 @@
// Type ascription is unstable // Type ascription is unstable
fn main() { fn main() {
let a = 10: u8; //~ ERROR type ascription is experimental let a = type_ascribe!(10, u8); //~ ERROR use of unstable library feature 'type_ascription': placeholder syntax for type ascription
} }

View file

@ -1,8 +1,8 @@
error[E0658]: type ascription is experimental error[E0658]: use of unstable library feature 'type_ascription': placeholder syntax for type ascription
--> $DIR/feature-gate-type_ascription.rs:4:13 --> $DIR/feature-gate-type_ascription.rs:4:13
| |
LL | let a = 10: u8; LL | let a = type_ascribe!(10, u8);
| ^^^^^^ | ^^^^^^^^^^^^
| |
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information = note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
= help: add `#![feature(type_ascription)]` to the crate attributes to enable = help: add `#![feature(type_ascription)]` to the crate attributes to enable

View file

@ -5,9 +5,6 @@ trait X {
const _: () = { const _: () = {
fn f1<'a>(arg : Box<dyn X< : 32 >>) {} fn f1<'a>(arg : Box<dyn X< : 32 >>) {}
//~^ ERROR: expected one of `>`, a const expression, lifetime, or type, found `:` //~^ ERROR: expected one of `>`, a const expression, lifetime, or type, found `:`
//~| ERROR: expected parameter name, found `>`
//~| ERROR: expected one of `!`, `)`, `+`, `,`, or `::`, found `>`
//~| ERROR: constant provided when a type was expected
}; };
const _: () = { const _: () = {

View file

@ -3,41 +3,14 @@ error: expected one of `>`, a const expression, lifetime, or type, found `:`
| |
LL | fn f1<'a>(arg : Box<dyn X< : 32 >>) {} LL | fn f1<'a>(arg : Box<dyn X< : 32 >>) {}
| ^ expected one of `>`, a const expression, lifetime, or type | ^ expected one of `>`, a const expression, 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:6: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:6:36
|
LL | fn f1<'a>(arg : Box<dyn X< : 32 >>) {}
| ^
| |
| expected one of `!`, `)`, `+`, `,`, or `::`
| help: missing `,`
error: expected one of `>`, a const expression, lifetime, or type, found `=` error: expected one of `>`, a const expression, lifetime, or type, found `=`
--> $DIR/trait-path-missing-gen_arg.rs:14:30 --> $DIR/trait-path-missing-gen_arg.rs:11:30
| |
LL | fn f1<'a>(arg : Box<dyn X< = 32 >>) {} LL | fn f1<'a>(arg : Box<dyn X< = 32 >>) {}
| - ^ expected one of `>`, a const expression, lifetime, or type | - ^ expected one of `>`, a const expression, lifetime, or type
| | | |
| maybe try to close unmatched angle bracket | maybe try to close unmatched angle bracket
error[E0747]: constant provided when a type was expected error: aborting due to 2 previous errors
--> $DIR/trait-path-missing-gen_arg.rs:6:23
|
LL | fn f1<'a>(arg : Box<dyn X< : 32 >>) {}
| ^^^^^^^^^^^
error: aborting due to 5 previous errors
For more information about this error, try `rustc --explain E0747`.

View file

@ -6,8 +6,8 @@ pub mod bar {
pub struct Foo { pub struct Foo {
a: Vec<foo::bar:A>, a: Vec<foo::bar:A>,
//~^ ERROR expected //~^ ERROR path separator must be a double colon
//~| HELP path separator //~| HELP use a double colon instead
} }
fn main() {} fn main() {}

View file

@ -1,11 +1,12 @@
error: expected one of `,` or `>`, found `:` error: path separator must be a double colon
--> $DIR/single-colon-path-not-const-generics.rs:8:18 --> $DIR/single-colon-path-not-const-generics.rs:8:18
| |
LL | pub struct Foo {
| --- while parsing this struct
LL | a: Vec<foo::bar:A>, LL | a: Vec<foo::bar:A>,
| ^ | ^ help: use a double colon instead: `::`
| | |
| expected one of `,` or `>` = note: if you meant to annotate an expression with a type, the type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
| help: write a path separator here: `::`
error: aborting due to previous error error: aborting due to previous error

View file

@ -1,18 +1,12 @@
#![feature(type_ascription)]
fn main() { fn main() {
let a : usize = 0; let a: usize = 0;
let long_name : usize = 0; let long_name: usize = 0;
println!("{}", a as usize > long_name); println!("{}", a as usize > long_name);
println!("{}", a as usize < long_name); //~ ERROR `<` is interpreted as a start of generic println!("{}", a as usize < long_name); //~ ERROR `<` is interpreted as a start of generic
println!("{}{}", a as usize < long_name, long_name); println!("{}{}", a as usize < long_name, long_name);
//~^ ERROR `<` is interpreted as a start of generic //~^ ERROR `<` is interpreted as a start of generic
println!("{}", a as usize < 4); //~ ERROR `<` is interpreted as a start of generic println!("{}", a as usize < 4); //~ ERROR `<` is interpreted as a start of generic
println!("{}", a: usize > long_name);
println!("{}{}", a: usize < long_name, long_name);
//~^ ERROR `<` is interpreted as a start of generic
println!("{}", a: usize < 4); //~ ERROR `<` is interpreted as a start of generic
println!("{}", a println!("{}", a
as as
@ -30,6 +24,4 @@ fn main() {
5); 5);
println!("{}", a as usize << long_name); //~ ERROR `<<` is interpreted as a start of generic println!("{}", a as usize << long_name); //~ ERROR `<<` is interpreted as a start of generic
println!("{}", a: &mut 4); //~ ERROR expected type, found `4`
} }

View file

@ -1,5 +1,5 @@
error: `<` is interpreted as a start of generic arguments for `usize`, not a comparison error: `<` is interpreted as a start of generic arguments for `usize`, not a comparison
--> $DIR/issue-22644.rs:8:31 --> $DIR/issue-22644.rs:6:31
| |
LL | println!("{}", a as usize < long_name); LL | println!("{}", a as usize < long_name);
| ^ --------- interpreted as generic arguments | ^ --------- interpreted as generic arguments
@ -12,7 +12,7 @@ LL | println!("{}", (a as usize) < long_name);
| + + | + +
error: `<` is interpreted as a start of generic arguments for `usize`, not a comparison error: `<` is interpreted as a start of generic arguments for `usize`, not a comparison
--> $DIR/issue-22644.rs:9:33 --> $DIR/issue-22644.rs:7:33
| |
LL | println!("{}{}", a as usize < long_name, long_name); LL | println!("{}{}", a as usize < long_name, long_name);
| ^ -------------------- interpreted as generic arguments | ^ -------------------- interpreted as generic arguments
@ -25,7 +25,7 @@ LL | println!("{}{}", (a as usize) < long_name, long_name);
| + + | + +
error: `<` is interpreted as a start of generic arguments for `usize`, not a comparison error: `<` is interpreted as a start of generic arguments for `usize`, not a comparison
--> $DIR/issue-22644.rs:11:31 --> $DIR/issue-22644.rs:9:31
| |
LL | println!("{}", a as usize < 4); LL | println!("{}", a as usize < 4);
| ^ - interpreted as generic arguments | ^ - interpreted as generic arguments
@ -38,33 +38,7 @@ LL | println!("{}", (a as usize) < 4);
| + + | + +
error: `<` is interpreted as a start of generic arguments for `usize`, not a comparison error: `<` is interpreted as a start of generic arguments for `usize`, not a comparison
--> $DIR/issue-22644.rs:13:31 --> $DIR/issue-22644.rs:14:20
|
LL | println!("{}{}", a: usize < long_name, long_name);
| ^ -------------------- interpreted as generic arguments
| |
| not interpreted as comparison
|
help: try comparing the cast value
|
LL | println!("{}{}", (a: usize) < long_name, long_name);
| + +
error: `<` is interpreted as a start of generic arguments for `usize`, not a comparison
--> $DIR/issue-22644.rs:15:29
|
LL | println!("{}", a: usize < 4);
| ^ - interpreted as generic arguments
| |
| not interpreted as comparison
|
help: try comparing the cast value
|
LL | println!("{}", (a: usize) < 4);
| + +
error: `<` is interpreted as a start of generic arguments for `usize`, not a comparison
--> $DIR/issue-22644.rs:20:20
| |
LL | < LL | <
| ^ not interpreted as comparison | ^ not interpreted as comparison
@ -79,7 +53,7 @@ LL ~ usize)
| |
error: `<` is interpreted as a start of generic arguments for `usize`, not a comparison error: `<` is interpreted as a start of generic arguments for `usize`, not a comparison
--> $DIR/issue-22644.rs:29:20 --> $DIR/issue-22644.rs:23:20
| |
LL | < LL | <
| ^ not interpreted as comparison | ^ not interpreted as comparison
@ -96,7 +70,7 @@ LL ~ usize)
| |
error: `<<` is interpreted as a start of generic arguments for `usize`, not a shift error: `<<` is interpreted as a start of generic arguments for `usize`, not a shift
--> $DIR/issue-22644.rs:32:31 --> $DIR/issue-22644.rs:26:31
| |
LL | println!("{}", a as usize << long_name); LL | println!("{}", a as usize << long_name);
| ^^ --------- interpreted as generic arguments | ^^ --------- interpreted as generic arguments
@ -108,16 +82,5 @@ help: try shifting the cast value
LL | println!("{}", (a as usize) << long_name); LL | println!("{}", (a as usize) << long_name);
| + + | + +
error: expected type, found `4` error: aborting due to 6 previous errors
--> $DIR/issue-22644.rs:34:28
|
LL | println!("{}", a: &mut 4);
| - ^ expected type
| |
| tried to parse a type due to this type ascription
|
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
error: aborting due to 9 previous errors

View file

@ -134,8 +134,7 @@ fn test_expr() {
assert_eq!(stringify_expr!(expr as T<u8>), "expr as T<u8>"); assert_eq!(stringify_expr!(expr as T<u8>), "expr as T<u8>");
// ExprKind::Type // ExprKind::Type
assert_eq!(stringify_expr!(expr: T), "expr: T"); // There is no syntax for type ascription.
assert_eq!(stringify_expr!(expr: T<u8>), "expr: T<u8>");
// ExprKind::If // ExprKind::If
assert_eq!(stringify_expr!(if true {}), "if true {}"); assert_eq!(stringify_expr!(if true {}), "if true {}");

View file

@ -8,9 +8,12 @@ enum E { A, B }
fn no_top_level_or_patterns() { fn no_top_level_or_patterns() {
// We do *not* allow or-patterns at the top level of lambdas... // We do *not* allow or-patterns at the top level of lambdas...
let _ = |A | B: E| (); //~ ERROR no implementation for `E | ()` let _ = |A | B: E| ();
//~^ ERROR expected identifier, found
// -------- This looks like an or-pattern but is in fact `|A| (B: E | ())`. // -------- This looks like an or-pattern but is in fact `|A| (B: E | ())`.
}
fn no_top_level_or_patterns_2() {
// ...and for now neither do we allow or-patterns at the top level of functions. // ...and for now neither do we allow or-patterns at the top level of functions.
fn fun1(A | B: E) {} fn fun1(A | B: E) {}
//~^ ERROR top-level or-patterns are not allowed //~^ ERROR top-level or-patterns are not allowed

View file

@ -1,43 +1,34 @@
error: expected identifier, found `:`
--> $DIR/or-patterns-syntactic-fail.rs:11:19
|
LL | let _ = |A | B: E| ();
| ^ expected identifier
|
= note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
error: top-level or-patterns are not allowed in function parameters error: top-level or-patterns are not allowed in function parameters
--> $DIR/or-patterns-syntactic-fail.rs:15:13 --> $DIR/or-patterns-syntactic-fail.rs:18:13
| |
LL | fn fun1(A | B: E) {} LL | fn fun1(A | B: E) {}
| ^^^^^ help: wrap the pattern in parentheses: `(A | B)` | ^^^^^ help: wrap the pattern in parentheses: `(A | B)`
error: top-level or-patterns are not allowed in function parameters error: top-level or-patterns are not allowed in function parameters
--> $DIR/or-patterns-syntactic-fail.rs:18:13 --> $DIR/or-patterns-syntactic-fail.rs:21:13
| |
LL | fn fun2(| A | B: E) {} LL | fn fun2(| A | B: E) {}
| ^^^^^^^ help: wrap the pattern in parentheses: `(A | B)` | ^^^^^^^ help: wrap the pattern in parentheses: `(A | B)`
error: top-level or-patterns are not allowed in `let` bindings error: top-level or-patterns are not allowed in `let` bindings
--> $DIR/or-patterns-syntactic-fail.rs:23:9 --> $DIR/or-patterns-syntactic-fail.rs:26:9
| |
LL | let A | B: E = A; LL | let A | B: E = A;
| ^^^^^ help: wrap the pattern in parentheses: `(A | B)` | ^^^^^ help: wrap the pattern in parentheses: `(A | B)`
error: top-level or-patterns are not allowed in `let` bindings error: top-level or-patterns are not allowed in `let` bindings
--> $DIR/or-patterns-syntactic-fail.rs:26:9 --> $DIR/or-patterns-syntactic-fail.rs:29:9
| |
LL | let | A | B: E = A; LL | let | A | B: E = A;
| ^^^^^^^ help: wrap the pattern in parentheses: `(A | B)` | ^^^^^^^ help: wrap the pattern in parentheses: `(A | B)`
error[E0369]: no implementation for `E | ()`
--> $DIR/or-patterns-syntactic-fail.rs:11:22
|
LL | let _ = |A | B: E| ();
| ----^ -- ()
| |
| E
|
note: an implementation of `BitOr<()>` might be missing for `E`
--> $DIR/or-patterns-syntactic-fail.rs:6:1
|
LL | enum E { A, B }
| ^^^^^^ must implement `BitOr<()>`
note: the trait `BitOr` must be implemented
--> $SRC_DIR/core/src/ops/bit.rs:LL:COL
error: aborting due to 5 previous errors error: aborting due to 5 previous errors
For more information about this error, try `rustc --explain E0369`.

View file

@ -6,6 +6,7 @@ fn main() {}
//~^ ERROR expected one of //~^ ERROR expected one of
#[cfg(FALSE)] fn e() { let _ = foo(#![attr]); } #[cfg(FALSE)] fn e() { let _ = foo(#![attr]); }
//~^ ERROR an inner attribute is not permitted in this context //~^ ERROR an inner attribute is not permitted in this context
//~| ERROR an inner attribute is not permitted in this context
//~| ERROR expected expression, found `)` //~| ERROR expected expression, found `)`
#[cfg(FALSE)] fn e() { let _ = x.foo(#![attr]); } #[cfg(FALSE)] fn e() { let _ = x.foo(#![attr]); }
//~^ ERROR an inner attribute is not permitted in this context //~^ ERROR an inner attribute is not permitted in this context

View file

@ -19,6 +19,15 @@ LL | #[cfg(FALSE)] fn e() { let _ = foo(#![attr]); }
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files = note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:7:36
|
LL | #[cfg(FALSE)] fn e() { let _ = foo(#![attr]); }
| ^^^^^^^^
|
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
= note: outer attributes, like `#[test]`, annotate the item following them
error: expected expression, found `)` error: expected expression, found `)`
--> $DIR/attr-stmt-expr-attr-bad.rs:7:44 --> $DIR/attr-stmt-expr-attr-bad.rs:7:44
| |
@ -26,7 +35,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = foo(#![attr]); }
| ^ expected expression | ^ expected expression
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:10:38 --> $DIR/attr-stmt-expr-attr-bad.rs:11:38
| |
LL | #[cfg(FALSE)] fn e() { let _ = x.foo(#![attr]); } LL | #[cfg(FALSE)] fn e() { let _ = x.foo(#![attr]); }
| ^^^^^^^^ | ^^^^^^^^
@ -35,13 +44,13 @@ LL | #[cfg(FALSE)] fn e() { let _ = x.foo(#![attr]); }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: expected expression, found `)` error: expected expression, found `)`
--> $DIR/attr-stmt-expr-attr-bad.rs:10:46 --> $DIR/attr-stmt-expr-attr-bad.rs:11:46
| |
LL | #[cfg(FALSE)] fn e() { let _ = x.foo(#![attr]); } LL | #[cfg(FALSE)] fn e() { let _ = x.foo(#![attr]); }
| ^ expected expression | ^ expected expression
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:13:36 --> $DIR/attr-stmt-expr-attr-bad.rs:14:36
| |
LL | #[cfg(FALSE)] fn e() { let _ = 0 + #![attr] 0; } LL | #[cfg(FALSE)] fn e() { let _ = 0 + #![attr] 0; }
| ^^^^^^^^ | ^^^^^^^^
@ -50,7 +59,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = 0 + #![attr] 0; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:15:33 --> $DIR/attr-stmt-expr-attr-bad.rs:16:33
| |
LL | #[cfg(FALSE)] fn e() { let _ = !#![attr] 0; } LL | #[cfg(FALSE)] fn e() { let _ = !#![attr] 0; }
| ^^^^^^^^ | ^^^^^^^^
@ -59,7 +68,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = !#![attr] 0; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:17:33 --> $DIR/attr-stmt-expr-attr-bad.rs:18:33
| |
LL | #[cfg(FALSE)] fn e() { let _ = -#![attr] 0; } LL | #[cfg(FALSE)] fn e() { let _ = -#![attr] 0; }
| ^^^^^^^^ | ^^^^^^^^
@ -68,13 +77,13 @@ LL | #[cfg(FALSE)] fn e() { let _ = -#![attr] 0; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: expected one of `!`, `.`, `::`, `;`, `?`, `else`, `{`, or an operator, found `#` error: expected one of `!`, `.`, `::`, `;`, `?`, `else`, `{`, or an operator, found `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:19:34 --> $DIR/attr-stmt-expr-attr-bad.rs:20:34
| |
LL | #[cfg(FALSE)] fn e() { let _ = x #![attr] as Y; } LL | #[cfg(FALSE)] fn e() { let _ = x #![attr] as Y; }
| ^ expected one of 8 possible tokens | ^ expected one of 8 possible tokens
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:21:35 --> $DIR/attr-stmt-expr-attr-bad.rs:22:35
| |
LL | #[cfg(FALSE)] fn e() { let _ = || #![attr] foo; } LL | #[cfg(FALSE)] fn e() { let _ = || #![attr] foo; }
| ^^^^^^^^ | ^^^^^^^^
@ -83,7 +92,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = || #![attr] foo; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:23:40 --> $DIR/attr-stmt-expr-attr-bad.rs:24:40
| |
LL | #[cfg(FALSE)] fn e() { let _ = move || #![attr] foo; } LL | #[cfg(FALSE)] fn e() { let _ = move || #![attr] foo; }
| ^^^^^^^^ | ^^^^^^^^
@ -92,7 +101,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = move || #![attr] foo; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:25:35 --> $DIR/attr-stmt-expr-attr-bad.rs:26:35
| |
LL | #[cfg(FALSE)] fn e() { let _ = || #![attr] {foo}; } LL | #[cfg(FALSE)] fn e() { let _ = || #![attr] {foo}; }
| ^^^^^^^^ | ^^^^^^^^
@ -101,7 +110,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = || #![attr] {foo}; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:27:40 --> $DIR/attr-stmt-expr-attr-bad.rs:28:40
| |
LL | #[cfg(FALSE)] fn e() { let _ = move || #![attr] {foo}; } LL | #[cfg(FALSE)] fn e() { let _ = move || #![attr] {foo}; }
| ^^^^^^^^ | ^^^^^^^^
@ -110,19 +119,19 @@ LL | #[cfg(FALSE)] fn e() { let _ = move || #![attr] {foo}; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: expected expression, found `..` error: expected expression, found `..`
--> $DIR/attr-stmt-expr-attr-bad.rs:29:40 --> $DIR/attr-stmt-expr-attr-bad.rs:30:40
| |
LL | #[cfg(FALSE)] fn e() { let _ = #[attr] ..#[attr] 0; } LL | #[cfg(FALSE)] fn e() { let _ = #[attr] ..#[attr] 0; }
| ^^ expected expression | ^^ expected expression
error: expected expression, found `..` error: expected expression, found `..`
--> $DIR/attr-stmt-expr-attr-bad.rs:31:40 --> $DIR/attr-stmt-expr-attr-bad.rs:32:40
| |
LL | #[cfg(FALSE)] fn e() { let _ = #[attr] ..; } LL | #[cfg(FALSE)] fn e() { let _ = #[attr] ..; }
| ^^ expected expression | ^^ expected expression
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:33:41 --> $DIR/attr-stmt-expr-attr-bad.rs:34:41
| |
LL | #[cfg(FALSE)] fn e() { let _ = #[attr] &#![attr] 0; } LL | #[cfg(FALSE)] fn e() { let _ = #[attr] &#![attr] 0; }
| ^^^^^^^^ | ^^^^^^^^
@ -131,7 +140,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = #[attr] &#![attr] 0; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:35:45 --> $DIR/attr-stmt-expr-attr-bad.rs:36:45
| |
LL | #[cfg(FALSE)] fn e() { let _ = #[attr] &mut #![attr] 0; } LL | #[cfg(FALSE)] fn e() { let _ = #[attr] &mut #![attr] 0; }
| ^^^^^^^^ | ^^^^^^^^
@ -140,7 +149,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = #[attr] &mut #![attr] 0; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: outer attributes are not allowed on `if` and `else` branches error: outer attributes are not allowed on `if` and `else` branches
--> $DIR/attr-stmt-expr-attr-bad.rs:37:37 --> $DIR/attr-stmt-expr-attr-bad.rs:38:37
| |
LL | #[cfg(FALSE)] fn e() { let _ = if 0 #[attr] {}; } LL | #[cfg(FALSE)] fn e() { let _ = if 0 #[attr] {}; }
| -- ^^^^^^^ -- the attributes are attached to this branch | -- ^^^^^^^ -- the attributes are attached to this branch
@ -149,7 +158,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = if 0 #[attr] {}; }
| the branch belongs to this `if` | the branch belongs to this `if`
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:39:38 --> $DIR/attr-stmt-expr-attr-bad.rs:40:38
| |
LL | #[cfg(FALSE)] fn e() { let _ = if 0 {#![attr]}; } LL | #[cfg(FALSE)] fn e() { let _ = if 0 {#![attr]}; }
| ^^^^^^^^ | ^^^^^^^^
@ -158,13 +167,13 @@ LL | #[cfg(FALSE)] fn e() { let _ = if 0 {#![attr]}; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: expected one of `.`, `;`, `?`, `else`, or an operator, found `#` error: expected one of `.`, `;`, `?`, `else`, or an operator, found `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:41:40 --> $DIR/attr-stmt-expr-attr-bad.rs:42:40
| |
LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} #[attr] else {}; } LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} #[attr] else {}; }
| ^ expected one of `.`, `;`, `?`, `else`, or an operator | ^ expected one of `.`, `;`, `?`, `else`, or an operator
error: outer attributes are not allowed on `if` and `else` branches error: outer attributes are not allowed on `if` and `else` branches
--> $DIR/attr-stmt-expr-attr-bad.rs:43:45 --> $DIR/attr-stmt-expr-attr-bad.rs:44:45
| |
LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else #[attr] {}; } LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else #[attr] {}; }
| ---- ^^^^^^^ -- the attributes are attached to this branch | ---- ^^^^^^^ -- the attributes are attached to this branch
@ -173,7 +182,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else #[attr] {}; }
| the branch belongs to this `else` | the branch belongs to this `else`
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:45:46 --> $DIR/attr-stmt-expr-attr-bad.rs:46:46
| |
LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else {#![attr]}; } LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else {#![attr]}; }
| ^^^^^^^^ | ^^^^^^^^
@ -182,7 +191,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else {#![attr]}; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: outer attributes are not allowed on `if` and `else` branches error: outer attributes are not allowed on `if` and `else` branches
--> $DIR/attr-stmt-expr-attr-bad.rs:47:45 --> $DIR/attr-stmt-expr-attr-bad.rs:48:45
| |
LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else #[attr] if 0 {}; } LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else #[attr] if 0 {}; }
| ---- ^^^^^^^ ------- the attributes are attached to this branch | ---- ^^^^^^^ ------- the attributes are attached to this branch
@ -191,7 +200,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else #[attr] if 0 {}; }
| the branch belongs to this `else` | the branch belongs to this `else`
error: outer attributes are not allowed on `if` and `else` branches error: outer attributes are not allowed on `if` and `else` branches
--> $DIR/attr-stmt-expr-attr-bad.rs:49:50 --> $DIR/attr-stmt-expr-attr-bad.rs:50:50
| |
LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else if 0 #[attr] {}; } LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else if 0 #[attr] {}; }
| -- ^^^^^^^ -- the attributes are attached to this branch | -- ^^^^^^^ -- the attributes are attached to this branch
@ -200,7 +209,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else if 0 #[attr] {}; }
| the branch belongs to this `if` | the branch belongs to this `if`
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:51:51 --> $DIR/attr-stmt-expr-attr-bad.rs:52:51
| |
LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else if 0 {#![attr]}; } LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else if 0 {#![attr]}; }
| ^^^^^^^^ | ^^^^^^^^
@ -209,7 +218,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = if 0 {} else if 0 {#![attr]}; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: outer attributes are not allowed on `if` and `else` branches error: outer attributes are not allowed on `if` and `else` branches
--> $DIR/attr-stmt-expr-attr-bad.rs:53:45 --> $DIR/attr-stmt-expr-attr-bad.rs:54:45
| |
LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 #[attr] {}; } LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 #[attr] {}; }
| -- ^^^^^^^ -- the attributes are attached to this branch | -- ^^^^^^^ -- the attributes are attached to this branch
@ -218,7 +227,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 #[attr] {}; }
| the branch belongs to this `if` | the branch belongs to this `if`
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:55:46 --> $DIR/attr-stmt-expr-attr-bad.rs:56:46
| |
LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {#![attr]}; } LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {#![attr]}; }
| ^^^^^^^^ | ^^^^^^^^
@ -227,13 +236,13 @@ LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {#![attr]}; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: expected one of `.`, `;`, `?`, `else`, or an operator, found `#` error: expected one of `.`, `;`, `?`, `else`, or an operator, found `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:57:48 --> $DIR/attr-stmt-expr-attr-bad.rs:58:48
| |
LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} #[attr] else {}; } LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} #[attr] else {}; }
| ^ expected one of `.`, `;`, `?`, `else`, or an operator | ^ expected one of `.`, `;`, `?`, `else`, or an operator
error: outer attributes are not allowed on `if` and `else` branches error: outer attributes are not allowed on `if` and `else` branches
--> $DIR/attr-stmt-expr-attr-bad.rs:59:53 --> $DIR/attr-stmt-expr-attr-bad.rs:60:53
| |
LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else #[attr] {}; } LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else #[attr] {}; }
| ---- ^^^^^^^ -- the attributes are attached to this branch | ---- ^^^^^^^ -- the attributes are attached to this branch
@ -242,7 +251,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else #[attr] {}; }
| the branch belongs to this `else` | the branch belongs to this `else`
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:61:54 --> $DIR/attr-stmt-expr-attr-bad.rs:62:54
| |
LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else {#![attr]}; } LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else {#![attr]}; }
| ^^^^^^^^ | ^^^^^^^^
@ -251,7 +260,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else {#![attr]}; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: outer attributes are not allowed on `if` and `else` branches error: outer attributes are not allowed on `if` and `else` branches
--> $DIR/attr-stmt-expr-attr-bad.rs:63:53 --> $DIR/attr-stmt-expr-attr-bad.rs:64:53
| |
LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else #[attr] if let _ = 0 {}; } LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else #[attr] if let _ = 0 {}; }
| ---- ^^^^^^^ --------------- the attributes are attached to this branch | ---- ^^^^^^^ --------------- the attributes are attached to this branch
@ -260,7 +269,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else #[attr] if let _ = 0 {}
| the branch belongs to this `else` | the branch belongs to this `else`
error: outer attributes are not allowed on `if` and `else` branches error: outer attributes are not allowed on `if` and `else` branches
--> $DIR/attr-stmt-expr-attr-bad.rs:65:66 --> $DIR/attr-stmt-expr-attr-bad.rs:66:66
| |
LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else if let _ = 0 #[attr] {}; } LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else if let _ = 0 #[attr] {}; }
| -- ^^^^^^^ -- the attributes are attached to this branch | -- ^^^^^^^ -- the attributes are attached to this branch
@ -269,7 +278,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else if let _ = 0 #[attr] {}
| the branch belongs to this `if` | the branch belongs to this `if`
error: an inner attribute is not permitted in this context error: an inner attribute is not permitted in this context
--> $DIR/attr-stmt-expr-attr-bad.rs:67:67 --> $DIR/attr-stmt-expr-attr-bad.rs:68:67
| |
LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else if let _ = 0 {#![attr]}; } LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else if let _ = 0 {#![attr]}; }
| ^^^^^^^^ | ^^^^^^^^
@ -278,7 +287,7 @@ LL | #[cfg(FALSE)] fn e() { let _ = if let _ = 0 {} else if let _ = 0 {#![attr]}
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: an inner attribute is not permitted following an outer attribute error: an inner attribute is not permitted following an outer attribute
--> $DIR/attr-stmt-expr-attr-bad.rs:70:32 --> $DIR/attr-stmt-expr-attr-bad.rs:71:32
| |
LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] let _ = 0; } LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] let _ = 0; }
| ------- ^^^^^^^^ not permitted following an outer attribute | ------- ^^^^^^^^ not permitted following an outer attribute
@ -289,7 +298,7 @@ LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] let _ = 0; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: an inner attribute is not permitted following an outer attribute error: an inner attribute is not permitted following an outer attribute
--> $DIR/attr-stmt-expr-attr-bad.rs:72:32 --> $DIR/attr-stmt-expr-attr-bad.rs:73:32
| |
LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] 0; } LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] 0; }
| ------- ^^^^^^^^ not permitted following an outer attribute | ------- ^^^^^^^^ not permitted following an outer attribute
@ -300,7 +309,7 @@ LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] 0; }
= note: outer attributes, like `#[test]`, annotate the item following them = note: outer attributes, like `#[test]`, annotate the item following them
error: an inner attribute is not permitted following an outer attribute error: an inner attribute is not permitted following an outer attribute
--> $DIR/attr-stmt-expr-attr-bad.rs:74:32 --> $DIR/attr-stmt-expr-attr-bad.rs:75:32
| |
LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] foo!(); } LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] foo!(); }
| ------- ^^^^^^^^ ------- the inner attribute doesn't annotate this item macro invocation | ------- ^^^^^^^^ ------- the inner attribute doesn't annotate this item macro invocation
@ -316,7 +325,7 @@ LL + #[cfg(FALSE)] fn s() { #[attr] #[attr] foo!(); }
| |
error: an inner attribute is not permitted following an outer attribute error: an inner attribute is not permitted following an outer attribute
--> $DIR/attr-stmt-expr-attr-bad.rs:76:32 --> $DIR/attr-stmt-expr-attr-bad.rs:77:32
| |
LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] foo![]; } LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] foo![]; }
| ------- ^^^^^^^^ ------- the inner attribute doesn't annotate this item macro invocation | ------- ^^^^^^^^ ------- the inner attribute doesn't annotate this item macro invocation
@ -332,7 +341,7 @@ LL + #[cfg(FALSE)] fn s() { #[attr] #[attr] foo![]; }
| |
error: an inner attribute is not permitted following an outer attribute error: an inner attribute is not permitted following an outer attribute
--> $DIR/attr-stmt-expr-attr-bad.rs:78:32 --> $DIR/attr-stmt-expr-attr-bad.rs:79:32
| |
LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] foo!{}; } LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] foo!{}; }
| ------- ^^^^^^^^ ------ the inner attribute doesn't annotate this item macro invocation | ------- ^^^^^^^^ ------ the inner attribute doesn't annotate this item macro invocation
@ -348,7 +357,7 @@ LL + #[cfg(FALSE)] fn s() { #[attr] #[attr] foo!{}; }
| |
error[E0586]: inclusive range with no end error[E0586]: inclusive range with no end
--> $DIR/attr-stmt-expr-attr-bad.rs:84:35 --> $DIR/attr-stmt-expr-attr-bad.rs:85:35
| |
LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] 10 => () } } LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] 10 => () } }
| ^^^ help: use `..` instead | ^^^ help: use `..` instead
@ -356,13 +365,13 @@ LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] 10 => () } }
= note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`)
error: expected one of `=>`, `if`, or `|`, found `#` error: expected one of `=>`, `if`, or `|`, found `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:84:38 --> $DIR/attr-stmt-expr-attr-bad.rs:85:38
| |
LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] 10 => () } } LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] 10 => () } }
| ^ expected one of `=>`, `if`, or `|` | ^ expected one of `=>`, `if`, or `|`
error[E0586]: inclusive range with no end error[E0586]: inclusive range with no end
--> $DIR/attr-stmt-expr-attr-bad.rs:87:35 --> $DIR/attr-stmt-expr-attr-bad.rs:88:35
| |
LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] -10 => () } } LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] -10 => () } }
| ^^^ help: use `..` instead | ^^^ help: use `..` instead
@ -370,19 +379,19 @@ LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] -10 => () } }
= note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`)
error: expected one of `=>`, `if`, or `|`, found `#` error: expected one of `=>`, `if`, or `|`, found `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:87:38 --> $DIR/attr-stmt-expr-attr-bad.rs:88:38
| |
LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] -10 => () } } LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] -10 => () } }
| ^ expected one of `=>`, `if`, or `|` | ^ expected one of `=>`, `if`, or `|`
error: unexpected token: `#` error: unexpected token: `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:90:39 --> $DIR/attr-stmt-expr-attr-bad.rs:91:39
| |
LL | #[cfg(FALSE)] fn e() { match 0 { 0..=-#[attr] 10 => () } } LL | #[cfg(FALSE)] fn e() { match 0 { 0..=-#[attr] 10 => () } }
| ^ | ^
error[E0586]: inclusive range with no end error[E0586]: inclusive range with no end
--> $DIR/attr-stmt-expr-attr-bad.rs:92:35 --> $DIR/attr-stmt-expr-attr-bad.rs:93:35
| |
LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] FOO => () } } LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] FOO => () } }
| ^^^ help: use `..` instead | ^^^ help: use `..` instead
@ -390,47 +399,47 @@ LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] FOO => () } }
= note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`) = note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`)
error: expected one of `=>`, `if`, or `|`, found `#` error: expected one of `=>`, `if`, or `|`, found `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:92:38 --> $DIR/attr-stmt-expr-attr-bad.rs:93:38
| |
LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] FOO => () } } LL | #[cfg(FALSE)] fn e() { match 0 { 0..=#[attr] FOO => () } }
| ^ expected one of `=>`, `if`, or `|` | ^ expected one of `=>`, `if`, or `|`
error: unexpected token: `#` error: unexpected token: `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:96:34 --> $DIR/attr-stmt-expr-attr-bad.rs:97:34
| |
LL | #[cfg(FALSE)] fn e() { let _ = x.#![attr]foo(); } LL | #[cfg(FALSE)] fn e() { let _ = x.#![attr]foo(); }
| ^ | ^
error: expected one of `.`, `;`, `?`, `else`, or an operator, found `#` error: expected one of `.`, `;`, `?`, `else`, or an operator, found `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:96:34 --> $DIR/attr-stmt-expr-attr-bad.rs:97:34
| |
LL | #[cfg(FALSE)] fn e() { let _ = x.#![attr]foo(); } LL | #[cfg(FALSE)] fn e() { let _ = x.#![attr]foo(); }
| ^ expected one of `.`, `;`, `?`, `else`, or an operator | ^ expected one of `.`, `;`, `?`, `else`, or an operator
error: unexpected token: `#` error: unexpected token: `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:99:34 --> $DIR/attr-stmt-expr-attr-bad.rs:100:34
| |
LL | #[cfg(FALSE)] fn e() { let _ = x.#[attr]foo(); } LL | #[cfg(FALSE)] fn e() { let _ = x.#[attr]foo(); }
| ^ | ^
error: expected one of `.`, `;`, `?`, `else`, or an operator, found `#` error: expected one of `.`, `;`, `?`, `else`, or an operator, found `#`
--> $DIR/attr-stmt-expr-attr-bad.rs:99:34 --> $DIR/attr-stmt-expr-attr-bad.rs:100:34
| |
LL | #[cfg(FALSE)] fn e() { let _ = x.#[attr]foo(); } LL | #[cfg(FALSE)] fn e() { let _ = x.#[attr]foo(); }
| ^ expected one of `.`, `;`, `?`, `else`, or an operator | ^ expected one of `.`, `;`, `?`, `else`, or an operator
error: expected statement after outer attribute error: expected statement after outer attribute
--> $DIR/attr-stmt-expr-attr-bad.rs:104:37 --> $DIR/attr-stmt-expr-attr-bad.rs:105:37
| |
LL | #[cfg(FALSE)] fn e() { { fn foo() { #[attr]; } } } LL | #[cfg(FALSE)] fn e() { { fn foo() { #[attr]; } } }
| ^^^^^^^ | ^^^^^^^
error: expected statement after outer attribute error: expected statement after outer attribute
--> $DIR/attr-stmt-expr-attr-bad.rs:106:37 --> $DIR/attr-stmt-expr-attr-bad.rs:107:37
| |
LL | #[cfg(FALSE)] fn e() { { fn foo() { #[attr] } } } LL | #[cfg(FALSE)] fn e() { { fn foo() { #[attr] } } }
| ^^^^^^^ | ^^^^^^^
error: aborting due to 52 previous errors error: aborting due to 53 previous errors
For more information about this error, try `rustc --explain E0586`. For more information about this error, try `rustc --explain E0586`.

View file

@ -2,7 +2,6 @@ enum VecOrMap{
vec: Vec<usize>, vec: Vec<usize>,
//~^ ERROR expected one of `(`, `,`, `=`, `{`, or `}`, found `:` //~^ ERROR expected one of `(`, `,`, `=`, `{`, or `}`, found `:`
//~| HELP: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }` //~| HELP: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
//~| ERROR expected item, found `:`
map: HashMap<String,usize> map: HashMap<String,usize>
} }

View file

@ -1,16 +1,12 @@
error: expected one of `(`, `,`, `=`, `{`, or `}`, found `:` error: expected one of `(`, `,`, `=`, `{`, or `}`, found `:`
--> $DIR/issue-103869.rs:2:8 --> $DIR/issue-103869.rs:2:8
| |
LL | enum VecOrMap{
| -------- while parsing this enum
LL | vec: Vec<usize>, LL | vec: Vec<usize>,
| ^ expected one of `(`, `,`, `=`, `{`, or `}` | ^ expected one of `(`, `,`, `=`, `{`, or `}`
| |
= help: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }` = help: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
error: expected item, found `:` error: aborting due to previous error
--> $DIR/issue-103869.rs:2:8
|
LL | vec: Vec<usize>,
| ^ expected item
error: aborting due to 2 previous errors

View file

@ -10,14 +10,14 @@ pub fn index_after_as_cast() {
vec![1, 2, 3] as Vec<i32>[0]; vec![1, 2, 3] as Vec<i32>[0];
//~^ ERROR: cast cannot be followed by indexing //~^ ERROR: cast cannot be followed by indexing
vec![1, 2, 3]: Vec<i32>[0]; vec![1, 2, 3]: Vec<i32>[0];
//~^ ERROR: type ascription cannot be followed by indexing //~^ ERROR: expected one of
} }
pub fn index_after_cast_to_index() { pub fn index_after_cast_to_index() {
(&[0]) as &[i32][0]; (&[0]) as &[i32][0];
//~^ ERROR: cast cannot be followed by indexing //~^ ERROR: cast cannot be followed by indexing
(&[0i32]): &[i32; 1][0]; (&[0i32]): &[i32; 1][0];
//~^ ERROR: type ascription cannot be followed by indexing //~^ ERROR: expected one of
} }
pub fn cast_after_cast() { pub fn cast_after_cast() {
@ -25,7 +25,7 @@ pub fn cast_after_cast() {
} }
if 5u64: u64: u64 == 0u64 { if 5u64: u64: u64 == 0u64 {
//~^ ERROR expected `{`, found `:`
} }
let _ = 5u64: u64: u64 as u8 as i8 == 9i8; let _ = 5u64: u64: u64 as u8 as i8 == 9i8;
let _ = 0i32: i32: i32; let _ = 0i32: i32: i32;
@ -36,26 +36,46 @@ pub fn cast_after_cast() {
} }
pub fn cast_cast_method_call() { pub fn cast_cast_method_call() {
let _ = 0i32: i32: i32.count_ones(); let _ = 0i32: i32: i32.count_ones(); //~ ERROR expected one of
//~^ ERROR: type ascription cannot be followed by a method call }
let _ = 0 as i32: i32.count_ones();
//~^ ERROR: type ascription cannot be followed by a method call pub fn cast_cast_method_call_2() {
let _ = 0i32: i32 as i32.count_ones(); let _ = 0 as i32: i32.count_ones(); //~ ERROR expected one of
//~^ ERROR: cast cannot be followed by a method call }
pub fn cast_cast_method_call_3() {
let _ = 0i32: i32 as i32.count_ones(); //~ ERROR expected one of
}
pub fn cast_cast_method_call_4() {
let _ = 0 as i32 as i32.count_ones(); let _ = 0 as i32 as i32.count_ones();
//~^ ERROR: cast cannot be followed by a method call //~^ ERROR: cast cannot be followed by a method call
let _ = 0i32: i32: i32 as u32 as i32.count_ones(); }
pub fn cast_cast_method_call_5() {
let _ = 0i32: i32: i32 as u32 as i32.count_ones(); //~ ERROR expected one of
}
pub fn cast_cast_method_call_6() {
let _ = 0i32: i32.count_ones(): u32; //~ ERROR expected one of
}
pub fn cast_cast_method_call_7() {
let _ = 0 as i32.count_ones(): u32; //~ ERROR expected one of
//~^ ERROR: cast cannot be followed by a method call //~^ ERROR: cast cannot be followed by a method call
let _ = 0i32: i32.count_ones(): u32; }
//~^ ERROR: type ascription cannot be followed by a method call
let _ = 0 as i32.count_ones(): u32; pub fn cast_cast_method_call_8() {
//~^ ERROR: cast cannot be followed by a method call let _ = 0i32: i32.count_ones() as u32; //~ ERROR expected one of
let _ = 0i32: i32.count_ones() as u32; }
//~^ ERROR: type ascription cannot be followed by a method call
pub fn cast_cast_method_call_9() {
let _ = 0 as i32.count_ones() as u32; let _ = 0 as i32.count_ones() as u32;
//~^ ERROR: cast cannot be followed by a method call //~^ ERROR: cast cannot be followed by a method call
let _ = 0i32: i32: i32.count_ones() as u32 as i32; }
//~^ ERROR: type ascription cannot be followed by a method call
pub fn cast_cast_method_call_10() {
let _ = 0i32: i32: i32.count_ones() as u32 as i32; //~ ERROR expected one of
} }
pub fn multiline_error() { pub fn multiline_error() {
@ -74,8 +94,7 @@ pub fn precedence() {
pub fn method_calls() { pub fn method_calls() {
0 as i32.max(0); 0 as i32.max(0);
//~^ ERROR: cast cannot be followed by a method call //~^ ERROR: cast cannot be followed by a method call
0: i32.max(0); 0: i32.max(0); //~ ERROR expected one of
//~^ ERROR: type ascription cannot be followed by a method call
} }
pub fn complex() { pub fn complex() {
@ -84,7 +103,7 @@ pub fn complex() {
if true { 33 } else { 44 } as i32.max(0), if true { 33 } else { 44 } as i32.max(0),
//~^ ERROR: cast cannot be followed by a method call //~^ ERROR: cast cannot be followed by a method call
if true { 33 } else { 44 }: i32.max(0) if true { 33 } else { 44 }: i32.max(0)
//~^ ERROR: type ascription cannot be followed by a method call //~^ ERROR: expected one of
); );
} }
@ -93,7 +112,7 @@ pub fn in_condition() {
//~^ ERROR: cast cannot be followed by a method call //~^ ERROR: cast cannot be followed by a method call
} }
if 5u64: u64.max(0) == 0 { if 5u64: u64.max(0) == 0 {
//~^ ERROR: type ascription cannot be followed by a method call //~^ ERROR: expected `{`, found `:`
} }
} }
@ -104,7 +123,7 @@ pub fn inside_block() {
} else { false }; } else { false };
let _ = if true { let _ = if true {
5u64: u64.max(0) == 0 5u64: u64.max(0) == 0
//~^ ERROR: type ascription cannot be followed by a method call //~^ ERROR: expected one of
} else { false }; } else { false };
} }
@ -112,14 +131,14 @@ pub fn inside_block() {
//~^ ERROR: cast cannot be followed by indexing //~^ ERROR: cast cannot be followed by indexing
static bar2: &[i32] = &(&[1i32,2,3]: &[i32; 3][0..1]); static bar2: &[i32] = &(&[1i32,2,3]: &[i32; 3][0..1]);
//~^ ERROR: type ascription cannot be followed by indexing //~^ ERROR: expected one of
pub fn cast_then_try() -> Result<u64,u64> { pub fn cast_then_try() -> Result<u64,u64> {
Err(0u64) as Result<u64,u64>?; Err(0u64) as Result<u64,u64>?;
//~^ ERROR: cast cannot be followed by `?` //~^ ERROR: cast cannot be followed by `?`
Err(0u64): Result<u64,u64>?; Err(0u64): Result<u64,u64>?;
//~^ ERROR: type ascription cannot be followed by `?` //~^ ERROR: expected one of
Ok(1) Ok(1)
} }
@ -131,13 +150,14 @@ pub fn cast_then_call() {
drop as F(); drop as F();
//~^ ERROR: parenthesized type parameters may only be used with a `Fn` trait [E0214] //~^ ERROR: parenthesized type parameters may only be used with a `Fn` trait [E0214]
drop_ptr: F(); drop_ptr: F();
//~^ ERROR: parenthesized type parameters may only be used with a `Fn` trait [E0214] //~^ ERROR: expected identifier, found `:`
} }
pub fn cast_to_fn_should_work() { pub fn cast_to_fn_should_work() {
let drop_ptr = drop as fn(u8); let drop_ptr = drop as fn(u8);
drop as fn(u8); drop as fn(u8);
drop_ptr: fn(u8); drop_ptr: fn(u8);
//~^ ERROR expected one of
} }
pub fn parens_after_cast_error() { pub fn parens_after_cast_error() {
@ -145,7 +165,7 @@ pub fn parens_after_cast_error() {
drop as fn(u8)(0); drop as fn(u8)(0);
//~^ ERROR: cast cannot be followed by a function call //~^ ERROR: cast cannot be followed by a function call
drop_ptr: fn(u8)(0); drop_ptr: fn(u8)(0);
//~^ ERROR: type ascription cannot be followed by a function call //~^ ERROR: expected one of
} }
pub async fn cast_then_await() { pub async fn cast_then_await() {
@ -153,7 +173,7 @@ pub async fn cast_then_await() {
//~^ ERROR: cast cannot be followed by `.await` //~^ ERROR: cast cannot be followed by `.await`
Box::pin(noop()): Pin<Box<_>>.await; Box::pin(noop()): Pin<Box<_>>.await;
//~^ ERROR: type ascription cannot be followed by `.await` //~^ ERROR: expected one of
} }
pub async fn noop() {} pub async fn noop() {}
@ -167,5 +187,5 @@ pub fn struct_field() {
Foo::default() as Foo.bar; Foo::default() as Foo.bar;
//~^ ERROR: cannot be followed by a field access //~^ ERROR: cannot be followed by a field access
Foo::default(): Foo.bar; Foo::default(): Foo.bar;
//~^ ERROR: type ascription cannot be followed by a field access //~^ ERROR expected one of
} }

View file

@ -9,21 +9,11 @@ help: try surrounding the expression in parentheses
LL | (vec![1, 2, 3] as Vec<i32>)[0]; LL | (vec![1, 2, 3] as Vec<i32>)[0];
| + + | + +
error: type ascription cannot be followed by indexing error: expected one of `.`, `;`, `?`, `}`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:12:5 --> $DIR/issue-35813-postfix-after-cast.rs:12:18
| |
LL | vec![1, 2, 3]: Vec<i32>[0]; LL | vec![1, 2, 3]: Vec<i32>[0];
| ^^^^^^^^^^^^^^^^^^^^^^^ | ^ expected one of `.`, `;`, `?`, `}`, or an operator
|
help: try surrounding the expression in parentheses
|
LL | (vec![1, 2, 3]: Vec<i32>)[0];
| + +
help: alternatively, remove the type ascription
|
LL - vec![1, 2, 3]: Vec<i32>[0];
LL + vec![1, 2, 3][0];
|
error: cast cannot be followed by indexing error: cast cannot be followed by indexing
--> $DIR/issue-35813-postfix-after-cast.rs:17:5 --> $DIR/issue-35813-postfix-after-cast.rs:17:5
@ -36,67 +26,50 @@ help: try surrounding the expression in parentheses
LL | ((&[0]) as &[i32])[0]; LL | ((&[0]) as &[i32])[0];
| + + | + +
error: type ascription cannot be followed by indexing error: expected one of `.`, `;`, `?`, `}`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:19:5 --> $DIR/issue-35813-postfix-after-cast.rs:19:14
| |
LL | (&[0i32]): &[i32; 1][0]; LL | (&[0i32]): &[i32; 1][0];
| ^^^^^^^^^^^^^^^^^^^^ | ^ expected one of `.`, `;`, `?`, `}`, or an operator
|
help: try surrounding the expression in parentheses
|
LL | ((&[0i32]): &[i32; 1])[0];
| + +
help: alternatively, remove the type ascription
|
LL - (&[0i32]): &[i32; 1][0];
LL + (&[0i32])[0];
|
error: type ascription cannot be followed by a method call error: expected `{`, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:39:13 --> $DIR/issue-35813-postfix-after-cast.rs:27:12
|
LL | if 5u64: u64: u64 == 0u64 {
| ^ expected `{`
|
note: the `if` expression is missing a block after this condition
--> $DIR/issue-35813-postfix-after-cast.rs:27:8
|
LL | if 5u64: u64: u64 == 0u64 {
| ^^^^
error: expected one of `.`, `;`, `?`, `else`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:39:17
| |
LL | let _ = 0i32: i32: i32.count_ones(); LL | let _ = 0i32: i32: i32.count_ones();
| ^^^^^^^^^^^^^^ | ^ expected one of `.`, `;`, `?`, `else`, or an operator
|
help: try surrounding the expression in parentheses
|
LL | let _ = (0i32: i32: i32).count_ones();
| + +
help: alternatively, remove the type ascription
|
LL - let _ = 0i32: i32: i32.count_ones();
LL + let _ = 0i32: i32.count_ones();
| |
= note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
error: type ascription cannot be followed by a method call error: expected one of `!`, `(`, `.`, `::`, `;`, `<`, `?`, or `else`, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:41:13 --> $DIR/issue-35813-postfix-after-cast.rs:43:21
| |
LL | let _ = 0 as i32: i32.count_ones(); LL | let _ = 0 as i32: i32.count_ones();
| ^^^^^^^^^^^^^ | ^ expected one of 8 possible tokens
|
help: try surrounding the expression in parentheses
|
LL | let _ = (0 as i32: i32).count_ones();
| + +
help: alternatively, remove the type ascription
|
LL - let _ = 0 as i32: i32.count_ones();
LL + let _ = 0 as i32.count_ones();
| |
= note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
error: cast cannot be followed by a method call error: expected one of `.`, `;`, `?`, `else`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:43:13 --> $DIR/issue-35813-postfix-after-cast.rs:47:17
| |
LL | let _ = 0i32: i32 as i32.count_ones(); LL | let _ = 0i32: i32 as i32.count_ones();
| ^^^^^^^^^^^^^^^^ | ^ expected one of `.`, `;`, `?`, `else`, or an operator
| |
help: try surrounding the expression in parentheses = note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
|
LL | let _ = (0i32: i32 as i32).count_ones();
| + +
error: cast cannot be followed by a method call error: cast cannot be followed by a method call
--> $DIR/issue-35813-postfix-after-cast.rs:45:13 --> $DIR/issue-35813-postfix-after-cast.rs:51:13
| |
LL | let _ = 0 as i32 as i32.count_ones(); LL | let _ = 0 as i32 as i32.count_ones();
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
@ -106,35 +79,24 @@ help: try surrounding the expression in parentheses
LL | let _ = (0 as i32 as i32).count_ones(); LL | let _ = (0 as i32 as i32).count_ones();
| + + | + +
error: cast cannot be followed by a method call error: expected one of `.`, `;`, `?`, `else`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:47:13 --> $DIR/issue-35813-postfix-after-cast.rs:56:17
| |
LL | let _ = 0i32: i32: i32 as u32 as i32.count_ones(); LL | let _ = 0i32: i32: i32 as u32 as i32.count_ones();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^ expected one of `.`, `;`, `?`, `else`, or an operator
| |
help: try surrounding the expression in parentheses = note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
|
LL | let _ = (0i32: i32: i32 as u32 as i32).count_ones();
| + +
error: type ascription cannot be followed by a method call error: expected one of `.`, `;`, `?`, `else`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:49:13 --> $DIR/issue-35813-postfix-after-cast.rs:60:17
| |
LL | let _ = 0i32: i32.count_ones(): u32; LL | let _ = 0i32: i32.count_ones(): u32;
| ^^^^^^^^^ | ^ expected one of `.`, `;`, `?`, `else`, or an operator
|
help: try surrounding the expression in parentheses
|
LL | let _ = (0i32: i32).count_ones(): u32;
| + +
help: alternatively, remove the type ascription
|
LL - let _ = 0i32: i32.count_ones(): u32;
LL + let _ = 0i32.count_ones(): u32;
| |
= note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
error: cast cannot be followed by a method call error: cast cannot be followed by a method call
--> $DIR/issue-35813-postfix-after-cast.rs:51:13 --> $DIR/issue-35813-postfix-after-cast.rs:64:13
| |
LL | let _ = 0 as i32.count_ones(): u32; LL | let _ = 0 as i32.count_ones(): u32;
| ^^^^^^^^ | ^^^^^^^^
@ -144,24 +106,24 @@ help: try surrounding the expression in parentheses
LL | let _ = (0 as i32).count_ones(): u32; LL | let _ = (0 as i32).count_ones(): u32;
| + + | + +
error: type ascription cannot be followed by a method call error: expected one of `.`, `;`, `?`, or `else`, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:53:13 --> $DIR/issue-35813-postfix-after-cast.rs:64:34
|
LL | let _ = 0 as i32.count_ones(): u32;
| ^ expected one of `.`, `;`, `?`, or `else`
|
= note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
error: expected one of `.`, `;`, `?`, `else`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:69:17
| |
LL | let _ = 0i32: i32.count_ones() as u32; LL | let _ = 0i32: i32.count_ones() as u32;
| ^^^^^^^^^ | ^ expected one of `.`, `;`, `?`, `else`, or an operator
|
help: try surrounding the expression in parentheses
|
LL | let _ = (0i32: i32).count_ones() as u32;
| + +
help: alternatively, remove the type ascription
|
LL - let _ = 0i32: i32.count_ones() as u32;
LL + let _ = 0i32.count_ones() as u32;
| |
= note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
error: cast cannot be followed by a method call error: cast cannot be followed by a method call
--> $DIR/issue-35813-postfix-after-cast.rs:55:13 --> $DIR/issue-35813-postfix-after-cast.rs:73:13
| |
LL | let _ = 0 as i32.count_ones() as u32; LL | let _ = 0 as i32.count_ones() as u32;
| ^^^^^^^^ | ^^^^^^^^
@ -171,24 +133,16 @@ help: try surrounding the expression in parentheses
LL | let _ = (0 as i32).count_ones() as u32; LL | let _ = (0 as i32).count_ones() as u32;
| + + | + +
error: type ascription cannot be followed by a method call error: expected one of `.`, `;`, `?`, `else`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:57:13 --> $DIR/issue-35813-postfix-after-cast.rs:78:17
| |
LL | let _ = 0i32: i32: i32.count_ones() as u32 as i32; LL | let _ = 0i32: i32: i32.count_ones() as u32 as i32;
| ^^^^^^^^^^^^^^ | ^ expected one of `.`, `;`, `?`, `else`, or an operator
|
help: try surrounding the expression in parentheses
|
LL | let _ = (0i32: i32: i32).count_ones() as u32 as i32;
| + +
help: alternatively, remove the type ascription
|
LL - let _ = 0i32: i32: i32.count_ones() as u32 as i32;
LL + let _ = 0i32: i32.count_ones() as u32 as i32;
| |
= note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
error: cast cannot be followed by a method call error: cast cannot be followed by a method call
--> $DIR/issue-35813-postfix-after-cast.rs:62:13 --> $DIR/issue-35813-postfix-after-cast.rs:82:13
| |
LL | let _ = 0 LL | let _ = 0
| _____________^ | _____________^
@ -202,7 +156,7 @@ LL ~ as i32)
| |
error: cast cannot be followed by indexing error: cast cannot be followed by indexing
--> $DIR/issue-35813-postfix-after-cast.rs:70:18 --> $DIR/issue-35813-postfix-after-cast.rs:90:18
| |
LL | let x: i32 = &vec![1, 2, 3] as &Vec<i32>[0]; LL | let x: i32 = &vec![1, 2, 3] as &Vec<i32>[0];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -213,7 +167,7 @@ LL | let x: i32 = (&vec![1, 2, 3] as &Vec<i32>)[0];
| + + | + +
error: cast cannot be followed by a method call error: cast cannot be followed by a method call
--> $DIR/issue-35813-postfix-after-cast.rs:75:5 --> $DIR/issue-35813-postfix-after-cast.rs:95:5
| |
LL | 0 as i32.max(0); LL | 0 as i32.max(0);
| ^^^^^^^^ | ^^^^^^^^
@ -223,24 +177,14 @@ help: try surrounding the expression in parentheses
LL | (0 as i32).max(0); LL | (0 as i32).max(0);
| + + | + +
error: type ascription cannot be followed by a method call error: expected one of `.`, `;`, `?`, `}`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:77:5 --> $DIR/issue-35813-postfix-after-cast.rs:97:6
| |
LL | 0: i32.max(0); LL | 0: i32.max(0);
| ^^^^^^ | ^ expected one of `.`, `;`, `?`, `}`, or an operator
|
help: try surrounding the expression in parentheses
|
LL | (0: i32).max(0);
| + +
help: alternatively, remove the type ascription
|
LL - 0: i32.max(0);
LL + 0.max(0);
|
error: cast cannot be followed by a method call error: cast cannot be followed by a method call
--> $DIR/issue-35813-postfix-after-cast.rs:92:8 --> $DIR/issue-35813-postfix-after-cast.rs:111:8
| |
LL | if 5u64 as i32.max(0) == 0 { LL | if 5u64 as i32.max(0) == 0 {
| ^^^^^^^^^^^ | ^^^^^^^^^^^
@ -250,24 +194,20 @@ help: try surrounding the expression in parentheses
LL | if (5u64 as i32).max(0) == 0 { LL | if (5u64 as i32).max(0) == 0 {
| + + | + +
error: type ascription cannot be followed by a method call error: expected `{`, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:95:8 --> $DIR/issue-35813-postfix-after-cast.rs:114:12
| |
LL | if 5u64: u64.max(0) == 0 { LL | if 5u64: u64.max(0) == 0 {
| ^^^^^^^^^ | ^ expected `{`
| |
help: try surrounding the expression in parentheses note: the `if` expression is missing a block after this condition
| --> $DIR/issue-35813-postfix-after-cast.rs:114:8
LL | if (5u64: u64).max(0) == 0 {
| + +
help: alternatively, remove the type ascription
|
LL - if 5u64: u64.max(0) == 0 {
LL + if 5u64.max(0) == 0 {
| |
LL | if 5u64: u64.max(0) == 0 {
| ^^^^
error: cast cannot be followed by a method call error: cast cannot be followed by a method call
--> $DIR/issue-35813-postfix-after-cast.rs:102:9 --> $DIR/issue-35813-postfix-after-cast.rs:121:9
| |
LL | 5u64 as u32.max(0) == 0 LL | 5u64 as u32.max(0) == 0
| ^^^^^^^^^^^ | ^^^^^^^^^^^
@ -277,24 +217,14 @@ help: try surrounding the expression in parentheses
LL | (5u64 as u32).max(0) == 0 LL | (5u64 as u32).max(0) == 0
| + + | + +
error: type ascription cannot be followed by a method call error: expected one of `.`, `;`, `?`, `}`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:106:9 --> $DIR/issue-35813-postfix-after-cast.rs:125:13
| |
LL | 5u64: u64.max(0) == 0 LL | 5u64: u64.max(0) == 0
| ^^^^^^^^^ | ^ expected one of `.`, `;`, `?`, `}`, or an operator
|
help: try surrounding the expression in parentheses
|
LL | (5u64: u64).max(0) == 0
| + +
help: alternatively, remove the type ascription
|
LL - 5u64: u64.max(0) == 0
LL + 5u64.max(0) == 0
|
error: cast cannot be followed by indexing error: cast cannot be followed by indexing
--> $DIR/issue-35813-postfix-after-cast.rs:111:24 --> $DIR/issue-35813-postfix-after-cast.rs:130:24
| |
LL | static bar: &[i32] = &(&[1,2,3] as &[i32][0..1]); LL | static bar: &[i32] = &(&[1,2,3] as &[i32][0..1]);
| ^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^
@ -304,24 +234,14 @@ help: try surrounding the expression in parentheses
LL | static bar: &[i32] = &((&[1,2,3] as &[i32])[0..1]); LL | static bar: &[i32] = &((&[1,2,3] as &[i32])[0..1]);
| + + | + +
error: type ascription cannot be followed by indexing error: expected one of `)`, `,`, `.`, `?`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:114:25 --> $DIR/issue-35813-postfix-after-cast.rs:133:36
| |
LL | static bar2: &[i32] = &(&[1i32,2,3]: &[i32; 3][0..1]); LL | static bar2: &[i32] = &(&[1i32,2,3]: &[i32; 3][0..1]);
| ^^^^^^^^^^^^^^^^^^^^^^ | ^ expected one of `)`, `,`, `.`, `?`, or an operator
|
help: try surrounding the expression in parentheses
|
LL | static bar2: &[i32] = &((&[1i32,2,3]: &[i32; 3])[0..1]);
| + +
help: alternatively, remove the type ascription
|
LL - static bar2: &[i32] = &(&[1i32,2,3]: &[i32; 3][0..1]);
LL + static bar2: &[i32] = &(&[1i32,2,3][0..1]);
|
error: cast cannot be followed by `?` error: cast cannot be followed by `?`
--> $DIR/issue-35813-postfix-after-cast.rs:119:5 --> $DIR/issue-35813-postfix-after-cast.rs:138:5
| |
LL | Err(0u64) as Result<u64,u64>?; LL | Err(0u64) as Result<u64,u64>?;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -331,24 +251,28 @@ help: try surrounding the expression in parentheses
LL | (Err(0u64) as Result<u64,u64>)?; LL | (Err(0u64) as Result<u64,u64>)?;
| + + | + +
error: type ascription cannot be followed by `?` error: expected one of `.`, `;`, `?`, `}`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:121:5 --> $DIR/issue-35813-postfix-after-cast.rs:140:14
| |
LL | Err(0u64): Result<u64,u64>?; LL | Err(0u64): Result<u64,u64>?;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^ expected one of `.`, `;`, `?`, `}`, or an operator
error: expected identifier, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:152:13
| |
help: try surrounding the expression in parentheses LL | drop_ptr: F();
| ^ expected identifier
| |
LL | (Err(0u64): Result<u64,u64>)?; = note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
| + +
help: alternatively, remove the type ascription error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found `:`
| --> $DIR/issue-35813-postfix-after-cast.rs:159:13
LL - Err(0u64): Result<u64,u64>?;
LL + Err(0u64)?;
| |
LL | drop_ptr: fn(u8);
| ^ expected one of 8 possible tokens
error: cast cannot be followed by a function call error: cast cannot be followed by a function call
--> $DIR/issue-35813-postfix-after-cast.rs:145:5 --> $DIR/issue-35813-postfix-after-cast.rs:165:5
| |
LL | drop as fn(u8)(0); LL | drop as fn(u8)(0);
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
@ -358,24 +282,14 @@ help: try surrounding the expression in parentheses
LL | (drop as fn(u8))(0); LL | (drop as fn(u8))(0);
| + + | + +
error: type ascription cannot be followed by a function call error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:147:5 --> $DIR/issue-35813-postfix-after-cast.rs:167:13
| |
LL | drop_ptr: fn(u8)(0); LL | drop_ptr: fn(u8)(0);
| ^^^^^^^^^^^^^^^^ | ^ expected one of 8 possible tokens
|
help: try surrounding the expression in parentheses
|
LL | (drop_ptr: fn(u8))(0);
| + +
help: alternatively, remove the type ascription
|
LL - drop_ptr: fn(u8)(0);
LL + drop_ptr(0);
|
error: cast cannot be followed by `.await` error: cast cannot be followed by `.await`
--> $DIR/issue-35813-postfix-after-cast.rs:152:5 --> $DIR/issue-35813-postfix-after-cast.rs:172:5
| |
LL | Box::pin(noop()) as Pin<Box<dyn Future<Output = ()>>>.await; LL | Box::pin(noop()) as Pin<Box<dyn Future<Output = ()>>>.await;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -385,24 +299,14 @@ help: try surrounding the expression in parentheses
LL | (Box::pin(noop()) as Pin<Box<dyn Future<Output = ()>>>).await; LL | (Box::pin(noop()) as Pin<Box<dyn Future<Output = ()>>>).await;
| + + | + +
error: type ascription cannot be followed by `.await` error: expected one of `.`, `;`, `?`, `}`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:155:5 --> $DIR/issue-35813-postfix-after-cast.rs:175:21
| |
LL | Box::pin(noop()): Pin<Box<_>>.await; LL | Box::pin(noop()): Pin<Box<_>>.await;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^ expected one of `.`, `;`, `?`, `}`, or an operator
|
help: try surrounding the expression in parentheses
|
LL | (Box::pin(noop()): Pin<Box<_>>).await;
| + +
help: alternatively, remove the type ascription
|
LL - Box::pin(noop()): Pin<Box<_>>.await;
LL + Box::pin(noop()).await;
|
error: cast cannot be followed by a field access error: cast cannot be followed by a field access
--> $DIR/issue-35813-postfix-after-cast.rs:167:5 --> $DIR/issue-35813-postfix-after-cast.rs:187:5
| |
LL | Foo::default() as Foo.bar; LL | Foo::default() as Foo.bar;
| ^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^
@ -412,24 +316,14 @@ help: try surrounding the expression in parentheses
LL | (Foo::default() as Foo).bar; LL | (Foo::default() as Foo).bar;
| + + | + +
error: type ascription cannot be followed by a field access error: expected one of `.`, `;`, `?`, `}`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:169:5 --> $DIR/issue-35813-postfix-after-cast.rs:189:19
| |
LL | Foo::default(): Foo.bar; LL | Foo::default(): Foo.bar;
| ^^^^^^^^^^^^^^^^^^^ | ^ expected one of `.`, `;`, `?`, `}`, or an operator
|
help: try surrounding the expression in parentheses
|
LL | (Foo::default(): Foo).bar;
| + +
help: alternatively, remove the type ascription
|
LL - Foo::default(): Foo.bar;
LL + Foo::default().bar;
|
error: cast cannot be followed by a method call error: cast cannot be followed by a method call
--> $DIR/issue-35813-postfix-after-cast.rs:84:9 --> $DIR/issue-35813-postfix-after-cast.rs:103:9
| |
LL | if true { 33 } else { 44 } as i32.max(0), LL | if true { 33 } else { 44 } as i32.max(0),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -439,34 +333,18 @@ help: try surrounding the expression in parentheses
LL | (if true { 33 } else { 44 } as i32).max(0), LL | (if true { 33 } else { 44 } as i32).max(0),
| + + | + +
error: type ascription cannot be followed by a method call error: expected one of `,`, `.`, `?`, or an operator, found `:`
--> $DIR/issue-35813-postfix-after-cast.rs:86:9 --> $DIR/issue-35813-postfix-after-cast.rs:105:35
| |
LL | if true { 33 } else { 44 }: i32.max(0) LL | if true { 33 } else { 44 }: i32.max(0)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^ expected one of `,`, `.`, `?`, or an operator
|
help: try surrounding the expression in parentheses
|
LL | (if true { 33 } else { 44 }: i32).max(0)
| + +
help: alternatively, remove the type ascription
|
LL - if true { 33 } else { 44 }: i32.max(0)
LL + if true { 33 } else { 44 }.max(0)
|
error[E0214]: parenthesized type parameters may only be used with a `Fn` trait error[E0214]: parenthesized type parameters may only be used with a `Fn` trait
--> $DIR/issue-35813-postfix-after-cast.rs:131:13 --> $DIR/issue-35813-postfix-after-cast.rs:150:13
| |
LL | drop as F(); LL | drop as F();
| ^^^ only `Fn` traits may use parentheses | ^^^ only `Fn` traits may use parentheses
error[E0214]: parenthesized type parameters may only be used with a `Fn` trait error: aborting due to 39 previous errors
--> $DIR/issue-35813-postfix-after-cast.rs:133:15
|
LL | drop_ptr: F();
| ^^^ only `Fn` traits may use parentheses
error: aborting due to 36 previous errors
For more information about this error, try `rustc --explain E0214`. For more information about this error, try `rustc --explain E0214`.

View file

@ -6,5 +6,4 @@ macro_rules! foo {
fn main() { fn main() {
foo!(true); foo!(true);
//~^ ERROR expected identifier, found keyword
} }

View file

@ -1,14 +1,3 @@
error: expected identifier, found keyword `true`
--> $DIR/issue-44406.rs:8:10
|
LL | foo!(true);
| ^^^^ expected identifier, found keyword
|
help: escape `true` to use it as an identifier
|
LL | foo!(r#true);
| ++
error: invalid `struct` delimiters or `fn` call arguments error: invalid `struct` delimiters or `fn` call arguments
--> $DIR/issue-44406.rs:3:9 --> $DIR/issue-44406.rs:3:9
| |
@ -29,5 +18,5 @@ LL - bar(baz: $rest)
LL + bar(: $rest) LL + bar(: $rest)
| |
error: aborting due to 2 previous errors error: aborting due to previous error

View file

@ -1,6 +1,5 @@
fn main() { fn main() {
a(_:b:,) a(_:b:,)
//~^ ERROR: expected identifier, found reserved identifier `_` //~^ ERROR expected identifier, found reserved identifier
//~| ERROR: expected type, found `,` //~| ERROR: expected one of
//~| ERROR: expected type, found `,`
} }

View file

@ -4,28 +4,11 @@ error: expected identifier, found reserved identifier `_`
LL | a(_:b:,) LL | a(_:b:,)
| ^ expected identifier, found reserved identifier | ^ expected identifier, found reserved identifier
error: expected type, found `,` error: expected one of `)`, `,`, `.`, `?`, or an operator, found `:`
--> $DIR/issue-91461.rs:2:11 --> $DIR/issue-91461.rs:2:8
| |
LL | a(_:b:,) LL | a(_:b:,)
| - -^ expected type | ^ expected one of `)`, `,`, `.`, `?`, or an operator
| | |
| | tried to parse a type due to this type ascription
| while parsing this struct
|
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
error: expected type, found `,` error: aborting due to 2 previous errors
--> $DIR/issue-91461.rs:2:11
|
LL | a(_:b:,)
| -^ expected type
| |
| tried to parse a type due to this type ascription
|
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
error: aborting due to 3 previous errors

View file

@ -22,8 +22,7 @@ fn case_1() {
#[cfg(FALSE)] #[cfg(FALSE)]
fn case_2() { fn case_2() {
let a @ (b: u8); let a @ (b: u8);
//~^ ERROR expected one of `!` //~^ ERROR expected one of `)`
//~| ERROR expected one of `)`
} }
#[cfg(FALSE)] #[cfg(FALSE)]

View file

@ -9,18 +9,14 @@ error: expected one of `)`, `,`, `@`, or `|`, found `:`
| |
LL | let a @ (b: u8); LL | let a @ (b: u8);
| ^ expected one of `)`, `,`, `@`, or `|` | ^ expected one of `)`, `,`, `@`, or `|`
error: expected one of `!`, `(`, `+`, `::`, `;`, `<`, or `=`, found `)`
--> $DIR/nested-type-ascription-syntactically-invalid.rs:24:19
| |
LL | let a @ (b: u8); = note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
| ^ expected one of 7 possible tokens
error: expected one of `!`, `(`, `+`, `::`, `;`, `<`, or `=`, found `@` error: expected one of `!`, `(`, `+`, `::`, `;`, `<`, or `=`, found `@`
--> $DIR/nested-type-ascription-syntactically-invalid.rs:31:15 --> $DIR/nested-type-ascription-syntactically-invalid.rs:30:15
| |
LL | let a: T1 @ Outer(b: T2); LL | let a: T1 @ Outer(b: T2);
| ^ expected one of 7 possible tokens | ^ expected one of 7 possible tokens
error: aborting due to 4 previous errors error: aborting due to 3 previous errors

View file

@ -1,4 +1,4 @@
fn main() { fn main() {
let _ = 0: i32; //~ ERROR: type ascription is experimental let _ = 0: i32; //~ ERROR: expected one of
let _ = 0: i32; // (error only emitted once) let _ = 0: i32; // (error only emitted once)
} }

View file

@ -1,12 +1,10 @@
error[E0658]: type ascription is experimental error: expected one of `.`, `;`, `?`, `else`, or an operator, found `:`
--> $DIR/many-type-ascription.rs:2:13 --> $DIR/many-type-ascription.rs:2:14
| |
LL | let _ = 0: i32; LL | let _ = 0: i32;
| ^^^^^^ | ^ expected one of `.`, `;`, `?`, `else`, or an operator
| |
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information = note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
= help: add `#![feature(type_ascription)]` to the crate attributes to enable
error: aborting due to previous error error: aborting due to previous error
For more information about this error, try `rustc --explain E0658`.

View file

@ -3,8 +3,7 @@ fn fun(x: i32) -> i32 { x }
fn main() { fn main() {
let closure_annotated = |value: i32| -> i32 { let closure_annotated = |value: i32| -> i32 {
temp: i32 = fun(5i32); temp: i32 = fun(5i32);
//~^ ERROR cannot find value `temp` in this scope //~^ ERROR expected identifier, found `:`
temp + value + 1 temp + value + 1
//~^ ERROR cannot find value `temp` in this scope
}; };
} }

View file

@ -1,18 +1,8 @@
error[E0425]: cannot find value `temp` in this scope error: expected identifier, found `:`
--> $DIR/type-ascription-instead-of-let.rs:5:9 --> $DIR/type-ascription-instead-of-let.rs:5:13
| |
LL | temp: i32 = fun(5i32); LL | temp: i32 = fun(5i32);
| ^^^^ | ^ expected identifier
| |
| not found in this scope
| help: maybe you meant to write an assignment here: `let temp`
error[E0425]: cannot find value `temp` in this scope error: aborting due to previous error
--> $DIR/type-ascription-instead-of-let.rs:7:9
|
LL | temp + value + 1
| ^^^^ not found in this scope
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0425`.

View file

@ -1,5 +1,5 @@
// run-rustfix // run-rustfix
fn main() { fn main() {
let _ = Box::new("foo".to_string()); let _ = Box::new("foo".to_string());
//~^ ERROR expected type, found //~^ ERROR path separator must be a double colon
} }

View file

@ -1,5 +1,5 @@
// run-rustfix // run-rustfix
fn main() { fn main() {
let _ = Box:new("foo".to_string()); let _ = Box:new("foo".to_string());
//~^ ERROR expected type, found //~^ ERROR path separator must be a double colon
} }

View file

@ -1,12 +1,10 @@
error: expected type, found `"foo"` error: path separator must be a double colon
--> $DIR/type-ascription-instead-of-method.rs:3:21 --> $DIR/type-ascription-instead-of-method.rs:3:16
| |
LL | let _ = Box:new("foo".to_string()); LL | let _ = Box:new("foo".to_string());
| - ^^^^^ expected type | ^ help: use a double colon instead: `::`
| |
| help: maybe write a path separator here: `::`
| |
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>` = note: if you meant to annotate an expression with a type, the type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
error: aborting due to previous error error: aborting due to previous error

View file

@ -1,6 +1,6 @@
// run-rustfix // run-rustfix
fn main() -> Result<(), ()> { fn main() -> Result<(), ()> {
let _ = vec![Ok(2)].into_iter().collect::<Result<Vec<_>,_>>()?; let _ = vec![Ok(2)].into_iter().collect::<Result<Vec<_>,_>>()?;
//~^ ERROR expected `::`, found `(` //~^ ERROR expected one of
Ok(()) Ok(())
} }

View file

@ -1,6 +1,6 @@
// run-rustfix // run-rustfix
fn main() -> Result<(), ()> { fn main() -> Result<(), ()> {
let _ = vec![Ok(2)].into_iter().collect:<Result<Vec<_>,_>>()?; let _ = vec![Ok(2)].into_iter().collect:<Result<Vec<_>,_>>()?;
//~^ ERROR expected `::`, found `(` //~^ ERROR expected one of
Ok(()) Ok(())
} }

View file

@ -1,12 +1,14 @@
error: expected `::`, found `(` error: expected one of `(`, `.`, `::`, `;`, `?`, `else`, or an operator, found `:`
--> $DIR/type-ascription-instead-of-path-2.rs:3:63 --> $DIR/type-ascription-instead-of-path-2.rs:3:44
| |
LL | let _ = vec![Ok(2)].into_iter().collect:<Result<Vec<_>,_>>()?; LL | let _ = vec![Ok(2)].into_iter().collect:<Result<Vec<_>,_>>()?;
| - ^ expected `::` | ^ expected one of 7 possible tokens
| |
| help: maybe write a path separator here: `::`
| |
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>` = note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
help: maybe write a path separator here
|
LL | let _ = vec![Ok(2)].into_iter().collect::<Result<Vec<_>,_>>()?;
| ~~
error: aborting due to previous error error: aborting due to previous error

View file

@ -1,5 +1,4 @@
fn main() { fn main() {
std:io::stdin(); std:io::stdin();
//~^ ERROR failed to resolve: use of undeclared crate or module `io` //~^ ERROR path separator must be a double colon
//~| ERROR expected value, found crate
} }

View file

@ -1,18 +1,10 @@
error[E0433]: failed to resolve: use of undeclared crate or module `io` error: path separator must be a double colon
--> $DIR/type-ascription-instead-of-path.rs:2:9 --> $DIR/type-ascription-instead-of-path.rs:2:8
| |
LL | std:io::stdin(); LL | std:io::stdin();
| ^^ use of undeclared crate or module `io` | ^ help: use a double colon instead: `::`
error[E0423]: expected value, found crate `std`
--> $DIR/type-ascription-instead-of-path.rs:2:5
| |
LL | std:io::stdin(); = note: if you meant to annotate an expression with a type, the type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
| ^^^- help: maybe you meant to write a path separator here: `::`
| |
| not a value
error: aborting due to 2 previous errors error: aborting due to previous error
Some errors have detailed explanations: E0423, E0433.
For more information about an error, try `rustc --explain E0423`.

View file

@ -1,5 +1,5 @@
// run-rustfix // run-rustfix
fn main() { fn main() {
let _ = Option::Some(""); let _ = Option::Some("");
//~^ ERROR expected type, found //~^ ERROR path separator must be a double colon
} }

View file

@ -1,5 +1,5 @@
// run-rustfix // run-rustfix
fn main() { fn main() {
let _ = Option:Some(""); let _ = Option:Some("");
//~^ ERROR expected type, found //~^ ERROR path separator must be a double colon
} }

View file

@ -1,12 +1,10 @@
error: expected type, found `""` error: path separator must be a double colon
--> $DIR/type-ascription-instead-of-variant.rs:3:25 --> $DIR/type-ascription-instead-of-variant.rs:3:19
| |
LL | let _ = Option:Some(""); LL | let _ = Option:Some("");
| - ^^ expected type | ^ help: use a double colon instead: `::`
| |
| help: maybe write a path separator here: `::`
| |
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>` = note: if you meant to annotate an expression with a type, the type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
error: aborting due to previous error error: aborting due to previous error

View file

@ -1,13 +1,12 @@
// rustfix
struct Reactor { struct Reactor {
input_cells: Vec<usize>, input_cells: Vec<usize>,
} }
impl Reactor { impl Reactor {
pub fn new() -> Self { pub fn new() -> Self { //~ ERROR struct literal body without path
input_cells: Vec::new() input_cells: Vec::new()
//~^ ERROR cannot find value `input_cells` in this scope
//~| ERROR parenthesized type parameters may only be used with a `Fn` trait
//~| ERROR missing generics for struct `Vec`
} }
} }

View file

@ -1,36 +1,18 @@
error[E0425]: cannot find value `input_cells` in this scope error: struct literal body without path
--> $DIR/issue-34255-1.rs:7:9 --> $DIR/issue-34255-1.rs:8:26
| |
LL | input_cells: Vec::new() LL | pub fn new() -> Self {
| ^^^^^^^^^^^ a field by this name exists in `Self` | __________________________^
LL | | input_cells: Vec::new()
LL | | }
| |_____^
| |
help: you might have meant to write a `struct` literal help: you might have forgotten to add the struct literal inside the block
| |
LL ~ pub fn new() -> Self { SomeStruct { LL ~ pub fn new() -> Self { SomeStruct {
LL | input_cells: Vec::new() LL | input_cells: Vec::new()
... LL ~ } }
LL |
LL ~ }}
| |
error[E0214]: parenthesized type parameters may only be used with a `Fn` trait error: aborting due to previous error
--> $DIR/issue-34255-1.rs:7:27
|
LL | input_cells: Vec::new()
| ^^^^^ only `Fn` traits may use parentheses
error[E0107]: missing generics for struct `Vec`
--> $DIR/issue-34255-1.rs:7:22
|
LL | input_cells: Vec::new()
| ^^^ expected at least 1 generic argument
|
help: add missing generic argument
|
LL | input_cells: Vec<T>::new()
| +++
error: aborting due to 3 previous errors
Some errors have detailed explanations: E0107, E0214, E0425.
For more information about an error, try `rustc --explain E0107`.

View file

@ -1,4 +1,4 @@
// run-rustfix // run-rustfix
fn main() { fn main() {
let _ = Option::Some(vec![0, 1]); //~ ERROR expected type, found let _ = Option::Some(vec![0, 1]); //~ ERROR path separator must be a double colon
} }

View file

@ -1,4 +1,4 @@
// run-rustfix // run-rustfix
fn main() { fn main() {
let _ = Option:Some(vec![0, 1]); //~ ERROR expected type, found let _ = Option:Some(vec![0, 1]); //~ ERROR path separator must be a double colon
} }

View file

@ -1,16 +1,10 @@
error: expected type, found `<[_]>::into_vec(#[rustc_box] ::alloc::boxed::Box::new([0, 1]))` error: path separator must be a double colon
--> $DIR/issue-47666.rs:3:25 --> $DIR/issue-47666.rs:3:19
| |
LL | let _ = Option:Some(vec![0, 1]); LL | let _ = Option:Some(vec![0, 1]);
| - ^^^^^^^^^^ | ^ help: use a double colon instead: `::`
| | |
| | expected type
| | in this macro invocation
| | this macro call doesn't expand to a type
| help: maybe write a path separator here: `::`
| |
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>` = note: if you meant to annotate an expression with a type, the type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
= note: this error originates in the macro `$crate::__rust_force_expr` which comes from the expansion of the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to previous error error: aborting due to previous error

View file

@ -3,5 +3,5 @@ use std::collections::BTreeMap;
fn main() { fn main() {
println!("{}", std::mem::size_of::<BTreeMap<u32, u32>>()); println!("{}", std::mem::size_of::<BTreeMap<u32, u32>>());
//~^ ERROR type ascription cannot be followed by a function call //~^ ERROR path separator must be a double colon
} }

View file

@ -3,5 +3,5 @@
fn main() { fn main() {
println!("{}", std::mem:size_of::<BTreeMap<u32, u32>>()); println!("{}", std::mem:size_of::<BTreeMap<u32, u32>>());
//~^ ERROR type ascription cannot be followed by a function call //~^ ERROR path separator must be a double colon
} }

View file

@ -1,12 +1,10 @@
error: type ascription cannot be followed by a function call error: path separator must be a double colon
--> $DIR/issue-54516.rs:5:20 --> $DIR/issue-54516.rs:5:28
| |
LL | println!("{}", std::mem:size_of::<BTreeMap<u32, u32>>()); LL | println!("{}", std::mem:size_of::<BTreeMap<u32, u32>>());
| ^^^^^^^^-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^ help: use a double colon instead: `::`
| |
| help: maybe write a path separator here: `::`
| |
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>` = note: if you meant to annotate an expression with a type, the type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
error: aborting due to previous error error: aborting due to previous error

View file

@ -1,5 +1,5 @@
// run-rustfix // run-rustfix
fn main() { fn main() {
let _: usize = std::mem::size_of::<u32>(); let _: usize = std::mem::size_of::<u32>();
//~^ ERROR type ascription cannot be followed by a function call //~^ ERROR path separator must be a double colon
} }

View file

@ -1,5 +1,5 @@
// run-rustfix // run-rustfix
fn main() { fn main() {
let _: usize = std::mem:size_of::<u32>(); let _: usize = std::mem:size_of::<u32>();
//~^ ERROR type ascription cannot be followed by a function call //~^ ERROR path separator must be a double colon
} }

View file

@ -1,12 +1,10 @@
error: type ascription cannot be followed by a function call error: path separator must be a double colon
--> $DIR/issue-60933.rs:3:20 --> $DIR/issue-60933.rs:3:28
| |
LL | let _: usize = std::mem:size_of::<u32>(); LL | let _: usize = std::mem:size_of::<u32>();
| ^^^^^^^^-^^^^^^^^^^^^^^ | ^ help: use a double colon instead: `::`
| |
| help: maybe write a path separator here: `::`
| |
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>` = note: if you meant to annotate an expression with a type, the type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
error: aborting due to previous error error: aborting due to previous error

View file

@ -1,5 +1,5 @@
// run-rustfix // run-rustfix
fn main() { fn main() {
let mut _foo: i32 = 1; let mut _foo: i32 = 1;
let _foo: i32 = 4; //~ ERROR type ascription is experimental let _foo: i32 = 4; //~ ERROR expected identifier, found `:`
} }

View file

@ -1,5 +1,5 @@
// run-rustfix // run-rustfix
fn main() { fn main() {
let mut _foo: i32 = 1; let mut _foo: i32 = 1;
_foo: i32 = 4; //~ ERROR type ascription is experimental _foo: i32 = 4; //~ ERROR expected identifier, found `:`
} }

View file

@ -1,11 +1,10 @@
error[E0658]: type ascription is experimental error: expected identifier, found `:`
--> $DIR/missing-let-in-binding.rs:4:5 --> $DIR/missing-let-in-binding.rs:4:9
| |
LL | _foo: i32 = 4; LL | _foo: i32 = 4;
| ^^^^^^^^^ | ^ expected identifier
| |
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information = note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
= help: add `#![feature(type_ascription)]` to the crate attributes to enable
help: you might have meant to introduce a new binding help: you might have meant to introduce a new binding
| |
LL | let _foo: i32 = 4; LL | let _foo: i32 = 4;
@ -13,4 +12,3 @@ LL | let _foo: i32 = 4;
error: aborting due to previous error error: aborting due to previous error
For more information about this error, try `rustc --explain E0658`.

View file

@ -1,10 +1,8 @@
#![feature(type_ascription)]
fn main() { fn main() {
println!("test"): println!("test"): //~ ERROR statements are terminated with a semicolon
0; //~ ERROR expected type, found `0` 0;
} }
fn foo() { fn foo() {
println!("test"): 0; //~ ERROR expected type, found `0` println!("test"): 0; //~ ERROR expected one of
} }

View file

@ -1,24 +1,16 @@
error: expected type, found `0` error: statements are terminated with a semicolon
--> $DIR/type-ascription-instead-of-statement-end.rs:5:5 --> $DIR/type-ascription-instead-of-statement-end.rs:2:21
| |
LL | println!("test"): LL | println!("test"):
| - help: try using a semicolon: `;` | ^ help: use a semicolon instead: `;`
LL | 0;
| ^ expected type
| |
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>` = note: if you meant to annotate an expression with a type, the type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
error: expected type, found `0` error: expected one of `.`, `;`, `?`, `}`, or an operator, found `:`
--> $DIR/type-ascription-instead-of-statement-end.rs:9:23 --> $DIR/type-ascription-instead-of-statement-end.rs:7:21
| |
LL | println!("test"): 0; LL | println!("test"): 0;
| - ^ expected type | ^ expected one of `.`, `;`, `?`, `}`, or an operator
| |
| tried to parse a type due to this type ascription
|
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
= note: see issue #23416 <https://github.com/rust-lang/rust/issues/23416> for more information
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View file

@ -1,10 +1,8 @@
// Operator precedence of type ascription // Operator precedence of type ascription
// Type ascription has very high precedence, the same as operator `as` // Type ascription has very high precedence, the same as operator `as`
#![feature(type_ascription)] #![feature(type_ascription)]
use std::ops::*; use std::ops::*;
struct S; struct S;
struct Z; struct Z;
@ -25,30 +23,34 @@ impl Deref for S {
fn deref(&self) -> &Z { panic!() } fn deref(&self) -> &Z { panic!() }
} }
fn main() { fn test1() {
&S: &S; // OK &S: &S; //~ ERROR expected one of
(&S): &S; // OK (&S): &S;
&(S: &S); //~ ERROR mismatched types &(S: &S);
*S: Z; // OK
(*S): Z; // OK
*(S: Z); //~ ERROR mismatched types
//~^ ERROR type `Z` cannot be dereferenced
-S: Z; // OK
(-S): Z; // OK
-(S: Z); //~ ERROR mismatched types
//~^ ERROR cannot apply unary operator `-` to type `Z`
S + Z: Z; // OK
S + (Z: Z); // OK
(S + Z): Z; //~ ERROR mismatched types
S * Z: Z; // OK
S * (Z: Z); // OK
(S * Z): Z; //~ ERROR mismatched types
S .. S: S; // OK
S .. (S: S); // OK
(S .. S): S; //~ ERROR mismatched types
} }
fn test2() {
*(S: Z); //~ ERROR expected identifier
}
fn test3() {
-(S: Z); //~ ERROR expected identifier
}
fn test4() {
(S + Z): Z; //~ ERROR expected one of
}
fn test5() {
(S * Z): Z; //~ ERROR expected one of
}
fn test6() {
S .. S: S; //~ ERROR expected identifier, found `:`
}
fn test7() {
(S .. S): S; //~ ERROR expected one of
}
fn main() {}

View file

@ -1,63 +1,46 @@
error[E0308]: mismatched types error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found `:`
--> $DIR/type-ascription-precedence.rs:31:7 --> $DIR/type-ascription-precedence.rs:27:7
| |
LL | &(S: &S); LL | &S: &S;
| ^ expected `&S`, found `S` | ^ expected one of 8 possible tokens
error[E0308]: mismatched types error: expected identifier, found `:`
--> $DIR/type-ascription-precedence.rs:35:7 --> $DIR/type-ascription-precedence.rs:33:8
| |
LL | *(S: Z); LL | *(S: Z);
| ^ expected `Z`, found `S` | ^ expected identifier
error[E0614]: type `Z` cannot be dereferenced error: expected identifier, found `:`
--> $DIR/type-ascription-precedence.rs:35:5 --> $DIR/type-ascription-precedence.rs:37:8
|
LL | *(S: Z);
| ^^^^^^^
error[E0308]: mismatched types
--> $DIR/type-ascription-precedence.rs:40:7
| |
LL | -(S: Z); LL | -(S: Z);
| ^ expected `Z`, found `S` | ^ expected identifier
error[E0600]: cannot apply unary operator `-` to type `Z` error: expected one of `.`, `;`, `?`, `}`, or an operator, found `:`
--> $DIR/type-ascription-precedence.rs:40:5 --> $DIR/type-ascription-precedence.rs:41:12
|
LL | -(S: Z);
| ^^^^^^^ cannot apply unary operator `-`
|
note: an implementation of `std::ops::Neg` might be missing for `Z`
--> $DIR/type-ascription-precedence.rs:9:1
|
LL | struct Z;
| ^^^^^^^^ must implement `std::ops::Neg`
note: the trait `std::ops::Neg` must be implemented
--> $SRC_DIR/core/src/ops/arith.rs:LL:COL
error[E0308]: mismatched types
--> $DIR/type-ascription-precedence.rs:45:5
| |
LL | (S + Z): Z; LL | (S + Z): Z;
| ^^^^^^^ expected `Z`, found `S` | ^ expected one of `.`, `;`, `?`, `}`, or an operator
error[E0308]: mismatched types error: expected one of `.`, `;`, `?`, `}`, or an operator, found `:`
--> $DIR/type-ascription-precedence.rs:49:5 --> $DIR/type-ascription-precedence.rs:45:12
| |
LL | (S * Z): Z; LL | (S * Z): Z;
| ^^^^^^^ expected `Z`, found `S` | ^ expected one of `.`, `;`, `?`, `}`, or an operator
error[E0308]: mismatched types error: expected identifier, found `:`
--> $DIR/type-ascription-precedence.rs:53:5 --> $DIR/type-ascription-precedence.rs:49:11
|
LL | S .. S: S;
| ^ expected identifier
|
= note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
error: expected one of `.`, `;`, `?`, `}`, or an operator, found `:`
--> $DIR/type-ascription-precedence.rs:53:13
| |
LL | (S .. S): S; LL | (S .. S): S;
| ^^^^^^^^ expected `S`, found `Range<S>` | ^ expected one of `.`, `;`, `?`, `}`, or an operator
|
= note: expected struct `S`
found struct `std::ops::Range<S>`
error: aborting due to 8 previous errors error: aborting due to 7 previous errors
Some errors have detailed explanations: E0308, E0600, E0614.
For more information about an error, try `rustc --explain E0308`.

View file

@ -1,9 +1,7 @@
// run-rustfix // run-rustfix
#![feature(type_ascription)]
fn main() { fn main() {
f() ; f() ; //~ ERROR statements are terminated with a semicolon
f(); //~ ERROR expected type, found function f();
} }
fn f() {} fn f() {}

View file

@ -1,9 +1,7 @@
// run-rustfix // run-rustfix
#![feature(type_ascription)]
fn main() { fn main() {
f() : f() : //~ ERROR statements are terminated with a semicolon
f(); //~ ERROR expected type, found function f();
} }
fn f() {} fn f() {}

View file

@ -1,11 +1,10 @@
error[E0573]: expected type, found function `f` error: statements are terminated with a semicolon
--> $DIR/type-ascription-with-fn-call.rs:6:5 --> $DIR/type-ascription-with-fn-call.rs:3:10
| |
LL | f() : LL | f() :
| - help: maybe you meant to write `;` here | ^ help: use a semicolon instead: `;`
LL | f(); |
| ^^^ expecting a type here because of type ascription = note: if you meant to annotate an expression with a type, the type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
error: aborting due to previous error error: aborting due to previous error
For more information about this error, try `rustc --explain E0573`.