Skip to content

Commit 5df129f

Browse files
committed
Merge remote-tracking branch 'origin' into free-more-space-ubuntu-24
2 parents a9a83e0 + 820bfff commit 5df129f

File tree

437 files changed

+5753
-2810
lines changed

Some content is hidden

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

437 files changed

+5753
-2810
lines changed

Cargo.lock

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,9 @@ name = "anyhow"
186186
version = "1.0.95"
187187
source = "registry+https://github.com/rust-lang/crates.io-index"
188188
checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04"
189+
dependencies = [
190+
"backtrace",
191+
]
189192

190193
[[package]]
191194
name = "ar_archive_writer"
@@ -1095,9 +1098,9 @@ dependencies = [
10951098

10961099
[[package]]
10971100
name = "elsa"
1098-
version = "1.7.1"
1101+
version = "1.11.0"
10991102
source = "registry+https://github.com/rust-lang/crates.io-index"
1100-
checksum = "848fe615fbb0a74d9ae68dcaa510106d32e37d9416207bbea4bd008bd89c47ed"
1103+
checksum = "2343daaeabe09879d4ea058bb4f1e63da3fc07dadc6634e01bda1b3d6a9d9d2b"
11011104
dependencies = [
11021105
"stable_deref_trait",
11031106
]
@@ -1195,6 +1198,17 @@ version = "2.3.0"
11951198
source = "registry+https://github.com/rust-lang/crates.io-index"
11961199
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
11971200

1201+
[[package]]
1202+
name = "features-status-dump"
1203+
version = "0.1.0"
1204+
dependencies = [
1205+
"anyhow",
1206+
"clap",
1207+
"serde",
1208+
"serde_json",
1209+
"tidy",
1210+
]
1211+
11981212
[[package]]
11991213
name = "field-offset"
12001214
version = "0.3.6"
@@ -5418,6 +5432,7 @@ dependencies = [
54185432
"regex",
54195433
"rustc-hash 2.1.0",
54205434
"semver",
5435+
"serde",
54215436
"similar",
54225437
"termcolor",
54235438
"walkdir",

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ members = [
4747
"src/tools/coverage-dump",
4848
"src/tools/rustc-perf-wrapper",
4949
"src/tools/wasm-component-ld",
50+
"src/tools/features-status-dump",
5051
]
5152

5253
exclude = [

compiler/rustc_ast/src/ast.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3348,11 +3348,18 @@ pub struct Impl {
33483348
pub items: ThinVec<P<AssocItem>>,
33493349
}
33503350

3351+
#[derive(Clone, Encodable, Decodable, Debug, Default)]
3352+
pub struct FnContract {
3353+
pub requires: Option<P<Expr>>,
3354+
pub ensures: Option<P<Expr>>,
3355+
}
3356+
33513357
#[derive(Clone, Encodable, Decodable, Debug)]
33523358
pub struct Fn {
33533359
pub defaultness: Defaultness,
33543360
pub generics: Generics,
33553361
pub sig: FnSig,
3362+
pub contract: Option<P<FnContract>>,
33563363
pub body: Option<P<Block>>,
33573364
}
33583365

@@ -3650,7 +3657,7 @@ mod size_asserts {
36503657
static_assert_size!(Block, 32);
36513658
static_assert_size!(Expr, 72);
36523659
static_assert_size!(ExprKind, 40);
3653-
static_assert_size!(Fn, 160);
3660+
static_assert_size!(Fn, 168);
36543661
static_assert_size!(ForeignItem, 88);
36553662
static_assert_size!(ForeignItemKind, 16);
36563663
static_assert_size!(GenericArg, 24);

compiler/rustc_ast/src/mut_visit.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@ pub trait MutVisitor: Sized {
143143
walk_flat_map_assoc_item(self, i, ctxt)
144144
}
145145

146+
fn visit_contract(&mut self, c: &mut P<FnContract>) {
147+
walk_contract(self, c);
148+
}
149+
146150
fn visit_fn_decl(&mut self, d: &mut P<FnDecl>) {
147151
walk_fn_decl(self, d);
148152
}
@@ -958,13 +962,16 @@ fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
958962
_ctxt,
959963
_ident,
960964
_vis,
961-
Fn { defaultness, generics, body, sig: FnSig { header, decl, span } },
965+
Fn { defaultness, generics, contract, body, sig: FnSig { header, decl, span } },
962966
) => {
963967
// Identifier and visibility are visited as a part of the item.
964968
visit_defaultness(vis, defaultness);
965969
vis.visit_fn_header(header);
966970
vis.visit_generics(generics);
967971
vis.visit_fn_decl(decl);
972+
if let Some(contract) = contract {
973+
vis.visit_contract(contract);
974+
}
968975
if let Some(body) = body {
969976
vis.visit_block(body);
970977
}
@@ -979,6 +986,16 @@ fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
979986
}
980987
}
981988

989+
fn walk_contract<T: MutVisitor>(vis: &mut T, contract: &mut P<FnContract>) {
990+
let FnContract { requires, ensures } = contract.deref_mut();
991+
if let Some(pred) = requires {
992+
vis.visit_expr(pred);
993+
}
994+
if let Some(pred) = ensures {
995+
vis.visit_expr(pred);
996+
}
997+
}
998+
982999
fn walk_fn_decl<T: MutVisitor>(vis: &mut T, decl: &mut P<FnDecl>) {
9831000
let FnDecl { inputs, output } = decl.deref_mut();
9841001
inputs.flat_map_in_place(|param| vis.flat_map_param(param));

compiler/rustc_ast/src/visit.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ pub trait Visitor<'ast>: Sized {
188188
fn visit_closure_binder(&mut self, b: &'ast ClosureBinder) -> Self::Result {
189189
walk_closure_binder(self, b)
190190
}
191+
fn visit_contract(&mut self, c: &'ast FnContract) -> Self::Result {
192+
walk_contract(self, c)
193+
}
191194
fn visit_where_predicate(&mut self, p: &'ast WherePredicate) -> Self::Result {
192195
walk_where_predicate(self, p)
193196
}
@@ -800,6 +803,17 @@ pub fn walk_closure_binder<'a, V: Visitor<'a>>(
800803
V::Result::output()
801804
}
802805

806+
pub fn walk_contract<'a, V: Visitor<'a>>(visitor: &mut V, c: &'a FnContract) -> V::Result {
807+
let FnContract { requires, ensures } = c;
808+
if let Some(pred) = requires {
809+
visitor.visit_expr(pred);
810+
}
811+
if let Some(pred) = ensures {
812+
visitor.visit_expr(pred);
813+
}
814+
V::Result::output()
815+
}
816+
803817
pub fn walk_where_predicate<'a, V: Visitor<'a>>(
804818
visitor: &mut V,
805819
predicate: &'a WherePredicate,
@@ -862,12 +876,13 @@ pub fn walk_fn<'a, V: Visitor<'a>>(visitor: &mut V, kind: FnKind<'a>) -> V::Resu
862876
_ctxt,
863877
_ident,
864878
_vis,
865-
Fn { defaultness: _, sig: FnSig { header, decl, span: _ }, generics, body },
879+
Fn { defaultness: _, sig: FnSig { header, decl, span: _ }, generics, contract, body },
866880
) => {
867881
// Identifier and visibility are visited as a part of the item.
868882
try_visit!(visitor.visit_fn_header(header));
869883
try_visit!(visitor.visit_generics(generics));
870884
try_visit!(visitor.visit_fn_decl(decl));
885+
visit_opt!(visitor, visit_contract, contract);
871886
visit_opt!(visitor, visit_block, body);
872887
}
873888
FnKind::Closure(binder, coroutine_kind, decl, body) => {

compiler/rustc_ast_lowering/src/expr.rs

Lines changed: 59 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -284,9 +284,6 @@ impl<'hir> LoweringContext<'_, 'hir> {
284284
ExprKind::Index(el, er, brackets_span) => {
285285
hir::ExprKind::Index(self.lower_expr(el), self.lower_expr(er), *brackets_span)
286286
}
287-
ExprKind::Range(Some(e1), Some(e2), RangeLimits::Closed) => {
288-
self.lower_expr_range_closed(e.span, e1, e2)
289-
}
290287
ExprKind::Range(e1, e2, lims) => {
291288
self.lower_expr_range(e.span, e1.as_deref(), e2.as_deref(), *lims)
292289
}
@@ -314,8 +311,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
314311
hir::ExprKind::Continue(self.lower_jump_destination(e.id, *opt_label))
315312
}
316313
ExprKind::Ret(e) => {
317-
let e = e.as_ref().map(|x| self.lower_expr(x));
318-
hir::ExprKind::Ret(e)
314+
let expr = e.as_ref().map(|x| self.lower_expr(x));
315+
self.checked_return(expr)
319316
}
320317
ExprKind::Yeet(sub_expr) => self.lower_expr_yeet(e.span, sub_expr.as_deref()),
321318
ExprKind::Become(sub_expr) => {
@@ -382,6 +379,32 @@ impl<'hir> LoweringContext<'_, 'hir> {
382379
})
383380
}
384381

382+
/// Create an `ExprKind::Ret` that is preceded by a call to check contract ensures clause.
383+
fn checked_return(&mut self, opt_expr: Option<&'hir hir::Expr<'hir>>) -> hir::ExprKind<'hir> {
384+
let checked_ret = if let Some(Some((span, fresh_ident))) =
385+
self.contract.as_ref().map(|c| c.ensures.as_ref().map(|e| (e.expr.span, e.fresh_ident)))
386+
{
387+
let expr = opt_expr.unwrap_or_else(|| self.expr_unit(span));
388+
Some(self.inject_ensures_check(expr, span, fresh_ident.0, fresh_ident.2))
389+
} else {
390+
opt_expr
391+
};
392+
hir::ExprKind::Ret(checked_ret)
393+
}
394+
395+
/// Wraps an expression with a call to the ensures check before it gets returned.
396+
pub(crate) fn inject_ensures_check(
397+
&mut self,
398+
expr: &'hir hir::Expr<'hir>,
399+
span: Span,
400+
check_ident: Ident,
401+
check_hir_id: HirId,
402+
) -> &'hir hir::Expr<'hir> {
403+
let checker_fn = self.expr_ident(span, check_ident, check_hir_id);
404+
let span = self.mark_span_with_reason(DesugaringKind::Contract, span, None);
405+
self.expr_call(span, checker_fn, std::slice::from_ref(expr))
406+
}
407+
385408
pub(crate) fn lower_const_block(&mut self, c: &AnonConst) -> hir::ConstBlock {
386409
self.with_new_scopes(c.value.span, |this| {
387410
let def_id = this.local_def_id(c.id);
@@ -1512,15 +1535,39 @@ impl<'hir> LoweringContext<'_, 'hir> {
15121535

15131536
let lang_item = match (e1, e2, lims) {
15141537
(None, None, HalfOpen) => hir::LangItem::RangeFull,
1515-
(Some(..), None, HalfOpen) => hir::LangItem::RangeFrom,
1538+
(Some(..), None, HalfOpen) => {
1539+
if self.tcx.features().new_range() {
1540+
hir::LangItem::RangeFromCopy
1541+
} else {
1542+
hir::LangItem::RangeFrom
1543+
}
1544+
}
15161545
(None, Some(..), HalfOpen) => hir::LangItem::RangeTo,
1517-
(Some(..), Some(..), HalfOpen) => hir::LangItem::Range,
1546+
(Some(..), Some(..), HalfOpen) => {
1547+
if self.tcx.features().new_range() {
1548+
hir::LangItem::RangeCopy
1549+
} else {
1550+
hir::LangItem::Range
1551+
}
1552+
}
15181553
(None, Some(..), Closed) => hir::LangItem::RangeToInclusive,
1519-
(Some(..), Some(..), Closed) => unreachable!(),
1554+
(Some(e1), Some(e2), Closed) => {
1555+
if self.tcx.features().new_range() {
1556+
hir::LangItem::RangeInclusiveCopy
1557+
} else {
1558+
return self.lower_expr_range_closed(span, e1, e2);
1559+
}
1560+
}
15201561
(start, None, Closed) => {
15211562
self.dcx().emit_err(InclusiveRangeWithNoEnd { span });
15221563
match start {
1523-
Some(..) => hir::LangItem::RangeFrom,
1564+
Some(..) => {
1565+
if self.tcx.features().new_range() {
1566+
hir::LangItem::RangeFromCopy
1567+
} else {
1568+
hir::LangItem::RangeFrom
1569+
}
1570+
}
15241571
None => hir::LangItem::RangeFull,
15251572
}
15261573
}
@@ -1970,7 +2017,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
19702017
),
19712018
))
19722019
} else {
1973-
self.arena.alloc(self.expr(try_span, hir::ExprKind::Ret(Some(from_residual_expr))))
2020+
let ret_expr = self.checked_return(Some(from_residual_expr));
2021+
self.arena.alloc(self.expr(try_span, ret_expr))
19742022
};
19752023
self.lower_attrs(ret_expr.hir_id, &attrs);
19762024

@@ -2019,7 +2067,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
20192067
let target_id = Ok(catch_id);
20202068
hir::ExprKind::Break(hir::Destination { label: None, target_id }, Some(from_yeet_expr))
20212069
} else {
2022-
hir::ExprKind::Ret(Some(from_yeet_expr))
2070+
self.checked_return(Some(from_yeet_expr))
20232071
}
20242072
}
20252073

compiler/rustc_ast_lowering/src/index.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,8 +412,12 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
412412
});
413413
}
414414

415-
fn visit_pattern_type_pattern(&mut self, p: &'hir hir::Pat<'hir>) {
416-
self.visit_pat(p)
415+
fn visit_pattern_type_pattern(&mut self, pat: &'hir hir::TyPat<'hir>) {
416+
self.insert(pat.span, pat.hir_id, Node::TyPat(pat));
417+
418+
self.with_parent(pat.hir_id, |this| {
419+
intravisit::walk_ty_pat(this, pat);
420+
});
417421
}
418422

419423
fn visit_precise_capturing_arg(

0 commit comments

Comments
 (0)