Skip to content

Commit 1b6a290

Browse files
committed
Merge from rustc
2 parents c9addbe + afc6424 commit 1b6a290

File tree

241 files changed

+3310
-2192
lines changed

Some content is hidden

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

241 files changed

+3310
-2192
lines changed

compiler/rustc_ast/src/ast.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3417,9 +3417,9 @@ impl Item {
34173417
ItemKind::Fn(i) => Some(&i.generics),
34183418
ItemKind::TyAlias(i) => Some(&i.generics),
34193419
ItemKind::TraitAlias(_, generics, _)
3420-
| ItemKind::Enum(_, _, generics)
3421-
| ItemKind::Struct(_, _, generics)
3422-
| ItemKind::Union(_, _, generics) => Some(&generics),
3420+
| ItemKind::Enum(_, generics, _)
3421+
| ItemKind::Struct(_, generics, _)
3422+
| ItemKind::Union(_, generics, _) => Some(&generics),
34233423
ItemKind::Trait(i) => Some(&i.generics),
34243424
ItemKind::Impl(i) => Some(&i.generics),
34253425
}
@@ -3663,15 +3663,15 @@ pub enum ItemKind {
36633663
/// An enum definition (`enum`).
36643664
///
36653665
/// E.g., `enum Foo<A, B> { C<A>, D<B> }`.
3666-
Enum(Ident, EnumDef, Generics),
3666+
Enum(Ident, Generics, EnumDef),
36673667
/// A struct definition (`struct`).
36683668
///
36693669
/// E.g., `struct Foo<A> { x: A }`.
3670-
Struct(Ident, VariantData, Generics),
3670+
Struct(Ident, Generics, VariantData),
36713671
/// A union definition (`union`).
36723672
///
36733673
/// E.g., `union Foo<A, B> { x: A, y: B }`.
3674-
Union(Ident, VariantData, Generics),
3674+
Union(Ident, Generics, VariantData),
36753675
/// A trait declaration (`trait`).
36763676
///
36773677
/// E.g., `trait Foo { .. }`, `trait Foo<T> { .. }` or `auto trait Foo {}`.
@@ -3688,10 +3688,8 @@ pub enum ItemKind {
36883688
///
36893689
/// E.g., `foo!(..)`.
36903690
MacCall(P<MacCall>),
3691-
36923691
/// A macro definition.
36933692
MacroDef(Ident, MacroDef),
3694-
36953693
/// A single delegation item (`reuse`).
36963694
///
36973695
/// E.g. `reuse <Type as Trait>::name { target_expr_template }`.
@@ -3767,9 +3765,9 @@ impl ItemKind {
37673765
Self::Fn(box Fn { generics, .. })
37683766
| Self::TyAlias(box TyAlias { generics, .. })
37693767
| Self::Const(box ConstItem { generics, .. })
3770-
| Self::Enum(_, _, generics)
3771-
| Self::Struct(_, _, generics)
3772-
| Self::Union(_, _, generics)
3768+
| Self::Enum(_, generics, _)
3769+
| Self::Struct(_, generics, _)
3770+
| Self::Union(_, generics, _)
37733771
| Self::Trait(box Trait { generics, .. })
37743772
| Self::TraitAlias(_, generics, _)
37753773
| Self::Impl(box Impl { generics, .. }) => Some(generics),

compiler/rustc_ast/src/visit.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -508,16 +508,16 @@ macro_rules! common_visitor_and_walkers {
508508
)?
509509
$(<V as Visitor<$lt>>::Result::output())?
510510
}
511-
ItemKind::Enum(ident, enum_definition, generics) => {
511+
ItemKind::Enum(ident, generics, enum_definition) => {
512512
try_visit!(vis.visit_ident(ident));
513513
try_visit!(vis.visit_generics(generics));
514514
$(${ignore($mut)}
515515
enum_definition.variants.flat_map_in_place(|variant| vis.flat_map_variant(variant));
516516
)?
517517
$(${ignore($lt)}vis.visit_enum_def(enum_definition))?
518518
}
519-
ItemKind::Struct(ident, variant_data, generics)
520-
| ItemKind::Union(ident, variant_data, generics) => {
519+
ItemKind::Struct(ident, generics, variant_data)
520+
| ItemKind::Union(ident, generics, variant_data) => {
521521
try_visit!(vis.visit_ident(ident));
522522
try_visit!(vis.visit_generics(generics));
523523
vis.visit_variant_data(variant_data)

compiler/rustc_ast_lowering/src/item.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
306306
);
307307
hir::ItemKind::TyAlias(ident, ty, generics)
308308
}
309-
ItemKind::Enum(ident, enum_definition, generics) => {
309+
ItemKind::Enum(ident, generics, enum_definition) => {
310310
let ident = self.lower_ident(*ident);
311311
let (generics, variants) = self.lower_generics(
312312
generics,
@@ -320,7 +320,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
320320
);
321321
hir::ItemKind::Enum(ident, hir::EnumDef { variants }, generics)
322322
}
323-
ItemKind::Struct(ident, struct_def, generics) => {
323+
ItemKind::Struct(ident, generics, struct_def) => {
324324
let ident = self.lower_ident(*ident);
325325
let (generics, struct_def) = self.lower_generics(
326326
generics,
@@ -330,7 +330,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
330330
);
331331
hir::ItemKind::Struct(ident, struct_def, generics)
332332
}
333-
ItemKind::Union(ident, vdata, generics) => {
333+
ItemKind::Union(ident, generics, vdata) => {
334334
let ident = self.lower_ident(*ident);
335335
let (generics, vdata) = self.lower_generics(
336336
generics,

compiler/rustc_ast_passes/src/ast_validation.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,7 +1010,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
10101010
});
10111011
self.extern_mod_span = old_item;
10121012
}
1013-
ItemKind::Enum(_, def, _) => {
1013+
ItemKind::Enum(_, _, def) => {
10141014
for variant in &def.variants {
10151015
self.visibility_not_permitted(
10161016
&variant.vis,
@@ -1061,7 +1061,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
10611061
}
10621062
visit::walk_item(self, item)
10631063
}
1064-
ItemKind::Struct(ident, vdata, generics) => match vdata {
1064+
ItemKind::Struct(ident, generics, vdata) => match vdata {
10651065
VariantData::Struct { fields, .. } => {
10661066
self.visit_attrs_vis_ident(&item.attrs, &item.vis, ident);
10671067
self.visit_generics(generics);
@@ -1070,7 +1070,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
10701070
}
10711071
_ => visit::walk_item(self, item),
10721072
},
1073-
ItemKind::Union(ident, vdata, generics) => {
1073+
ItemKind::Union(ident, generics, vdata) => {
10741074
if vdata.fields().is_empty() {
10751075
self.dcx().emit_err(errors::FieldlessUnion { span: item.span });
10761076
}

compiler/rustc_ast_pretty/src/pprust/state/item.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -298,14 +298,14 @@ impl<'a> State<'a> {
298298
*defaultness,
299299
);
300300
}
301-
ast::ItemKind::Enum(ident, enum_definition, params) => {
302-
self.print_enum_def(enum_definition, params, *ident, item.span, &item.vis);
301+
ast::ItemKind::Enum(ident, generics, enum_definition) => {
302+
self.print_enum_def(enum_definition, generics, *ident, item.span, &item.vis);
303303
}
304-
ast::ItemKind::Struct(ident, struct_def, generics) => {
304+
ast::ItemKind::Struct(ident, generics, struct_def) => {
305305
let (cb, ib) = self.head(visibility_qualified(&item.vis, "struct"));
306306
self.print_struct(struct_def, generics, *ident, item.span, true, cb, ib);
307307
}
308-
ast::ItemKind::Union(ident, struct_def, generics) => {
308+
ast::ItemKind::Union(ident, generics, struct_def) => {
309309
let (cb, ib) = self.head(visibility_qualified(&item.vis, "union"));
310310
self.print_struct(struct_def, generics, *ident, item.span, true, cb, ib);
311311
}

compiler/rustc_builtin_macros/messages.ftl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ builtin_macros_assert_requires_expression = macro requires an expression as an a
5656
5757
builtin_macros_autodiff = autodiff must be applied to function
5858
builtin_macros_autodiff_missing_config = autodiff requires at least a name and mode
59-
builtin_macros_autodiff_mode = unknown Mode: `{$mode}`. Use `Forward` or `Reverse`
6059
builtin_macros_autodiff_mode_activity = {$act} can not be used in {$mode} Mode
6160
builtin_macros_autodiff_not_build = this rustc version does not support autodiff
6261
builtin_macros_autodiff_number_activities = expected {$expected} activities, but found {$found}

compiler/rustc_builtin_macros/src/autodiff.rs

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -86,27 +86,23 @@ mod llvm_enzyme {
8686
ecx: &mut ExtCtxt<'_>,
8787
meta_item: &ThinVec<MetaItemInner>,
8888
has_ret: bool,
89+
mode: DiffMode,
8990
) -> AutoDiffAttrs {
9091
let dcx = ecx.sess.dcx();
91-
let mode = name(&meta_item[1]);
92-
let Ok(mode) = DiffMode::from_str(&mode) else {
93-
dcx.emit_err(errors::AutoDiffInvalidMode { span: meta_item[1].span(), mode });
94-
return AutoDiffAttrs::error();
95-
};
9692

9793
// Now we check, whether the user wants autodiff in batch/vector mode, or scalar mode.
9894
// If he doesn't specify an integer (=width), we default to scalar mode, thus width=1.
99-
let mut first_activity = 2;
95+
let mut first_activity = 1;
10096

101-
let width = if let [_, _, x, ..] = &meta_item[..]
97+
let width = if let [_, x, ..] = &meta_item[..]
10298
&& let Some(x) = width(x)
10399
{
104-
first_activity = 3;
100+
first_activity = 2;
105101
match x.try_into() {
106102
Ok(x) => x,
107103
Err(_) => {
108104
dcx.emit_err(errors::AutoDiffInvalidWidth {
109-
span: meta_item[2].span(),
105+
span: meta_item[1].span(),
110106
width: x,
111107
});
112108
return AutoDiffAttrs::error();
@@ -165,6 +161,24 @@ mod llvm_enzyme {
165161
ts.push(TokenTree::Token(comma.clone(), Spacing::Alone));
166162
}
167163

164+
pub(crate) fn expand_forward(
165+
ecx: &mut ExtCtxt<'_>,
166+
expand_span: Span,
167+
meta_item: &ast::MetaItem,
168+
item: Annotatable,
169+
) -> Vec<Annotatable> {
170+
expand_with_mode(ecx, expand_span, meta_item, item, DiffMode::Forward)
171+
}
172+
173+
pub(crate) fn expand_reverse(
174+
ecx: &mut ExtCtxt<'_>,
175+
expand_span: Span,
176+
meta_item: &ast::MetaItem,
177+
item: Annotatable,
178+
) -> Vec<Annotatable> {
179+
expand_with_mode(ecx, expand_span, meta_item, item, DiffMode::Reverse)
180+
}
181+
168182
/// We expand the autodiff macro to generate a new placeholder function which passes
169183
/// type-checking and can be called by users. The function body of the placeholder function will
170184
/// later be replaced on LLVM-IR level, so the design of the body is less important and for now
@@ -198,11 +212,12 @@ mod llvm_enzyme {
198212
/// ```
199213
/// FIXME(ZuseZ4): Once autodiff is enabled by default, make this a doc comment which is checked
200214
/// in CI.
201-
pub(crate) fn expand(
215+
pub(crate) fn expand_with_mode(
202216
ecx: &mut ExtCtxt<'_>,
203217
expand_span: Span,
204218
meta_item: &ast::MetaItem,
205219
mut item: Annotatable,
220+
mode: DiffMode,
206221
) -> Vec<Annotatable> {
207222
if cfg!(not(llvm_enzyme)) {
208223
ecx.sess.dcx().emit_err(errors::AutoDiffSupportNotBuild { span: meta_item.span });
@@ -245,29 +260,41 @@ mod llvm_enzyme {
245260
// create TokenStream from vec elemtents:
246261
// meta_item doesn't have a .tokens field
247262
let mut ts: Vec<TokenTree> = vec![];
248-
if meta_item_vec.len() < 2 {
249-
// At the bare minimum, we need a fnc name and a mode, even for a dummy function with no
250-
// input and output args.
263+
if meta_item_vec.len() < 1 {
264+
// At the bare minimum, we need a fnc name.
251265
dcx.emit_err(errors::AutoDiffMissingConfig { span: item.span() });
252266
return vec![item];
253267
}
254268

255-
meta_item_inner_to_ts(&meta_item_vec[1], &mut ts);
269+
let mode_symbol = match mode {
270+
DiffMode::Forward => sym::Forward,
271+
DiffMode::Reverse => sym::Reverse,
272+
_ => unreachable!("Unsupported mode: {:?}", mode),
273+
};
274+
275+
// Insert mode token
276+
let mode_token = Token::new(TokenKind::Ident(mode_symbol, false.into()), Span::default());
277+
ts.insert(0, TokenTree::Token(mode_token, Spacing::Joint));
278+
ts.insert(
279+
1,
280+
TokenTree::Token(Token::new(TokenKind::Comma, Span::default()), Spacing::Alone),
281+
);
256282

257283
// Now, if the user gave a width (vector aka batch-mode ad), then we copy it.
258284
// If it is not given, we default to 1 (scalar mode).
259285
let start_position;
260286
let kind: LitKind = LitKind::Integer;
261287
let symbol;
262-
if meta_item_vec.len() >= 3
263-
&& let Some(width) = width(&meta_item_vec[2])
288+
if meta_item_vec.len() >= 2
289+
&& let Some(width) = width(&meta_item_vec[1])
264290
{
265-
start_position = 3;
291+
start_position = 2;
266292
symbol = Symbol::intern(&width.to_string());
267293
} else {
268-
start_position = 2;
294+
start_position = 1;
269295
symbol = sym::integer(1);
270296
}
297+
271298
let l: Lit = Lit { kind, symbol, suffix: None };
272299
let t = Token::new(TokenKind::Literal(l), Span::default());
273300
let comma = Token::new(TokenKind::Comma, Span::default());
@@ -289,7 +316,7 @@ mod llvm_enzyme {
289316
ts.pop();
290317
let ts: TokenStream = TokenStream::from_iter(ts);
291318

292-
let x: AutoDiffAttrs = from_ast(ecx, &meta_item_vec, has_ret);
319+
let x: AutoDiffAttrs = from_ast(ecx, &meta_item_vec, has_ret, mode);
293320
if !x.is_active() {
294321
// We encountered an error, so we return the original item.
295322
// This allows us to potentially parse other attributes.
@@ -1017,4 +1044,4 @@ mod llvm_enzyme {
10171044
}
10181045
}
10191046

1020-
pub(crate) use llvm_enzyme::expand;
1047+
pub(crate) use llvm_enzyme::{expand_forward, expand_reverse};

compiler/rustc_builtin_macros/src/deriving/clone.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ pub(crate) fn expand_deriving_clone(
3434
let is_simple;
3535
match item {
3636
Annotatable::Item(annitem) => match &annitem.kind {
37-
ItemKind::Struct(_, _, Generics { params, .. })
38-
| ItemKind::Enum(_, _, Generics { params, .. }) => {
37+
ItemKind::Struct(_, Generics { params, .. }, _)
38+
| ItemKind::Enum(_, Generics { params, .. }, _) => {
3939
let container_id = cx.current_expansion.id.expn_data().parent.expect_local();
4040
let has_derive_copy = cx.resolver.has_derive_copy(container_id);
4141
if has_derive_copy

compiler/rustc_builtin_macros/src/deriving/cmp/partial_ord.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub(crate) fn expand_deriving_partial_ord(
2121

2222
// Order in which to perform matching
2323
let discr_then_data = if let Annotatable::Item(item) = item
24-
&& let ItemKind::Enum(_, def, _) = &item.kind
24+
&& let ItemKind::Enum(_, _, def) = &item.kind
2525
{
2626
let dataful: Vec<bool> = def.variants.iter().map(|v| !v.data.fields().is_empty()).collect();
2727
match dataful.iter().filter(|&&b| b).count() {

compiler/rustc_builtin_macros/src/deriving/coerce_pointee.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub(crate) fn expand_deriving_coerce_pointee(
3030
item.visit_with(&mut DetectNonGenericPointeeAttr { cx });
3131

3232
let (name_ident, generics) = if let Annotatable::Item(aitem) = item
33-
&& let ItemKind::Struct(ident, struct_data, g) = &aitem.kind
33+
&& let ItemKind::Struct(ident, g, struct_data) = &aitem.kind
3434
{
3535
if !matches!(
3636
struct_data,

compiler/rustc_builtin_macros/src/deriving/generic/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -488,23 +488,23 @@ impl<'a> TraitDef<'a> {
488488
);
489489

490490
let newitem = match &item.kind {
491-
ast::ItemKind::Struct(ident, struct_def, generics) => self.expand_struct_def(
491+
ast::ItemKind::Struct(ident, generics, struct_def) => self.expand_struct_def(
492492
cx,
493493
struct_def,
494494
*ident,
495495
generics,
496496
from_scratch,
497497
is_packed,
498498
),
499-
ast::ItemKind::Enum(ident, enum_def, generics) => {
499+
ast::ItemKind::Enum(ident, generics, enum_def) => {
500500
// We ignore `is_packed` here, because `repr(packed)`
501501
// enums cause an error later on.
502502
//
503503
// This can only cause further compilation errors
504504
// downstream in blatantly illegal code, so it is fine.
505505
self.expand_enum_def(cx, enum_def, *ident, generics, from_scratch)
506506
}
507-
ast::ItemKind::Union(ident, struct_def, generics) => {
507+
ast::ItemKind::Union(ident, generics, struct_def) => {
508508
if self.supports_unions {
509509
self.expand_struct_def(
510510
cx,

compiler/rustc_builtin_macros/src/errors.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -180,14 +180,6 @@ mod autodiff {
180180
pub(crate) act: String,
181181
}
182182

183-
#[derive(Diagnostic)]
184-
#[diag(builtin_macros_autodiff_mode)]
185-
pub(crate) struct AutoDiffInvalidMode {
186-
#[primary_span]
187-
pub(crate) span: Span,
188-
pub(crate) mode: String,
189-
}
190-
191183
#[derive(Diagnostic)]
192184
#[diag(builtin_macros_autodiff_width)]
193185
pub(crate) struct AutoDiffInvalidWidth {

compiler/rustc_builtin_macros/src/lib.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
#![allow(internal_features)]
66
#![allow(rustc::diagnostic_outside_of_impl)]
77
#![allow(rustc::untranslatable_diagnostic)]
8+
#![cfg_attr(not(bootstrap), feature(autodiff))]
89
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
910
#![doc(rust_logo)]
1011
#![feature(assert_matches)]
11-
#![feature(autodiff)]
1212
#![feature(box_patterns)]
1313
#![feature(decl_macro)]
1414
#![feature(if_let_guard)]
@@ -112,7 +112,8 @@ pub fn register_builtin_macros(resolver: &mut dyn ResolverExpand) {
112112

113113
register_attr! {
114114
alloc_error_handler: alloc_error_handler::expand,
115-
autodiff: autodiff::expand,
115+
autodiff_forward: autodiff::expand_forward,
116+
autodiff_reverse: autodiff::expand_reverse,
116117
bench: test::expand_bench,
117118
cfg_accessible: cfg_accessible::Expander,
118119
cfg_eval: cfg_eval::expand,

0 commit comments

Comments
 (0)