Skip to content

Commit 6ee4265

Browse files
committed
Auto merge of rust-lang#104455 - the8472:dont-drain-on-drop, r=Amanieu
Don't drain-on-drop in DrainFilter impls of various collections. This removes drain-on-drop behavior from various unstable DrainFilter impls (not yet for HashSet/Map) because that behavior [is problematic](rust-lang#43244 (comment)) (because it can lead to panic-in-drop when user closures panic) and may become forbidden if [this draft RFC passes](rust-lang/rfcs#3288). closes rust-lang#101122 [ACP](rust-lang/libs-team#136) affected tracking issues * rust-lang#43244 * rust-lang#70530 * rust-lang#59618 Related hashbrown update: rust-lang/hashbrown#374
2 parents 8c74a5d + 0c5f442 commit 6ee4265

File tree

43 files changed

+449
-577
lines changed

Some content is hidden

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

43 files changed

+449
-577
lines changed

Cargo.lock

+16-1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@ dependencies = [
6565
"rand_xorshift",
6666
]
6767

68+
[[package]]
69+
name = "allocator-api2"
70+
version = "0.2.14"
71+
source = "registry+https://github.com/rust-lang/crates.io-index"
72+
checksum = "c4f263788a35611fba42eb41ff811c5d0360c58b97402570312a350736e2542e"
73+
6874
[[package]]
6975
name = "ammonia"
7076
version = "3.2.0"
@@ -1522,6 +1528,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
15221528
checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038"
15231529
dependencies = [
15241530
"ahash 0.8.2",
1531+
]
1532+
1533+
[[package]]
1534+
name = "hashbrown"
1535+
version = "0.14.0"
1536+
source = "registry+https://github.com/rust-lang/crates.io-index"
1537+
checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
1538+
dependencies = [
1539+
"allocator-api2",
15251540
"compiler_builtins",
15261541
"rustc-std-workspace-alloc",
15271542
"rustc-std-workspace-core",
@@ -4633,7 +4648,7 @@ dependencies = [
46334648
"core",
46344649
"dlmalloc",
46354650
"fortanix-sgx-abi",
4636-
"hashbrown 0.13.1",
4651+
"hashbrown 0.14.0",
46374652
"hermit-abi 0.3.0",
46384653
"libc",
46394654
"miniz_oxide",

compiler/rustc_errors/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
55
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
66
#![feature(array_windows)]
7-
#![feature(drain_filter)]
7+
#![feature(extract_if)]
88
#![feature(if_let_guard)]
99
#![feature(let_chains)]
1010
#![feature(never_type)]
@@ -1399,7 +1399,7 @@ impl HandlerInner {
13991399
!self.emitted_diagnostics.insert(diagnostic_hash)
14001400
};
14011401

1402-
diagnostic.children.drain_filter(already_emitted_sub).for_each(|_| {});
1402+
diagnostic.children.extract_if(already_emitted_sub).for_each(|_| {});
14031403

14041404
self.emitter.emit_diagnostic(diagnostic);
14051405
if diagnostic.is_error() {

compiler/rustc_hir_analysis/src/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,6 @@ This API is completely unstable and subject to change.
5959
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
6060
#![feature(box_patterns)]
6161
#![feature(control_flow_enum)]
62-
#![feature(drain_filter)]
63-
#![feature(hash_drain_filter)]
6462
#![feature(if_let_guard)]
6563
#![feature(is_sorted)]
6664
#![feature(iter_intersperse)]

compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -753,20 +753,20 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
753753
return;
754754
}
755755

756-
errors.drain_filter(|error| {
756+
errors.retain(|error| {
757757
let Error::Invalid(
758758
provided_idx,
759759
expected_idx,
760760
Compatibility::Incompatible(Some(e)),
761-
) = error else { return false };
761+
) = error else { return true };
762762
let (provided_ty, provided_span) = provided_arg_tys[*provided_idx];
763763
let trace =
764764
mk_trace(provided_span, formal_and_expected_inputs[*expected_idx], provided_ty);
765765
if !matches!(trace.cause.as_failure_code(*e), FailureCode::Error0308) {
766766
self.err_ctxt().report_and_explain_type_error(trace, *e).emit();
767-
return true;
767+
return false;
768768
}
769-
false
769+
true
770770
});
771771

772772
// We're done if we found errors, but we already emitted them.

compiler/rustc_hir_typeck/src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
#![feature(box_patterns)]
66
#![feature(min_specialization)]
77
#![feature(control_flow_enum)]
8-
#![feature(drain_filter)]
98
#![feature(option_as_slice)]
109
#![allow(rustc::potential_query_instability)]
1110
#![recursion_limit = "256"]

compiler/rustc_metadata/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
22
#![feature(decl_macro)]
3-
#![feature(drain_filter)]
3+
#![feature(extract_if)]
44
#![feature(generators)]
55
#![feature(iter_from_generator)]
66
#![feature(let_chains)]

compiler/rustc_metadata/src/native_libs.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ impl<'tcx> Collector<'tcx> {
425425
// can move them to the end of the list below.
426426
let mut existing = self
427427
.libs
428-
.drain_filter(|lib| {
428+
.extract_if(|lib| {
429429
if lib.name.as_str() == passed_lib.name {
430430
// FIXME: This whole logic is questionable, whether modifiers are
431431
// involved or not, library reordering and kind overriding without

compiler/rustc_middle/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
#![feature(try_reserve_kind)]
5555
#![feature(nonzero_ops)]
5656
#![feature(decl_macro)]
57-
#![feature(drain_filter)]
57+
#![feature(extract_if)]
5858
#![feature(intra_doc_pointers)]
5959
#![feature(yeet_expr)]
6060
#![feature(result_option_inspect)]

compiler/rustc_middle/src/ty/diagnostics.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ pub fn suggest_constraining_type_params<'a>(
237237

238238
{
239239
let mut sized_constraints =
240-
constraints.drain_filter(|(_, def_id)| *def_id == tcx.lang_items().sized_trait());
240+
constraints.extract_if(|(_, def_id)| *def_id == tcx.lang_items().sized_trait());
241241
if let Some((constraint, def_id)) = sized_constraints.next() {
242242
applicability = Applicability::MaybeIncorrect;
243243

compiler/rustc_mir_transform/src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
#![deny(rustc::untranslatable_diagnostic)]
33
#![deny(rustc::diagnostic_outside_of_impl)]
44
#![feature(box_patterns)]
5-
#![feature(drain_filter)]
65
#![feature(is_sorted)]
76
#![feature(let_chains)]
87
#![feature(map_try_insert)]

compiler/rustc_mir_transform/src/sroa.rs

+6-8
Original file line numberDiff line numberDiff line change
@@ -436,26 +436,24 @@ impl<'tcx, 'll> MutVisitor<'tcx> for ReplacementVisitor<'tcx, 'll> {
436436
VarDebugInfoContents::Composite { ty: _, ref mut fragments } => {
437437
let mut new_fragments = Vec::new();
438438
debug!(?fragments);
439-
fragments
440-
.drain_filter(|fragment| {
441-
if let Some(repl) =
439+
fragments.retain_mut(|fragment| {
440+
if let Some(repl) =
442441
self.replacements.replace_place(self.tcx, fragment.contents.as_ref())
443442
{
444443
fragment.contents = repl;
445-
false
444+
true
446445
} else if let Some(local) = fragment.contents.as_local()
447446
&& let Some(frg) = self.gather_debug_info_fragments(local)
448447
{
449448
new_fragments.extend(frg.into_iter().map(|mut f| {
450449
f.projection.splice(0..0, fragment.projection.iter().copied());
451450
f
452451
}));
453-
true
454-
} else {
455452
false
453+
} else {
454+
true
456455
}
457-
})
458-
.for_each(drop);
456+
});
459457
debug!(?fragments);
460458
debug!(?new_fragments);
461459
fragments.extend(new_fragments);

compiler/rustc_resolve/src/diagnostics.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2494,7 +2494,7 @@ fn show_candidates(
24942494
for path_strings in [&mut accessible_path_strings, &mut inaccessible_path_strings] {
24952495
path_strings.sort_by(|a, b| a.0.cmp(&b.0));
24962496
let core_path_strings =
2497-
path_strings.drain_filter(|p| p.0.starts_with("core::")).collect::<Vec<_>>();
2497+
path_strings.extract_if(|p| p.0.starts_with("core::")).collect::<Vec<_>>();
24982498
path_strings.extend(core_path_strings);
24992499
path_strings.dedup_by(|a, b| a.0 == b.0);
25002500
}

compiler/rustc_resolve/src/late/diagnostics.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
496496
// Try to filter out intrinsics candidates, as long as we have
497497
// some other candidates to suggest.
498498
let intrinsic_candidates: Vec<_> = candidates
499-
.drain_filter(|sugg| {
499+
.extract_if(|sugg| {
500500
let path = path_names_to_string(&sugg.path);
501501
path.starts_with("core::intrinsics::") || path.starts_with("std::intrinsics::")
502502
})

compiler/rustc_resolve/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
1010
#![feature(assert_matches)]
1111
#![feature(box_patterns)]
12-
#![feature(drain_filter)]
12+
#![feature(extract_if)]
1313
#![feature(if_let_guard)]
1414
#![feature(iter_intersperse)]
1515
#![feature(let_chains)]

compiler/rustc_trait_selection/src/lib.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@
1414
#![feature(associated_type_bounds)]
1515
#![feature(box_patterns)]
1616
#![feature(control_flow_enum)]
17-
#![feature(drain_filter)]
18-
#![feature(hash_drain_filter)]
17+
#![feature(extract_if)]
1918
#![feature(let_chains)]
2019
#![feature(if_let_guard)]
2120
#![feature(never_type)]

compiler/rustc_trait_selection/src/traits/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ pub fn normalize_param_env_or_error<'tcx>(
354354
// This works fairly well because trait matching does not actually care about param-env
355355
// TypeOutlives predicates - these are normally used by regionck.
356356
let outlives_predicates: Vec<_> = predicates
357-
.drain_filter(|predicate| {
357+
.extract_if(|predicate| {
358358
matches!(
359359
predicate.kind().skip_binder(),
360360
ty::PredicateKind::Clause(ty::Clause::TypeOutlives(..))

compiler/rustc_trait_selection/src/traits/project.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1170,11 +1170,11 @@ fn opt_normalize_projection_type<'a, 'b, 'tcx>(
11701170
};
11711171

11721172
let mut deduped: SsoHashSet<_> = Default::default();
1173-
result.obligations.drain_filter(|projected_obligation| {
1173+
result.obligations.retain(|projected_obligation| {
11741174
if !deduped.insert(projected_obligation.clone()) {
1175-
return true;
1175+
return false;
11761176
}
1177-
false
1177+
true
11781178
});
11791179

11801180
if use_cache {

compiler/rustc_traits/src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#![deny(rustc::untranslatable_diagnostic)]
55
#![deny(rustc::diagnostic_outside_of_impl)]
66
#![feature(let_chains)]
7-
#![feature(drain_filter)]
87
#![recursion_limit = "256"]
98

109
#[macro_use]

library/alloc/benches/btree/map.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -385,15 +385,15 @@ pub fn clone_slim_100_and_clear(b: &mut Bencher) {
385385
#[bench]
386386
pub fn clone_slim_100_and_drain_all(b: &mut Bencher) {
387387
let src = slim_map(100);
388-
b.iter(|| src.clone().drain_filter(|_, _| true).count())
388+
b.iter(|| src.clone().extract_if(|_, _| true).count())
389389
}
390390

391391
#[bench]
392392
pub fn clone_slim_100_and_drain_half(b: &mut Bencher) {
393393
let src = slim_map(100);
394394
b.iter(|| {
395395
let mut map = src.clone();
396-
assert_eq!(map.drain_filter(|i, _| i % 2 == 0).count(), 100 / 2);
396+
assert_eq!(map.extract_if(|i, _| i % 2 == 0).count(), 100 / 2);
397397
assert_eq!(map.len(), 100 / 2);
398398
})
399399
}
@@ -456,15 +456,15 @@ pub fn clone_slim_10k_and_clear(b: &mut Bencher) {
456456
#[bench]
457457
pub fn clone_slim_10k_and_drain_all(b: &mut Bencher) {
458458
let src = slim_map(10_000);
459-
b.iter(|| src.clone().drain_filter(|_, _| true).count())
459+
b.iter(|| src.clone().extract_if(|_, _| true).count())
460460
}
461461

462462
#[bench]
463463
pub fn clone_slim_10k_and_drain_half(b: &mut Bencher) {
464464
let src = slim_map(10_000);
465465
b.iter(|| {
466466
let mut map = src.clone();
467-
assert_eq!(map.drain_filter(|i, _| i % 2 == 0).count(), 10_000 / 2);
467+
assert_eq!(map.extract_if(|i, _| i % 2 == 0).count(), 10_000 / 2);
468468
assert_eq!(map.len(), 10_000 / 2);
469469
})
470470
}
@@ -527,15 +527,15 @@ pub fn clone_fat_val_100_and_clear(b: &mut Bencher) {
527527
#[bench]
528528
pub fn clone_fat_val_100_and_drain_all(b: &mut Bencher) {
529529
let src = fat_val_map(100);
530-
b.iter(|| src.clone().drain_filter(|_, _| true).count())
530+
b.iter(|| src.clone().extract_if(|_, _| true).count())
531531
}
532532

533533
#[bench]
534534
pub fn clone_fat_val_100_and_drain_half(b: &mut Bencher) {
535535
let src = fat_val_map(100);
536536
b.iter(|| {
537537
let mut map = src.clone();
538-
assert_eq!(map.drain_filter(|i, _| i % 2 == 0).count(), 100 / 2);
538+
assert_eq!(map.extract_if(|i, _| i % 2 == 0).count(), 100 / 2);
539539
assert_eq!(map.len(), 100 / 2);
540540
})
541541
}

library/alloc/benches/btree/set.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,15 @@ pub fn clone_100_and_clear(b: &mut Bencher) {
6969
#[bench]
7070
pub fn clone_100_and_drain_all(b: &mut Bencher) {
7171
let src = slim_set(100);
72-
b.iter(|| src.clone().drain_filter(|_| true).count())
72+
b.iter(|| src.clone().extract_if(|_| true).count())
7373
}
7474

7575
#[bench]
7676
pub fn clone_100_and_drain_half(b: &mut Bencher) {
7777
let src = slim_set(100);
7878
b.iter(|| {
7979
let mut set = src.clone();
80-
assert_eq!(set.drain_filter(|i| i % 2 == 0).count(), 100 / 2);
80+
assert_eq!(set.extract_if(|i| i % 2 == 0).count(), 100 / 2);
8181
assert_eq!(set.len(), 100 / 2);
8282
})
8383
}
@@ -140,15 +140,15 @@ pub fn clone_10k_and_clear(b: &mut Bencher) {
140140
#[bench]
141141
pub fn clone_10k_and_drain_all(b: &mut Bencher) {
142142
let src = slim_set(10_000);
143-
b.iter(|| src.clone().drain_filter(|_| true).count())
143+
b.iter(|| src.clone().extract_if(|_| true).count())
144144
}
145145

146146
#[bench]
147147
pub fn clone_10k_and_drain_half(b: &mut Bencher) {
148148
let src = slim_set(10_000);
149149
b.iter(|| {
150150
let mut set = src.clone();
151-
assert_eq!(set.drain_filter(|i| i % 2 == 0).count(), 10_000 / 2);
151+
assert_eq!(set.extract_if(|i| i % 2 == 0).count(), 10_000 / 2);
152152
assert_eq!(set.len(), 10_000 / 2);
153153
})
154154
}

library/alloc/benches/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Disabling on android for the time being
22
// See https://github.com/rust-lang/rust/issues/73535#event-3477699747
33
#![cfg(not(target_os = "android"))]
4-
#![feature(btree_drain_filter)]
4+
#![feature(btree_extract_if)]
55
#![feature(iter_next_chunk)]
66
#![feature(repr_simd)]
77
#![feature(slice_partition_dedup)]

0 commit comments

Comments
 (0)