Skip to content

Commit 484c64b

Browse files
committed
Merge from rustc
2 parents 2cbbd6c + 3380bfd commit 484c64b

File tree

159 files changed

+2679
-1461
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

159 files changed

+2679
-1461
lines changed

bootstrap.example.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,15 @@
467467
# Whether to use the precompiled stage0 libtest with compiletest.
468468
#build.compiletest-use-stage0-libtest = true
469469

470+
# Default value for the `--extra-checks` flag of tidy.
471+
#
472+
# See `./x test tidy --help` for details.
473+
#
474+
# Note that if any value is manually given to bootstrap such as
475+
# `./x test tidy --extra-checks=js`, this value is ignored.
476+
# Use `--extra-checks=''` to temporarily disable all extra checks.
477+
#build.tidy-extra-checks = ""
478+
470479
# Indicates whether ccache is used when building certain artifacts (e.g. LLVM).
471480
# Set to `true` to use the first `ccache` in PATH, or set an absolute path to use
472481
# a specific version.

compiler/rustc_ast/src/ast.rs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -385,8 +385,8 @@ pub enum GenericParamKind {
385385
},
386386
Const {
387387
ty: P<Ty>,
388-
/// Span of the `const` keyword.
389-
kw_span: Span,
388+
/// Span of the whole parameter definition, including default.
389+
span: Span,
390390
/// Optional default value for the const generic param.
391391
default: Option<AnonConst>,
392392
},
@@ -410,10 +410,7 @@ impl GenericParam {
410410
self.ident.span
411411
}
412412
GenericParamKind::Type { default: Some(ty) } => self.ident.span.to(ty.span),
413-
GenericParamKind::Const { kw_span, default: Some(default), .. } => {
414-
kw_span.to(default.value.span)
415-
}
416-
GenericParamKind::Const { kw_span, default: None, ty } => kw_span.to(ty.span),
413+
GenericParamKind::Const { span, .. } => *span,
417414
}
418415
}
419416
}
@@ -1390,6 +1387,7 @@ impl Expr {
13901387
path.clone(),
13911388
TraitBoundModifiers::NONE,
13921389
self.span,
1390+
Parens::No,
13931391
))),
13941392
_ => None,
13951393
}
@@ -3366,6 +3364,13 @@ pub struct TraitRef {
33663364
pub ref_id: NodeId,
33673365
}
33683366

3367+
/// Whether enclosing parentheses are present or not.
3368+
#[derive(Clone, Encodable, Decodable, Debug)]
3369+
pub enum Parens {
3370+
Yes,
3371+
No,
3372+
}
3373+
33693374
#[derive(Clone, Encodable, Decodable, Debug)]
33703375
pub struct PolyTraitRef {
33713376
/// The `'a` in `for<'a> Foo<&'a T>`.
@@ -3378,6 +3383,10 @@ pub struct PolyTraitRef {
33783383
pub trait_ref: TraitRef,
33793384

33803385
pub span: Span,
3386+
3387+
/// When `Yes`, the first and last character of `span` are an opening
3388+
/// and a closing paren respectively.
3389+
pub parens: Parens,
33813390
}
33823391

33833392
impl PolyTraitRef {
@@ -3386,12 +3395,14 @@ impl PolyTraitRef {
33863395
path: Path,
33873396
modifiers: TraitBoundModifiers,
33883397
span: Span,
3398+
parens: Parens,
33893399
) -> Self {
33903400
PolyTraitRef {
33913401
bound_generic_params: generic_params,
33923402
modifiers,
33933403
trait_ref: TraitRef { path, ref_id: DUMMY_NODE_ID },
33943404
span,
3405+
parens,
33953406
}
33963407
}
33973408
}

compiler/rustc_ast/src/visit.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,7 +1142,7 @@ macro_rules! common_visitor_and_walkers {
11421142
vis: &mut V,
11431143
p: &$($lt)? $($mut)? PolyTraitRef,
11441144
) -> V::Result {
1145-
let PolyTraitRef { bound_generic_params, modifiers, trait_ref, span } = p;
1145+
let PolyTraitRef { bound_generic_params, modifiers, trait_ref, span, parens: _ } = p;
11461146
try_visit!(visit_modifiers(vis, modifiers));
11471147
try_visit!(visit_generic_params(vis, bound_generic_params));
11481148
try_visit!(vis.visit_trait_ref(trait_ref));
@@ -1350,9 +1350,10 @@ macro_rules! common_visitor_and_walkers {
13501350
match kind {
13511351
GenericParamKind::Lifetime => (),
13521352
GenericParamKind::Type { default } => visit_opt!(vis, visit_ty, default),
1353-
GenericParamKind::Const { ty, default, kw_span: _ } => {
1353+
GenericParamKind::Const { ty, default, span } => {
13541354
try_visit!(vis.visit_ty(ty));
13551355
visit_opt!(vis, visit_anon_const, default);
1356+
try_visit!(visit_span(vis, span));
13561357
}
13571358
}
13581359
if let Some(sp) = colon_span {

compiler/rustc_ast_lowering/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1209,6 +1209,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
12091209
modifiers: TraitBoundModifiers::NONE,
12101210
trait_ref: TraitRef { path: path.clone(), ref_id: t.id },
12111211
span: t.span,
1212+
parens: ast::Parens::No,
12121213
},
12131214
itctx,
12141215
);
@@ -1959,7 +1960,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
19591960

19601961
(hir::ParamName::Plain(self.lower_ident(param.ident)), kind)
19611962
}
1962-
GenericParamKind::Const { ty, kw_span: _, default } => {
1963+
GenericParamKind::Const { ty, span: _, default } => {
19631964
let ty = self
19641965
.lower_ty(ty, ImplTraitContext::Disallowed(ImplTraitPosition::GenericDefault));
19651966

compiler/rustc_ast_passes/src/ast_validation.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -909,11 +909,11 @@ fn validate_generic_param_order(dcx: DiagCtxtHandle<'_>, generics: &[GenericPara
909909
}
910910
GenericParamKind::Type { default: None } => (),
911911
GenericParamKind::Lifetime => (),
912-
GenericParamKind::Const { ty: _, kw_span: _, default: Some(default) } => {
912+
GenericParamKind::Const { ty: _, span: _, default: Some(default) } => {
913913
ordered_params += " = ";
914914
ordered_params += &pprust::expr_to_string(&default.value);
915915
}
916-
GenericParamKind::Const { ty: _, kw_span: _, default: None } => (),
916+
GenericParamKind::Const { ty: _, span: _, default: None } => (),
917917
}
918918
first = false;
919919
}

compiler/rustc_attr_parsing/src/attributes/codegen_attrs.rs

Lines changed: 11 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ use rustc_feature::{AttributeTemplate, template};
33
use rustc_session::parse::feature_err;
44
use rustc_span::{Span, Symbol, sym};
55

6-
use super::{AcceptMapping, AttributeOrder, AttributeParser, OnDuplicate, SingleAttributeParser};
6+
use super::{
7+
AcceptMapping, AttributeOrder, AttributeParser, NoArgsAttributeParser, OnDuplicate,
8+
SingleAttributeParser,
9+
};
710
use crate::context::{AcceptContext, FinalizeContext, Stage};
811
use crate::parser::ArgParser;
912
use crate::session_diagnostics::{NakedFunctionIncompatibleAttribute, NullOnExport};
@@ -43,20 +46,10 @@ impl<S: Stage> SingleAttributeParser<S> for OptimizeParser {
4346

4447
pub(crate) struct ColdParser;
4548

46-
impl<S: Stage> SingleAttributeParser<S> for ColdParser {
49+
impl<S: Stage> NoArgsAttributeParser<S> for ColdParser {
4750
const PATH: &[Symbol] = &[sym::cold];
48-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepLast;
4951
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
50-
const TEMPLATE: AttributeTemplate = template!(Word);
51-
52-
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
53-
if let Err(span) = args.no_args() {
54-
cx.expected_no_args(span);
55-
return None;
56-
}
57-
58-
Some(AttributeKind::Cold(cx.attr_span))
59-
}
52+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::Cold;
6053
}
6154

6255
pub(crate) struct ExportNameParser;
@@ -194,39 +187,17 @@ impl<S: Stage> AttributeParser<S> for NakedParser {
194187
}
195188

196189
pub(crate) struct TrackCallerParser;
197-
198-
impl<S: Stage> SingleAttributeParser<S> for TrackCallerParser {
190+
impl<S: Stage> NoArgsAttributeParser<S> for TrackCallerParser {
199191
const PATH: &[Symbol] = &[sym::track_caller];
200-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepLast;
201192
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
202-
const TEMPLATE: AttributeTemplate = template!(Word);
203-
204-
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
205-
if let Err(span) = args.no_args() {
206-
cx.expected_no_args(span);
207-
return None;
208-
}
209-
210-
Some(AttributeKind::TrackCaller(cx.attr_span))
211-
}
193+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::TrackCaller;
212194
}
213195

214196
pub(crate) struct NoMangleParser;
215-
216-
impl<S: Stage> SingleAttributeParser<S> for NoMangleParser {
217-
const PATH: &[rustc_span::Symbol] = &[sym::no_mangle];
218-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepLast;
197+
impl<S: Stage> NoArgsAttributeParser<S> for NoMangleParser {
198+
const PATH: &[Symbol] = &[sym::no_mangle];
219199
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
220-
const TEMPLATE: AttributeTemplate = template!(Word);
221-
222-
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
223-
if let Err(span) = args.no_args() {
224-
cx.expected_no_args(span);
225-
return None;
226-
}
227-
228-
Some(AttributeKind::NoMangle(cx.attr_span))
229-
}
200+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::NoMangle;
230201
}
231202

232203
#[derive(Default)]
Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,19 @@
11
use rustc_attr_data_structures::AttributeKind;
2-
use rustc_feature::{AttributeTemplate, template};
3-
use rustc_span::{Symbol, sym};
2+
use rustc_span::{Span, Symbol, sym};
43

5-
use crate::attributes::{AttributeOrder, OnDuplicate, SingleAttributeParser};
6-
use crate::context::{AcceptContext, Stage};
7-
use crate::parser::ArgParser;
4+
use crate::attributes::{NoArgsAttributeParser, OnDuplicate};
5+
use crate::context::Stage;
86

97
pub(crate) struct AsPtrParser;
10-
11-
impl<S: Stage> SingleAttributeParser<S> for AsPtrParser {
8+
impl<S: Stage> NoArgsAttributeParser<S> for AsPtrParser {
129
const PATH: &[Symbol] = &[sym::rustc_as_ptr];
13-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
1410
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
15-
const TEMPLATE: AttributeTemplate = template!(Word);
16-
17-
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
18-
if let Err(span) = args.no_args() {
19-
cx.expected_no_args(span);
20-
}
21-
Some(AttributeKind::AsPtr(cx.attr_span))
22-
}
11+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::AsPtr;
2312
}
2413

2514
pub(crate) struct PubTransparentParser;
26-
impl<S: Stage> SingleAttributeParser<S> for PubTransparentParser {
15+
impl<S: Stage> NoArgsAttributeParser<S> for PubTransparentParser {
2716
const PATH: &[Symbol] = &[sym::rustc_pub_transparent];
28-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
2917
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
30-
const TEMPLATE: AttributeTemplate = template!(Word);
31-
32-
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
33-
if let Err(span) = args.no_args() {
34-
cx.expected_no_args(span);
35-
}
36-
Some(AttributeKind::PubTransparent(cx.attr_span))
37-
}
18+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::PubTransparent;
3819
}
Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,19 @@
11
use rustc_attr_data_structures::AttributeKind;
2-
use rustc_feature::{AttributeTemplate, template};
3-
use rustc_span::{Symbol, sym};
2+
use rustc_span::{Span, Symbol, sym};
43

5-
use crate::attributes::{AttributeOrder, OnDuplicate, SingleAttributeParser};
6-
use crate::context::{AcceptContext, Stage};
7-
use crate::parser::ArgParser;
4+
use crate::attributes::{NoArgsAttributeParser, OnDuplicate};
5+
use crate::context::Stage;
86

97
pub(crate) struct LoopMatchParser;
10-
impl<S: Stage> SingleAttributeParser<S> for LoopMatchParser {
8+
impl<S: Stage> NoArgsAttributeParser<S> for LoopMatchParser {
119
const PATH: &[Symbol] = &[sym::loop_match];
12-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
1310
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
14-
const TEMPLATE: AttributeTemplate = template!(Word);
15-
16-
fn convert(cx: &mut AcceptContext<'_, '_, S>, _args: &ArgParser<'_>) -> Option<AttributeKind> {
17-
Some(AttributeKind::LoopMatch(cx.attr_span))
18-
}
11+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::LoopMatch;
1912
}
2013

2114
pub(crate) struct ConstContinueParser;
22-
impl<S: Stage> SingleAttributeParser<S> for ConstContinueParser {
15+
impl<S: Stage> NoArgsAttributeParser<S> for ConstContinueParser {
2316
const PATH: &[Symbol] = &[sym::const_continue];
24-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
2517
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
26-
const TEMPLATE: AttributeTemplate = template!(Word);
27-
28-
fn convert(cx: &mut AcceptContext<'_, '_, S>, _args: &ArgParser<'_>) -> Option<AttributeKind> {
29-
Some(AttributeKind::ConstContinue(cx.attr_span))
30-
}
18+
const CREATE: fn(Span) -> AttributeKind = AttributeKind::ConstContinue;
3119
}

compiler/rustc_attr_parsing/src/attributes/mod.rs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
use std::marker::PhantomData;
1818

1919
use rustc_attr_data_structures::AttributeKind;
20-
use rustc_feature::AttributeTemplate;
20+
use rustc_feature::{AttributeTemplate, template};
2121
use rustc_span::{Span, Symbol};
2222
use thin_vec::ThinVec;
2323

@@ -229,6 +229,41 @@ pub(crate) enum AttributeOrder {
229229
KeepLast,
230230
}
231231

232+
/// An even simpler version of [`SingleAttributeParser`]:
233+
/// now automatically check that there are no arguments provided to the attribute.
234+
///
235+
/// [`WithoutArgs<T> where T: NoArgsAttributeParser`](WithoutArgs) implements [`SingleAttributeParser`].
236+
//
237+
pub(crate) trait NoArgsAttributeParser<S: Stage>: 'static {
238+
const PATH: &[Symbol];
239+
const ON_DUPLICATE: OnDuplicate<S>;
240+
241+
/// Create the [`AttributeKind`] given attribute's [`Span`].
242+
const CREATE: fn(Span) -> AttributeKind;
243+
}
244+
245+
pub(crate) struct WithoutArgs<T: NoArgsAttributeParser<S>, S: Stage>(PhantomData<(S, T)>);
246+
247+
impl<T: NoArgsAttributeParser<S>, S: Stage> Default for WithoutArgs<T, S> {
248+
fn default() -> Self {
249+
Self(Default::default())
250+
}
251+
}
252+
253+
impl<T: NoArgsAttributeParser<S>, S: Stage> SingleAttributeParser<S> for WithoutArgs<T, S> {
254+
const PATH: &[Symbol] = T::PATH;
255+
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepLast;
256+
const ON_DUPLICATE: OnDuplicate<S> = T::ON_DUPLICATE;
257+
const TEMPLATE: AttributeTemplate = template!(Word);
258+
259+
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
260+
if let Err(span) = args.no_args() {
261+
cx.expected_no_args(span);
262+
}
263+
Some(T::CREATE(cx.attr_span))
264+
}
265+
}
266+
232267
type ConvertFn<E> = fn(ThinVec<E>) -> AttributeKind;
233268

234269
/// Alternative to [`AttributeParser`] that automatically handles state management.
Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,12 @@
11
use rustc_attr_data_structures::AttributeKind;
2-
use rustc_feature::{AttributeTemplate, template};
3-
use rustc_span::{Symbol, sym};
2+
use rustc_span::{Span, Symbol, sym};
43

5-
use crate::attributes::{AttributeOrder, OnDuplicate, SingleAttributeParser};
6-
use crate::context::{AcceptContext, Stage};
7-
use crate::parser::ArgParser;
4+
use crate::attributes::{NoArgsAttributeParser, OnDuplicate};
5+
use crate::context::Stage;
86

97
pub(crate) struct MayDangleParser;
10-
impl<S: Stage> SingleAttributeParser<S> for MayDangleParser {
8+
impl<S: Stage> NoArgsAttributeParser<S> for MayDangleParser {
119
const PATH: &[Symbol] = &[sym::may_dangle];
12-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
1310
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
14-
const TEMPLATE: AttributeTemplate = template!(Word);
15-
16-
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser<'_>) -> Option<AttributeKind> {
17-
if let Err(span) = args.no_args() {
18-
cx.expected_no_args(span);
19-
}
20-
Some(AttributeKind::MayDangle(cx.attr_span))
21-
}
11+
const CREATE: fn(span: Span) -> AttributeKind = AttributeKind::MayDangle;
2212
}

0 commit comments

Comments
 (0)