Skip to content

Commit f06dc4f

Browse files
committed
Auto merge of #125931 - matthiaskrgr:rollup-m3lqr4i, r=matthiaskrgr
Rollup of 9 pull requests Successful merges: - #122597 (Show files produced by `--emit foo` in json artifact notifications) - #124486 (Add tracking issue and unstable book page for `"vectorcall"` ABI) - #125380 (Make `WHERE_CLAUSES_OBJECT_SAFETY` a regular object safety violation) - #125690 (ARM Target Docs Update) - #125865 (Fix ICE caused by ignoring EffectVars in type inference) - #125893 (Handle all GVN binops in a single place.) - #125909 (rustdoc: add a regression test for a former blanket impl synthesis ICE) - #125918 (Revert: create const block bodies in typeck via query feeding) - #125919 (Remove stray "this") r? `@ghost` `@rustbot` modify labels: rollup
2 parents eb5e244 + 69d8f62 commit f06dc4f

File tree

92 files changed

+661
-473
lines changed

Some content is hidden

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

92 files changed

+661
-473
lines changed

compiler/rustc_ast/src/ast.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1392,7 +1392,7 @@ pub enum ExprKind {
13921392
/// An array (e.g, `[a, b, c, d]`).
13931393
Array(ThinVec<P<Expr>>),
13941394
/// Allow anonymous constants from an inline `const` block
1395-
ConstBlock(P<Expr>),
1395+
ConstBlock(AnonConst),
13961396
/// A function call
13971397
///
13981398
/// The first field resolves to the function itself,

compiler/rustc_ast/src/mut_visit.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1411,7 +1411,7 @@ pub fn noop_visit_expr<T: MutVisitor>(
14111411
match kind {
14121412
ExprKind::Array(exprs) => visit_thin_exprs(exprs, vis),
14131413
ExprKind::ConstBlock(anon_const) => {
1414-
vis.visit_expr(anon_const);
1414+
vis.visit_anon_const(anon_const);
14151415
}
14161416
ExprKind::Repeat(expr, count) => {
14171417
vis.visit_expr(expr);

compiler/rustc_ast/src/visit.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -954,7 +954,7 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) -> V
954954
ExprKind::Array(subexpressions) => {
955955
walk_list!(visitor, visit_expr, subexpressions);
956956
}
957-
ExprKind::ConstBlock(anon_const) => try_visit!(visitor.visit_expr(anon_const)),
957+
ExprKind::ConstBlock(anon_const) => try_visit!(visitor.visit_anon_const(anon_const)),
958958
ExprKind::Repeat(element, count) => {
959959
try_visit!(visitor.visit_expr(element));
960960
try_visit!(visitor.visit_anon_const(count));

compiler/rustc_ast_lowering/src/expr.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,12 @@ impl<'hir> LoweringContext<'_, 'hir> {
7575
let kind = match &e.kind {
7676
ExprKind::Array(exprs) => hir::ExprKind::Array(self.lower_exprs(exprs)),
7777
ExprKind::ConstBlock(c) => {
78-
self.has_inline_consts = true;
79-
hir::ExprKind::ConstBlock(self.lower_expr(c))
78+
let c = self.with_new_scopes(c.value.span, |this| hir::ConstBlock {
79+
def_id: this.local_def_id(c.id),
80+
hir_id: this.lower_node_id(c.id),
81+
body: this.lower_const_body(c.value.span, Some(&c.value)),
82+
});
83+
hir::ExprKind::ConstBlock(c)
8084
}
8185
ExprKind::Repeat(expr, count) => {
8286
let expr = self.lower_expr(expr);

compiler/rustc_ast_lowering/src/index.rs

+8
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,14 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
236236
});
237237
}
238238

239+
fn visit_inline_const(&mut self, constant: &'hir ConstBlock) {
240+
self.insert(DUMMY_SP, constant.hir_id, Node::ConstBlock(constant));
241+
242+
self.with_parent(constant.hir_id, |this| {
243+
intravisit::walk_inline_const(this, constant);
244+
});
245+
}
246+
239247
fn visit_expr(&mut self, expr: &'hir Expr<'hir>) {
240248
self.insert(expr.span, expr.hir_id, Node::Expr(expr));
241249

compiler/rustc_ast_lowering/src/lib.rs

+1-7
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,6 @@ struct LoweringContext<'a, 'hir> {
9696

9797
/// Bodies inside the owner being lowered.
9898
bodies: Vec<(hir::ItemLocalId, &'hir hir::Body<'hir>)>,
99-
/// Whether there were inline consts that typeck will split out into bodies
100-
has_inline_consts: bool,
10199
/// Attributes inside the owner being lowered.
102100
attrs: SortedMap<hir::ItemLocalId, &'hir [Attribute]>,
103101
/// Collect items that were created by lowering the current owner.
@@ -160,7 +158,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
160158
item_local_id_counter: hir::ItemLocalId::ZERO,
161159
node_id_to_local_id: Default::default(),
162160
trait_map: Default::default(),
163-
has_inline_consts: false,
164161

165162
// Lowering state.
166163
catch_scope: None,
@@ -570,7 +567,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
570567

571568
let current_attrs = std::mem::take(&mut self.attrs);
572569
let current_bodies = std::mem::take(&mut self.bodies);
573-
let current_has_inline_consts = std::mem::take(&mut self.has_inline_consts);
574570
let current_node_ids = std::mem::take(&mut self.node_id_to_local_id);
575571
let current_trait_map = std::mem::take(&mut self.trait_map);
576572
let current_owner =
@@ -597,7 +593,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
597593

598594
self.attrs = current_attrs;
599595
self.bodies = current_bodies;
600-
self.has_inline_consts = current_has_inline_consts;
601596
self.node_id_to_local_id = current_node_ids;
602597
self.trait_map = current_trait_map;
603598
self.current_hir_id_owner = current_owner;
@@ -634,7 +629,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
634629
let attrs = std::mem::take(&mut self.attrs);
635630
let mut bodies = std::mem::take(&mut self.bodies);
636631
let trait_map = std::mem::take(&mut self.trait_map);
637-
let has_inline_consts = std::mem::take(&mut self.has_inline_consts);
638632

639633
#[cfg(debug_assertions)]
640634
for (id, attrs) in attrs.iter() {
@@ -652,7 +646,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
652646
self.tcx.hash_owner_nodes(node, &bodies, &attrs);
653647
let num_nodes = self.item_local_id_counter.as_usize();
654648
let (nodes, parenting) = index::index_hir(self.tcx, node, &bodies, num_nodes);
655-
let nodes = hir::OwnerNodes { opt_hash_including_bodies, nodes, bodies, has_inline_consts };
649+
let nodes = hir::OwnerNodes { opt_hash_including_bodies, nodes, bodies };
656650
let attrs = hir::AttributeMap { map: attrs, opt_hash: attrs_hash };
657651

658652
self.arena.alloc(hir::OwnerInfo { nodes, parenting, attrs, trait_map })

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

+2-3
Original file line numberDiff line numberDiff line change
@@ -380,9 +380,8 @@ impl<'a> State<'a> {
380380
ast::ExprKind::Array(exprs) => {
381381
self.print_expr_vec(exprs);
382382
}
383-
ast::ExprKind::ConstBlock(expr) => {
384-
self.word_space("const");
385-
self.print_expr(expr, FixupContext::default());
383+
ast::ExprKind::ConstBlock(anon_const) => {
384+
self.print_expr_anon_const(anon_const, attrs);
386385
}
387386
ast::ExprKind::Repeat(element, count) => {
388387
self.print_expr_repeat(element, count);

compiler/rustc_codegen_cranelift/src/driver/aot.rs

+23
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,29 @@ fn produce_final_output_artifacts(
288288
}
289289
}
290290

291+
if sess.opts.json_artifact_notifications {
292+
if codegen_results.modules.len() == 1 {
293+
codegen_results.modules[0].for_each_output(|_path, ty| {
294+
if sess.opts.output_types.contains_key(&ty) {
295+
let descr = ty.shorthand();
296+
// for single cgu file is renamed to drop cgu specific suffix
297+
// so we regenerate it the same way
298+
let path = crate_output.path(ty);
299+
sess.dcx().emit_artifact_notification(path.as_path(), descr);
300+
}
301+
});
302+
} else {
303+
for module in &codegen_results.modules {
304+
module.for_each_output(|path, ty| {
305+
if sess.opts.output_types.contains_key(&ty) {
306+
let descr = ty.shorthand();
307+
sess.dcx().emit_artifact_notification(&path, descr);
308+
}
309+
});
310+
}
311+
}
312+
}
313+
291314
// We leave the following files around by default:
292315
// - #crate#.o
293316
// - #crate#.crate.metadata.o

compiler/rustc_codegen_ssa/src/back/write.rs

+23
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,29 @@ fn produce_final_output_artifacts(
717717
}
718718
}
719719

720+
if sess.opts.json_artifact_notifications {
721+
if compiled_modules.modules.len() == 1 {
722+
compiled_modules.modules[0].for_each_output(|_path, ty| {
723+
if sess.opts.output_types.contains_key(&ty) {
724+
let descr = ty.shorthand();
725+
// for single cgu file is renamed to drop cgu specific suffix
726+
// so we regenerate it the same way
727+
let path = crate_output.path(ty);
728+
sess.dcx().emit_artifact_notification(path.as_path(), descr);
729+
}
730+
});
731+
} else {
732+
for module in &compiled_modules.modules {
733+
module.for_each_output(|path, ty| {
734+
if sess.opts.output_types.contains_key(&ty) {
735+
let descr = ty.shorthand();
736+
sess.dcx().emit_artifact_notification(&path, descr);
737+
}
738+
});
739+
}
740+
}
741+
}
742+
720743
// We leave the following files around by default:
721744
// - #crate#.o
722745
// - #crate#.crate.metadata.o

compiler/rustc_codegen_ssa/src/lib.rs

+18
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,24 @@ pub struct CompiledModule {
106106
pub llvm_ir: Option<PathBuf>, // --emit=llvm-ir, llvm-bc is in bytecode
107107
}
108108

109+
impl CompiledModule {
110+
/// Call `emit` function with every artifact type currently compiled
111+
pub fn for_each_output(&self, mut emit: impl FnMut(&Path, OutputType)) {
112+
if let Some(path) = self.object.as_deref() {
113+
emit(path, OutputType::Object);
114+
}
115+
if let Some(path) = self.bytecode.as_deref() {
116+
emit(path, OutputType::Bitcode);
117+
}
118+
if let Some(path) = self.llvm_ir.as_deref() {
119+
emit(path, OutputType::LlvmAssembly);
120+
}
121+
if let Some(path) = self.assembly.as_deref() {
122+
emit(path, OutputType::Assembly);
123+
}
124+
}
125+
}
126+
109127
pub struct CachedModuleCodegen {
110128
pub name: String,
111129
pub source: WorkProduct,

compiler/rustc_const_eval/src/const_eval/fn_queries.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ fn constness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::Constness {
3838
match node {
3939
hir::Node::Ctor(_)
4040
| hir::Node::AnonConst(_)
41+
| hir::Node::ConstBlock(_)
4142
| hir::Node::ImplItem(hir::ImplItem { kind: hir::ImplItemKind::Const(..), .. }) => {
4243
hir::Constness::Const
4344
}
@@ -56,7 +57,6 @@ fn constness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::Constness {
5657
if is_const { hir::Constness::Const } else { hir::Constness::NotConst }
5758
}
5859
hir::Node::Expr(e) if let hir::ExprKind::Closure(c) = e.kind => c.constness,
59-
hir::Node::Expr(e) if let hir::ExprKind::ConstBlock(_) = e.kind => hir::Constness::Const,
6060
_ => {
6161
if let Some(fn_kind) = node.fn_kind() {
6262
if fn_kind.constness() == hir::Constness::Const {

compiler/rustc_feature/src/unstable.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,6 @@ declare_features! (
177177

178178
/// Allows using the `unadjusted` ABI; perma-unstable.
179179
(internal, abi_unadjusted, "1.16.0", None),
180-
/// Allows using the `vectorcall` ABI.
181-
(unstable, abi_vectorcall, "1.7.0", None),
182180
/// Allows using `#![needs_allocator]`, an implementation detail of `#[global_allocator]`.
183181
(internal, allocator_internals, "1.20.0", None),
184182
/// Allows using `#[allow_internal_unsafe]`. This is an
@@ -243,6 +241,8 @@ declare_features! (
243241
// feature-group-start: internal feature gates
244242
// -------------------------------------------------------------------------
245243

244+
/// Allows using the `vectorcall` ABI.
245+
(unstable, abi_vectorcall, "1.7.0", Some(124485)),
246246
/// Allows features specific to auto traits.
247247
/// Renamed from `optin_builtin_traits`.
248248
(unstable, auto_traits, "1.50.0", Some(13231)),

compiler/rustc_hir/src/hir.rs

+13-4
Original file line numberDiff line numberDiff line change
@@ -907,9 +907,6 @@ pub struct OwnerNodes<'tcx> {
907907
pub nodes: IndexVec<ItemLocalId, ParentedNode<'tcx>>,
908908
/// Content of local bodies.
909909
pub bodies: SortedMap<ItemLocalId, &'tcx Body<'tcx>>,
910-
/// Whether the body contains inline constants that are created for the query system during typeck
911-
/// of the body.
912-
pub has_inline_consts: bool,
913910
}
914911

915912
impl<'tcx> OwnerNodes<'tcx> {
@@ -1626,6 +1623,14 @@ pub struct AnonConst {
16261623
pub span: Span,
16271624
}
16281625

1626+
/// An inline constant expression `const { something }`.
1627+
#[derive(Copy, Clone, Debug, HashStable_Generic)]
1628+
pub struct ConstBlock {
1629+
pub hir_id: HirId,
1630+
pub def_id: LocalDefId,
1631+
pub body: BodyId,
1632+
}
1633+
16291634
/// An expression.
16301635
#[derive(Debug, Clone, Copy, HashStable_Generic)]
16311636
pub struct Expr<'hir> {
@@ -1912,7 +1917,7 @@ pub fn is_range_literal(expr: &Expr<'_>) -> bool {
19121917
#[derive(Debug, Clone, Copy, HashStable_Generic)]
19131918
pub enum ExprKind<'hir> {
19141919
/// Allow anonymous constants from an inline `const` block
1915-
ConstBlock(&'hir Expr<'hir>),
1920+
ConstBlock(ConstBlock),
19161921
/// An array (e.g., `[a, b, c, d]`).
19171922
Array(&'hir [Expr<'hir>]),
19181923
/// A function call.
@@ -3644,6 +3649,7 @@ pub enum Node<'hir> {
36443649
Variant(&'hir Variant<'hir>),
36453650
Field(&'hir FieldDef<'hir>),
36463651
AnonConst(&'hir AnonConst),
3652+
ConstBlock(&'hir ConstBlock),
36473653
Expr(&'hir Expr<'hir>),
36483654
ExprField(&'hir ExprField<'hir>),
36493655
Stmt(&'hir Stmt<'hir>),
@@ -3704,6 +3710,7 @@ impl<'hir> Node<'hir> {
37043710
Node::PreciseCapturingNonLifetimeArg(a) => Some(a.ident),
37053711
Node::Param(..)
37063712
| Node::AnonConst(..)
3713+
| Node::ConstBlock(..)
37073714
| Node::Expr(..)
37083715
| Node::Stmt(..)
37093716
| Node::Block(..)
@@ -3801,6 +3808,7 @@ impl<'hir> Node<'hir> {
38013808
}
38023809

38033810
Node::AnonConst(constant) => Some((constant.def_id, constant.body)),
3811+
Node::ConstBlock(constant) => Some((constant.def_id, constant.body)),
38043812

38053813
_ => None,
38063814
}
@@ -3869,6 +3877,7 @@ impl<'hir> Node<'hir> {
38693877
expect_variant, &'hir Variant<'hir>, Node::Variant(n), n;
38703878
expect_field, &'hir FieldDef<'hir>, Node::Field(n), n;
38713879
expect_anon_const, &'hir AnonConst, Node::AnonConst(n), n;
3880+
expect_inline_const, &'hir ConstBlock, Node::ConstBlock(n), n;
38723881
expect_expr, &'hir Expr<'hir>, Node::Expr(n), n;
38733882
expect_expr_field, &'hir ExprField<'hir>, Node::ExprField(n), n;
38743883
expect_stmt, &'hir Stmt<'hir>, Node::Stmt(n), n;

compiler/rustc_hir/src/intravisit.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,9 @@ pub trait Visitor<'v>: Sized {
344344
fn visit_anon_const(&mut self, c: &'v AnonConst) -> Self::Result {
345345
walk_anon_const(self, c)
346346
}
347+
fn visit_inline_const(&mut self, c: &'v ConstBlock) -> Self::Result {
348+
walk_inline_const(self, c)
349+
}
347350
fn visit_expr(&mut self, ex: &'v Expr<'v>) -> Self::Result {
348351
walk_expr(self, ex)
349352
}
@@ -716,14 +719,22 @@ pub fn walk_anon_const<'v, V: Visitor<'v>>(visitor: &mut V, constant: &'v AnonCo
716719
visitor.visit_nested_body(constant.body)
717720
}
718721

722+
pub fn walk_inline_const<'v, V: Visitor<'v>>(
723+
visitor: &mut V,
724+
constant: &'v ConstBlock,
725+
) -> V::Result {
726+
try_visit!(visitor.visit_id(constant.hir_id));
727+
visitor.visit_nested_body(constant.body)
728+
}
729+
719730
pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr<'v>) -> V::Result {
720731
try_visit!(visitor.visit_id(expression.hir_id));
721732
match expression.kind {
722733
ExprKind::Array(subexpressions) => {
723734
walk_list!(visitor, visit_expr, subexpressions);
724735
}
725736
ExprKind::ConstBlock(ref const_block) => {
726-
try_visit!(visitor.visit_expr(const_block))
737+
try_visit!(visitor.visit_inline_const(const_block))
727738
}
728739
ExprKind::Repeat(ref element, ref count) => {
729740
try_visit!(visitor.visit_expr(element));

compiler/rustc_hir/src/stable_hash_impls.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,7 @@ impl<'tcx, HirCtx: crate::HashStableContext> HashStable<HirCtx> for OwnerNodes<'
9393
// `local_id_to_def_id` is also ignored because is dependent on the body, then just hashing
9494
// the body satisfies the condition of two nodes being different have different
9595
// `hash_stable` results.
96-
let OwnerNodes { opt_hash_including_bodies, nodes: _, bodies: _, has_inline_consts: _ } =
97-
*self;
96+
let OwnerNodes { opt_hash_including_bodies, nodes: _, bodies: _ } = *self;
9897
opt_hash_including_bodies.unwrap().hash_stable(hcx, hasher);
9998
}
10099
}

compiler/rustc_hir_analysis/src/check/region.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -407,14 +407,11 @@ fn resolve_expr<'tcx>(visitor: &mut RegionResolutionVisitor<'tcx>, expr: &'tcx h
407407
match expr.kind {
408408
// Manually recurse over closures and inline consts, because they are the only
409409
// case of nested bodies that share the parent environment.
410-
hir::ExprKind::Closure(&hir::Closure { body, .. }) => {
410+
hir::ExprKind::Closure(&hir::Closure { body, .. })
411+
| hir::ExprKind::ConstBlock(hir::ConstBlock { body, .. }) => {
411412
let body = visitor.tcx.hir().body(body);
412413
visitor.visit_body(body);
413414
}
414-
hir::ExprKind::ConstBlock(expr) => visitor.enter_body(expr.hir_id, |this| {
415-
this.cx.var_parent = None;
416-
resolve_local(this, None, Some(expr));
417-
}),
418415
hir::ExprKind::AssignOp(_, left_expr, right_expr) => {
419416
debug!(
420417
"resolve_expr - enabling pessimistic_yield, was previously {}",

compiler/rustc_hir_analysis/src/check/wfcheck.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -881,7 +881,7 @@ fn check_object_unsafe_self_trait_by_name(tcx: TyCtxt<'_>, item: &hir::TraitItem
881881
_ => {}
882882
}
883883
if !trait_should_be_self.is_empty() {
884-
if tcx.check_is_object_safe(trait_def_id) {
884+
if tcx.is_object_safe(trait_def_id) {
885885
return;
886886
}
887887
let sugg = trait_should_be_self.iter().map(|span| (*span, "Self".to_string())).collect();

compiler/rustc_hir_analysis/src/coherence/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ fn check_object_overlap<'tcx>(
191191
});
192192

193193
for component_def_id in component_def_ids {
194-
if !tcx.check_is_object_safe(component_def_id) {
194+
if !tcx.is_object_safe(component_def_id) {
195195
// Without the 'object_safe_for_dispatch' feature this is an error
196196
// which will be reported by wfcheck. Ignore it here.
197197
// This is tested by `coherence-impl-trait-for-trait-object-safe.rs`.

0 commit comments

Comments
 (0)