, args: Vec>,
@@ -427,28 +326,10 @@ impl<'a> ExtCtxt<'a> {
self.expr_lit(span, ast::LitKind::Int(i as u128,
ast::LitIntType::Unsigned(ast::UintTy::Usize)))
}
- pub fn expr_isize(&self, sp: Span, i: isize) -> P {
- if i < 0 {
- let i = (-i) as u128;
- let lit_ty = ast::LitIntType::Signed(ast::IntTy::Isize);
- let lit = self.expr_lit(sp, ast::LitKind::Int(i, lit_ty));
- self.expr_unary(sp, ast::UnOp::Neg, lit)
- } else {
- self.expr_lit(sp, ast::LitKind::Int(i as u128,
- ast::LitIntType::Signed(ast::IntTy::Isize)))
- }
- }
pub fn expr_u32(&self, sp: Span, u: u32) -> P {
self.expr_lit(sp, ast::LitKind::Int(u as u128,
ast::LitIntType::Unsigned(ast::UintTy::U32)))
}
- pub fn expr_u16(&self, sp: Span, u: u16) -> P {
- self.expr_lit(sp, ast::LitKind::Int(u as u128,
- ast::LitIntType::Unsigned(ast::UintTy::U16)))
- }
- pub fn expr_u8(&self, sp: Span, u: u8) -> P {
- self.expr_lit(sp, ast::LitKind::Int(u as u128, ast::LitIntType::Unsigned(ast::UintTy::U8)))
- }
pub fn expr_bool(&self, sp: Span, value: bool) -> P {
self.expr_lit(sp, ast::LitKind::Bool(value))
}
@@ -456,10 +337,6 @@ impl<'a> ExtCtxt<'a> {
pub fn expr_vec(&self, sp: Span, exprs: Vec>) -> P {
self.expr(sp, ast::ExprKind::Array(exprs))
}
- pub fn expr_vec_ng(&self, sp: Span) -> P {
- self.expr_call_global(sp, self.std_path(&[sym::vec, sym::Vec, sym::new]),
- Vec::new())
- }
pub fn expr_vec_slice(&self, sp: Span, exprs: Vec>) -> P {
self.expr_addr_of(sp, self.expr_vec(sp, exprs))
}
@@ -476,16 +353,6 @@ impl<'a> ExtCtxt<'a> {
self.expr_call_global(sp, some, vec![expr])
}
- pub fn expr_none(&self, sp: Span) -> P {
- let none = self.std_path(&[sym::option, sym::Option, sym::None]);
- let none = self.path_global(sp, none);
- self.expr_path(none)
- }
-
- pub fn expr_break(&self, sp: Span) -> P {
- self.expr(sp, ast::ExprKind::Break(None, None))
- }
-
pub fn expr_tuple(&self, sp: Span, exprs: Vec>) -> P {
self.expr(sp, ast::ExprKind::Tup(exprs))
}
@@ -514,11 +381,6 @@ impl<'a> ExtCtxt<'a> {
self.expr_call_global(sp, ok, vec![expr])
}
- pub fn expr_err(&self, sp: Span, expr: P) -> P {
- let err = self.std_path(&[sym::result, sym::Result, sym::Err]);
- self.expr_call_global(sp, err, vec![expr])
- }
-
pub fn expr_try(&self, sp: Span, head: P) -> P {
let ok = self.std_path(&[sym::result, sym::Result, sym::Ok]);
let ok_path = self.path_global(sp, ok);
@@ -635,10 +497,6 @@ impl<'a> ExtCtxt<'a> {
self.expr(span, ast::ExprKind::If(cond, self.block_expr(then), els))
}
- pub fn expr_loop(&self, span: Span, block: P) -> P {
- self.expr(span, ast::ExprKind::Loop(block, None))
- }
-
pub fn lambda_fn_decl(&self,
span: Span,
fn_decl: P,
@@ -659,7 +517,7 @@ impl<'a> ExtCtxt<'a> {
body: P)
-> P {
let fn_decl = self.fn_decl(
- ids.iter().map(|id| self.param(span, *id, self.ty_infer(span))).collect(),
+ ids.iter().map(|id| self.param(span, *id, self.ty(span, ast::TyKind::Infer))).collect(),
ast::FunctionRetTy::Default(span));
// FIXME -- We are using `span` as the span of the `|...|`
@@ -682,16 +540,6 @@ impl<'a> ExtCtxt<'a> {
self.lambda(span, vec![ident], body)
}
- pub fn lambda_stmts(&self,
- span: Span,
- ids: Vec,
- stmts: Vec)
- -> P {
- self.lambda(span, ids, self.expr_block(self.block(span, stmts)))
- }
- pub fn lambda_stmts_0(&self, span: Span, stmts: Vec) -> P {
- self.lambda0(span, self.expr_block(self.block(span, stmts)))
- }
pub fn lambda_stmts_1(&self, span: Span, stmts: Vec,
ident: ast::Ident) -> P {
self.lambda1(span, self.expr_block(self.block(span, stmts)), ident)
@@ -733,43 +581,6 @@ impl<'a> ExtCtxt<'a> {
})
}
- pub fn item_fn_poly(&self,
- span: Span,
- name: Ident,
- inputs: Vec ,
- output: P,
- generics: Generics,
- body: P) -> P {
- self.item(span,
- name,
- Vec::new(),
- ast::ItemKind::Fn(self.fn_decl(inputs, ast::FunctionRetTy::Ty(output)),
- ast::FnHeader {
- unsafety: ast::Unsafety::Normal,
- asyncness: dummy_spanned(ast::IsAsync::NotAsync),
- constness: dummy_spanned(ast::Constness::NotConst),
- abi: Abi::Rust,
- },
- generics,
- body))
- }
-
- pub fn item_fn(&self,
- span: Span,
- name: Ident,
- inputs: Vec ,
- output: P,
- body: P
- ) -> P {
- self.item_fn_poly(
- span,
- name,
- inputs,
- output,
- Generics::default(),
- body)
- }
-
pub fn variant(&self, span: Span, ident: Ident, tys: Vec> ) -> ast::Variant {
let fields: Vec<_> = tys.into_iter().map(|ty| {
ast::StructField {
@@ -800,52 +611,6 @@ impl<'a> ExtCtxt<'a> {
}
}
- pub fn item_enum_poly(&self, span: Span, name: Ident,
- enum_definition: ast::EnumDef,
- generics: Generics) -> P {
- self.item(span, name, Vec::new(), ast::ItemKind::Enum(enum_definition, generics))
- }
-
- pub fn item_enum(&self, span: Span, name: Ident,
- enum_definition: ast::EnumDef) -> P {
- self.item_enum_poly(span, name, enum_definition,
- Generics::default())
- }
-
- pub fn item_struct(&self, span: Span, name: Ident,
- struct_def: ast::VariantData) -> P {
- self.item_struct_poly(
- span,
- name,
- struct_def,
- Generics::default()
- )
- }
-
- pub fn item_struct_poly(&self, span: Span, name: Ident,
- struct_def: ast::VariantData, generics: Generics) -> P {
- self.item(span, name, Vec::new(), ast::ItemKind::Struct(struct_def, generics))
- }
-
- pub fn item_mod(&self, span: Span, inner_span: Span, name: Ident,
- attrs: Vec,
- items: Vec>) -> P {
- self.item(
- span,
- name,
- attrs,
- ast::ItemKind::Mod(ast::Mod {
- inner: inner_span,
- items,
- inline: true
- })
- )
- }
-
- pub fn item_extern_crate(&self, span: Span, name: Ident) -> P {
- self.item(span, name, Vec::new(), ast::ItemKind::ExternCrate(None))
- }
-
pub fn item_static(&self,
span: Span,
name: Ident,
@@ -865,15 +630,6 @@ impl<'a> ExtCtxt<'a> {
self.item(span, name, Vec::new(), ast::ItemKind::Const(ty, expr))
}
- pub fn item_ty_poly(&self, span: Span, name: Ident, ty: P,
- generics: Generics) -> P {
- self.item(span, name, Vec::new(), ast::ItemKind::TyAlias(ty, generics))
- }
-
- pub fn item_ty(&self, span: Span, name: Ident, ty: P) -> P {
- self.item_ty_poly(span, name, ty, Generics::default())
- }
-
pub fn attribute(&self, mi: ast::MetaItem) -> ast::Attribute {
attr::mk_attr_outer(mi)
}
@@ -881,70 +637,4 @@ impl<'a> ExtCtxt<'a> {
pub fn meta_word(&self, sp: Span, w: ast::Name) -> ast::MetaItem {
attr::mk_word_item(Ident::new(w, sp))
}
-
- pub fn meta_list_item_word(&self, sp: Span, w: ast::Name) -> ast::NestedMetaItem {
- attr::mk_nested_word_item(Ident::new(w, sp))
- }
-
- pub fn meta_list(&self, sp: Span, name: ast::Name, mis: Vec)
- -> ast::MetaItem {
- attr::mk_list_item(Ident::new(name, sp), mis)
- }
-
- pub fn meta_name_value(&self, span: Span, name: ast::Name, lit_kind: ast::LitKind)
- -> ast::MetaItem {
- attr::mk_name_value_item(Ident::new(name, span), lit_kind, span)
- }
-
- pub fn item_use(&self, sp: Span,
- vis: ast::Visibility, vp: P) -> P {
- P(ast::Item {
- id: ast::DUMMY_NODE_ID,
- ident: Ident::invalid(),
- attrs: vec![],
- node: ast::ItemKind::Use(vp),
- vis,
- span: sp,
- tokens: None,
- })
- }
-
- pub fn item_use_simple(&self, sp: Span, vis: ast::Visibility, path: ast::Path) -> P {
- self.item_use_simple_(sp, vis, None, path)
- }
-
- pub fn item_use_simple_(&self, sp: Span, vis: ast::Visibility,
- rename: Option, path: ast::Path) -> P {
- self.item_use(sp, vis, P(ast::UseTree {
- span: sp,
- prefix: path,
- kind: ast::UseTreeKind::Simple(rename, ast::DUMMY_NODE_ID, ast::DUMMY_NODE_ID),
- }))
- }
-
- pub fn item_use_list(&self, sp: Span, vis: ast::Visibility,
- path: Vec, imports: &[ast::Ident]) -> P {
- let imports = imports.iter().map(|id| {
- (ast::UseTree {
- span: sp,
- prefix: self.path(sp, vec![*id]),
- kind: ast::UseTreeKind::Simple(None, ast::DUMMY_NODE_ID, ast::DUMMY_NODE_ID),
- }, ast::DUMMY_NODE_ID)
- }).collect();
-
- self.item_use(sp, vis, P(ast::UseTree {
- span: sp,
- prefix: self.path(sp, path),
- kind: ast::UseTreeKind::Nested(imports),
- }))
- }
-
- pub fn item_use_glob(&self, sp: Span,
- vis: ast::Visibility, path: Vec) -> P {
- self.item_use(sp, vis, P(ast::UseTree {
- span: sp,
- prefix: self.path(sp, path),
- kind: ast::UseTreeKind::Glob,
- }))
- }
}
diff --git a/src/libsyntax/ext/proc_macro_server.rs b/src/libsyntax/ext/proc_macro_server.rs
index 544ec789d80a9..dfec9ee28809a 100644
--- a/src/libsyntax/ext/proc_macro_server.rs
+++ b/src/libsyntax/ext/proc_macro_server.rs
@@ -4,7 +4,7 @@ use crate::parse::{self, token, ParseSess};
use crate::parse::lexer::comments;
use crate::tokenstream::{self, DelimSpan, IsJoint::*, TokenStream, TreeAndJoint};
-use errors::{Diagnostic, DiagnosticBuilder};
+use errors::Diagnostic;
use rustc_data_structures::sync::Lrc;
use syntax_pos::{BytePos, FileName, MultiSpan, Pos, SourceFile, Span};
use syntax_pos::symbol::{kw, sym, Symbol};
@@ -650,7 +650,7 @@ impl server::Diagnostic for Rustc<'_> {
diag.sub(level.to_internal(), msg, MultiSpan::from_spans(spans), None);
}
fn emit(&mut self, diag: Self::Diagnostic) {
- DiagnosticBuilder::new_diagnostic(&self.sess.span_diagnostic, diag).emit()
+ self.sess.span_diagnostic.emit_diagnostic(&diag);
}
}
diff --git a/src/libsyntax/ext/tt/transcribe.rs b/src/libsyntax/ext/tt/transcribe.rs
index 23735727fe8cf..f9c07e3a2e4ff 100644
--- a/src/libsyntax/ext/tt/transcribe.rs
+++ b/src/libsyntax/ext/tt/transcribe.rs
@@ -8,6 +8,7 @@ use crate::tokenstream::{DelimSpan, TokenStream, TokenTree, TreeAndJoint};
use smallvec::{smallvec, SmallVec};
+use errors::pluralise;
use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::sync::Lrc;
use syntax_pos::hygiene::{ExpnId, Transparency};
@@ -348,10 +349,10 @@ impl LockstepIterSize {
"meta-variable `{}` repeats {} time{}, but `{}` repeats {} time{}",
l_id,
l_len,
- if l_len != 1 { "s" } else { "" },
+ pluralise!(l_len),
r_id,
r_len,
- if r_len != 1 { "s" } else { "" },
+ pluralise!(r_len),
);
LockstepIterSize::Contradiction(msg)
}
diff --git a/src/libsyntax/feature_gate/accepted.rs b/src/libsyntax/feature_gate/accepted.rs
index eff9f90a8619e..5538daf388e2f 100644
--- a/src/libsyntax/feature_gate/accepted.rs
+++ b/src/libsyntax/feature_gate/accepted.rs
@@ -243,6 +243,8 @@ declare_features! (
(accepted, async_await, "1.39.0", Some(50547), None),
/// Allows mixing bind-by-move in patterns and references to those identifiers in guards.
(accepted, bind_by_move_pattern_guards, "1.39.0", Some(15287), None),
+ /// Allows attributes in formal function parameters.
+ (accepted, param_attrs, "1.39.0", Some(60406), None),
// -------------------------------------------------------------------------
// feature-group-end: accepted features
diff --git a/src/libsyntax/feature_gate/active.rs b/src/libsyntax/feature_gate/active.rs
index dd78777b56986..38c16dbac6ab7 100644
--- a/src/libsyntax/feature_gate/active.rs
+++ b/src/libsyntax/feature_gate/active.rs
@@ -489,9 +489,6 @@ declare_features! (
/// Allows the user of associated type bounds.
(active, associated_type_bounds, "1.34.0", Some(52662), None),
- /// Attributes on formal function params.
- (active, param_attrs, "1.36.0", Some(60406), None),
-
/// Allows calling constructor functions in `const fn`.
(active, const_constructor, "1.37.0", Some(61456), None),
diff --git a/src/libsyntax/feature_gate/check.rs b/src/libsyntax/feature_gate/check.rs
index b4491a87f0600..b50ca1ad1cf2b 100644
--- a/src/libsyntax/feature_gate/check.rs
+++ b/src/libsyntax/feature_gate/check.rs
@@ -812,7 +812,6 @@ pub fn check_crate(krate: &ast::Crate,
}
}
- gate_all!(param_attrs, "attributes on function parameters are unstable");
gate_all!(let_chains, "`let` expressions in this position are experimental");
gate_all!(async_closure, "async closures are unstable");
gate_all!(yields, generators, "yield syntax is experimental");
diff --git a/src/libsyntax/json.rs b/src/libsyntax/json.rs
index ada46f7bc5a74..5cdea3aabbe11 100644
--- a/src/libsyntax/json.rs
+++ b/src/libsyntax/json.rs
@@ -12,7 +12,7 @@
use crate::source_map::{SourceMap, FilePathMapping};
use errors::registry::Registry;
-use errors::{DiagnosticBuilder, SubDiagnostic, CodeSuggestion, SourceMapper};
+use errors::{SubDiagnostic, CodeSuggestion, SourceMapper};
use errors::{DiagnosticId, Applicability};
use errors::emitter::{Emitter, HumanReadableErrorType};
@@ -32,6 +32,7 @@ pub struct JsonEmitter {
pretty: bool,
ui_testing: bool,
json_rendered: HumanReadableErrorType,
+ external_macro_backtrace: bool,
}
impl JsonEmitter {
@@ -40,6 +41,7 @@ impl JsonEmitter {
source_map: Lrc,
pretty: bool,
json_rendered: HumanReadableErrorType,
+ external_macro_backtrace: bool,
) -> JsonEmitter {
JsonEmitter {
dst: Box::new(io::stderr()),
@@ -48,13 +50,18 @@ impl JsonEmitter {
pretty,
ui_testing: false,
json_rendered,
+ external_macro_backtrace,
}
}
- pub fn basic(pretty: bool, json_rendered: HumanReadableErrorType) -> JsonEmitter {
+ pub fn basic(
+ pretty: bool,
+ json_rendered: HumanReadableErrorType,
+ external_macro_backtrace: bool,
+ ) -> JsonEmitter {
let file_path_mapping = FilePathMapping::empty();
JsonEmitter::stderr(None, Lrc::new(SourceMap::new(file_path_mapping)),
- pretty, json_rendered)
+ pretty, json_rendered, external_macro_backtrace)
}
pub fn new(
@@ -63,6 +70,7 @@ impl JsonEmitter {
source_map: Lrc,
pretty: bool,
json_rendered: HumanReadableErrorType,
+ external_macro_backtrace: bool,
) -> JsonEmitter {
JsonEmitter {
dst,
@@ -71,6 +79,7 @@ impl JsonEmitter {
pretty,
ui_testing: false,
json_rendered,
+ external_macro_backtrace,
}
}
@@ -80,8 +89,8 @@ impl JsonEmitter {
}
impl Emitter for JsonEmitter {
- fn emit_diagnostic(&mut self, db: &DiagnosticBuilder<'_>) {
- let data = Diagnostic::from_diagnostic_builder(db, self);
+ fn emit_diagnostic(&mut self, db: &errors::Diagnostic) {
+ let data = Diagnostic::from_errors_diagnostic(db, self);
let result = if self.pretty {
writeln!(&mut self.dst, "{}", as_pretty_json(&data))
} else {
@@ -189,7 +198,7 @@ struct ArtifactNotification<'a> {
}
impl Diagnostic {
- fn from_diagnostic_builder(db: &DiagnosticBuilder<'_>,
+ fn from_errors_diagnostic(db: &errors::Diagnostic,
je: &JsonEmitter)
-> Diagnostic {
let sugg = db.suggestions.iter().map(|sugg| {
@@ -219,8 +228,9 @@ impl Diagnostic {
}
let buf = BufWriter::default();
let output = buf.clone();
- je.json_rendered.new_emitter(Box::new(buf), Some(je.sm.clone()), false, None)
- .ui_testing(je.ui_testing).emit_diagnostic(db);
+ je.json_rendered.new_emitter(
+ Box::new(buf), Some(je.sm.clone()), false, None, je.external_macro_backtrace
+ ).ui_testing(je.ui_testing).emit_diagnostic(db);
let output = Arc::try_unwrap(output.0).unwrap().into_inner().unwrap();
let output = String::from_utf8(output).unwrap();
diff --git a/src/libsyntax/lib.rs b/src/libsyntax/lib.rs
index aaf6f3e537eb6..b4ae1e87bca28 100644
--- a/src/libsyntax/lib.rs
+++ b/src/libsyntax/lib.rs
@@ -60,12 +60,12 @@ macro_rules! panictry {
macro_rules! panictry_buffer {
($handler:expr, $e:expr) => ({
use std::result::Result::{Ok, Err};
- use errors::{FatalError, DiagnosticBuilder};
+ use errors::FatalError;
match $e {
Ok(e) => e,
Err(errs) => {
for e in errs {
- DiagnosticBuilder::new_diagnostic($handler, e).emit();
+ $handler.emit_diagnostic(&e);
}
FatalError.raise()
}
diff --git a/src/libsyntax/parse/attr.rs b/src/libsyntax/parse/attr.rs
index 9aa1ec0b14fe9..cf6151d17b1bd 100644
--- a/src/libsyntax/parse/attr.rs
+++ b/src/libsyntax/parse/attr.rs
@@ -19,13 +19,6 @@ const DEFAULT_UNEXPECTED_INNER_ATTR_ERR_MSG: &str = "an inner attribute is not \
permitted in this context";
impl<'a> Parser<'a> {
- crate fn parse_param_attributes(&mut self) -> PResult<'a, Vec> {
- let attrs = self.parse_outer_attributes()?;
- self.sess.gated_spans.param_attrs.borrow_mut()
- .extend(attrs.iter().map(|a| a.span));
- Ok(attrs)
- }
-
/// Parses attributes that appear before an item.
crate fn parse_outer_attributes(&mut self) -> PResult<'a, Vec> {
let mut attrs: Vec = Vec::new();
@@ -309,14 +302,14 @@ impl<'a> Parser<'a> {
Ok(lit) => {
return Ok(ast::NestedMetaItem::Literal(lit))
}
- Err(ref mut err) => self.diagnostic().cancel(err)
+ Err(ref mut err) => err.cancel(),
}
match self.parse_meta_item() {
Ok(mi) => {
return Ok(ast::NestedMetaItem::MetaItem(mi))
}
- Err(ref mut err) => self.diagnostic().cancel(err)
+ Err(ref mut err) => err.cancel(),
}
let found = self.this_token_to_string();
diff --git a/src/libsyntax/parse/diagnostics.rs b/src/libsyntax/parse/diagnostics.rs
index b74f2492c351f..59de5f1412358 100644
--- a/src/libsyntax/parse/diagnostics.rs
+++ b/src/libsyntax/parse/diagnostics.rs
@@ -11,7 +11,7 @@ use crate::ptr::P;
use crate::symbol::{kw, sym};
use crate::ThinVec;
use crate::util::parser::AssocOp;
-use errors::{Applicability, DiagnosticBuilder, DiagnosticId};
+use errors::{Applicability, DiagnosticBuilder, DiagnosticId, pluralise};
use rustc_data_structures::fx::FxHashSet;
use syntax_pos::{Span, DUMMY_SP, MultiSpan, SpanSnippetError};
use log::{debug, trace};
@@ -197,10 +197,6 @@ impl<'a> Parser<'a> {
self.sess.span_diagnostic.span_bug(sp, m)
}
- crate fn cancel(&self, err: &mut DiagnosticBuilder<'_>) {
- self.sess.span_diagnostic.cancel(err)
- }
-
crate fn diagnostic(&self) -> &'a errors::Handler {
&self.sess.span_diagnostic
}
@@ -426,15 +422,13 @@ impl<'a> Parser<'a> {
/// Eats and discards tokens until one of `kets` is encountered. Respects token trees,
/// passes through any errors encountered. Used for error recovery.
crate fn eat_to_tokens(&mut self, kets: &[&TokenKind]) {
- let handler = self.diagnostic();
-
if let Err(ref mut err) = self.parse_seq_to_before_tokens(
kets,
SeqSep::none(),
TokenExpectType::Expect,
|p| Ok(p.parse_token_tree()),
) {
- handler.cancel(err);
+ err.cancel();
}
}
@@ -532,15 +526,15 @@ impl<'a> Parser<'a> {
self.eat_to_tokens(&[&end]);
let span = lo.until(self.token.span);
- let plural = number_of_gt > 1 || number_of_shr >= 1;
+ let total_num_of_gt = number_of_gt + number_of_shr * 2;
self.diagnostic()
.struct_span_err(
span,
- &format!("unmatched angle bracket{}", if plural { "s" } else { "" }),
+ &format!("unmatched angle bracket{}", pluralise!(total_num_of_gt)),
)
.span_suggestion(
span,
- &format!("remove extra angle bracket{}", if plural { "s" } else { "" }),
+ &format!("remove extra angle bracket{}", pluralise!(total_num_of_gt)),
String::new(),
Applicability::MachineApplicable,
)
diff --git a/src/libsyntax/parse/lexer/tests.rs b/src/libsyntax/parse/lexer/tests.rs
index c1ec41902e2be..de301b1fc499d 100644
--- a/src/libsyntax/parse/lexer/tests.rs
+++ b/src/libsyntax/parse/lexer/tests.rs
@@ -18,6 +18,7 @@ fn mk_sess(sm: Lrc) -> ParseSess {
false,
false,
None,
+ false,
);
ParseSess::with_span_handler(Handler::with_emitter(true, None, Box::new(emitter)), sm)
}
diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs
index 2441a027f9940..fa4c10431228a 100644
--- a/src/libsyntax/parse/mod.rs
+++ b/src/libsyntax/parse/mod.rs
@@ -49,8 +49,6 @@ static_assert_size!(PResult<'_, bool>, 16);
/// used and should be feature gated accordingly in `check_crate`.
#[derive(Default)]
pub struct GatedSpans {
- /// Spans collected for gating `param_attrs`, e.g. `fn foo(#[attr] x: u8) {}`.
- pub param_attrs: Lock>,
/// Spans collected for gating `let_chains`, e.g. `if a && let b = c {}`.
pub let_chains: Lock>,
/// Spans collected for gating `async_closure`, e.g. `async || ..`.
@@ -306,7 +304,7 @@ fn file_to_source_file(sess: &ParseSess, path: &Path, spanopt: Option)
match try_file_to_source_file(sess, path, spanopt) {
Ok(source_file) => source_file,
Err(d) => {
- DiagnosticBuilder::new_diagnostic(&sess.span_diagnostic, d).emit();
+ sess.span_diagnostic.emit_diagnostic(&d);
FatalError.raise();
}
}
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index fcebfa2996233..b2b6504919e96 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -979,7 +979,7 @@ impl<'a> Parser<'a> {
is_name_required: impl Fn(&token::Token) -> bool,
) -> PResult<'a, Param> {
let lo = self.token.span;
- let attrs = self.parse_param_attributes()?;
+ let attrs = self.parse_outer_attributes()?;
if let Some(mut param) = self.parse_self_param()? {
param.attrs = attrs.into();
return self.recover_bad_self_param(param, is_trait_item);
@@ -1362,7 +1362,7 @@ impl<'a> Parser<'a> {
/// Returns the parsed optional self parameter with attributes and whether a self
/// shortcut was used.
fn parse_self_parameter_with_attrs(&mut self) -> PResult<'a, Option> {
- let attrs = self.parse_param_attributes()?;
+ let attrs = self.parse_outer_attributes()?;
let param_opt = self.parse_self_param()?;
Ok(param_opt.map(|mut param| {
param.attrs = attrs.into();
diff --git a/src/libsyntax/parse/parser/expr.rs b/src/libsyntax/parse/parser/expr.rs
index 31b28443abbc3..d0c865a7b8e83 100644
--- a/src/libsyntax/parse/parser/expr.rs
+++ b/src/libsyntax/parse/parser/expr.rs
@@ -66,6 +66,10 @@ pub(super) enum LhsExpr {
}
impl From