Skip to content

Commit f0f009e

Browse files
committed
Auto merge of rust-lang#120829 - matthiaskrgr:rollup-p9tuwaa, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - rust-lang#120308 (core/time: avoid divisions in Duration::new) - rust-lang#120596 ([rustdoc] Correctly generate path for non-local items in source code pages) - rust-lang#120693 (Invert diagnostic lints.) - rust-lang#120704 (A drive-by rewrite of `give_region_a_name()`) - rust-lang#120809 (Use `transmute_unchecked` in `NonZero::new`.) - rust-lang#120817 (Fix more `ty::Error` ICEs in MIR passes) - rust-lang#120828 (Fix `ErrorGuaranteed` unsoundness with stash/steal.) r? `@ghost` `@rustbot` modify labels: rollup
2 parents 98aa362 + e0b21b8 commit f0f009e

File tree

124 files changed

+490
-336
lines changed

Some content is hidden

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

124 files changed

+490
-336
lines changed

compiler/rustc_arena/src/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
#![cfg_attr(test, feature(test))]
2323
#![feature(strict_provenance)]
2424
#![deny(unsafe_op_in_unsafe_fn)]
25-
#![deny(rustc::untranslatable_diagnostic)]
26-
#![deny(rustc::diagnostic_outside_of_impl)]
2725
#![allow(internal_features)]
2826
#![allow(clippy::mut_from_ref)] // Arena allocators are one of the places where this pattern is fine.
2927

compiler/rustc_ast/src/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
#![feature(min_specialization)]
1919
#![feature(negative_impls)]
2020
#![feature(stmt_expr_attributes)]
21-
#![deny(rustc::untranslatable_diagnostic)]
22-
#![deny(rustc::diagnostic_outside_of_impl)]
2321

2422
#[macro_use]
2523
extern crate rustc_macros;

compiler/rustc_ast_lowering/src/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@
3636
#![feature(assert_matches)]
3737
#![feature(box_patterns)]
3838
#![feature(let_chains)]
39-
#![deny(rustc::untranslatable_diagnostic)]
40-
#![deny(rustc::diagnostic_outside_of_impl)]
4139

4240
#[macro_use]
4341
extern crate tracing;

compiler/rustc_ast_passes/src/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
#![feature(if_let_guard)]
1212
#![feature(iter_is_partitioned)]
1313
#![feature(let_chains)]
14-
#![deny(rustc::untranslatable_diagnostic)]
15-
#![deny(rustc::diagnostic_outside_of_impl)]
1614

1715
pub mod ast_validation;
1816
mod errors;

compiler/rustc_ast_pretty/src/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
#![allow(internal_features)]
22
#![feature(rustdoc_internals)]
33
#![doc(rust_logo)]
4-
#![deny(rustc::untranslatable_diagnostic)]
5-
#![deny(rustc::diagnostic_outside_of_impl)]
64
#![feature(box_patterns)]
75

86
mod helpers;

compiler/rustc_attr/src/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
#![feature(rustdoc_internals)]
99
#![doc(rust_logo)]
1010
#![feature(let_chains)]
11-
#![deny(rustc::untranslatable_diagnostic)]
12-
#![deny(rustc::diagnostic_outside_of_impl)]
1311

1412
#[macro_use]
1513
extern crate rustc_macros;

compiler/rustc_borrowck/src/borrow_set.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
use crate::path_utils::allow_two_phase_borrow;
42
use crate::place_ext::PlaceExt;
53
use crate::BorrowIndex;

compiler/rustc_borrowck/src/borrowck_errors.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
#![allow(rustc::diagnostic_outside_of_impl)]
2+
#![allow(rustc::untranslatable_diagnostic)]
3+
14
use rustc_errors::{codes::*, struct_span_code_err, DiagCtxt, DiagnosticBuilder};
25
use rustc_middle::ty::{self, Ty, TyCtxt};
36
use rustc_span::Span;

compiler/rustc_borrowck/src/constraints/mod.rs

-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
3-
41
use rustc_data_structures::graph::scc::Sccs;
52
use rustc_index::{IndexSlice, IndexVec};
63
use rustc_middle::mir::ConstraintCategory;

compiler/rustc_borrowck/src/consumers.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
//! This file provides API for compiler consumers.
42
53
use rustc_hir::def_id::LocalDefId;

compiler/rustc_borrowck/src/dataflow.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
use rustc_data_structures::fx::FxIndexMap;
42
use rustc_data_structures::graph::WithSuccessors;
53
use rustc_index::bit_set::BitSet;

compiler/rustc_borrowck/src/def_use.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
use rustc_middle::mir::visit::{
42
MutatingUseContext, NonMutatingUseContext, NonUseContext, PlaceContext,
53
};

compiler/rustc_borrowck/src/diagnostics/bound_region_errors.rs

-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
3-
41
use rustc_errors::DiagnosticBuilder;
52
use rustc_infer::infer::canonical::Canonical;
63
use rustc_infer::infer::error_reporting::nice_region_error::NiceRegionError;

compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
// ignore-tidy-filelength
22

3+
#![allow(rustc::diagnostic_outside_of_impl)]
4+
#![allow(rustc::untranslatable_diagnostic)]
5+
36
use either::Either;
47
use rustc_data_structures::captures::Captures;
58
use rustc_data_structures::fx::FxIndexSet;

compiler/rustc_borrowck/src/diagnostics/explain_borrow.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
//! Print diagnostics to explain why values are borrowed.
22
3+
#![allow(rustc::diagnostic_outside_of_impl)]
4+
#![allow(rustc::untranslatable_diagnostic)]
5+
36
use rustc_errors::{Applicability, Diagnostic};
47
use rustc_hir as hir;
58
use rustc_hir::intravisit::Visitor;

compiler/rustc_borrowck/src/diagnostics/find_all_local_uses.rs

-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
3-
41
use std::collections::BTreeSet;
52

63
use rustc_middle::mir::visit::{PlaceContext, Visitor};

compiler/rustc_borrowck/src/diagnostics/find_use.rs

-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
3-
41
use std::collections::VecDeque;
52
use std::rc::Rc;
63

compiler/rustc_borrowck/src/diagnostics/move_errors.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
#![allow(rustc::diagnostic_outside_of_impl)]
2+
#![allow(rustc::untranslatable_diagnostic)]
3+
14
use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder};
25
use rustc_middle::mir::*;
36
use rustc_middle::ty::{self, Ty};

compiler/rustc_borrowck/src/diagnostics/mutability_errors.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
#![allow(rustc::diagnostic_outside_of_impl)]
2+
#![allow(rustc::untranslatable_diagnostic)]
3+
14
use hir::ExprKind;
25
use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder};
36
use rustc_hir as hir;

compiler/rustc_borrowck/src/diagnostics/outlives_suggestion.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
//! Contains utilities for generating suggestions for borrowck errors related to unsatisfied
22
//! outlives constraints.
33
4+
#![allow(rustc::diagnostic_outside_of_impl)]
5+
#![allow(rustc::untranslatable_diagnostic)]
6+
47
use rustc_data_structures::fx::FxIndexSet;
58
use rustc_errors::Diagnostic;
69
use rustc_middle::ty::RegionVid;

compiler/rustc_borrowck/src/diagnostics/region_errors.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
//! Error reporting machinery for lifetime errors.
42
53
use rustc_data_structures::fx::FxIndexSet;

compiler/rustc_borrowck/src/diagnostics/region_name.rs

+34-27
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
#![allow(rustc::diagnostic_outside_of_impl)]
2+
#![allow(rustc::untranslatable_diagnostic)]
3+
14
use std::fmt::{self, Display};
25
use std::iter;
36

7+
use rustc_data_structures::fx::IndexEntry;
48
use rustc_errors::Diagnostic;
59
use rustc_hir as hir;
610
use rustc_hir::def::{DefKind, Res};
@@ -14,7 +18,7 @@ use crate::{universal_regions::DefiningTy, MirBorrowckCtxt};
1418

1519
/// A name for a particular region used in emitting diagnostics. This name could be a generated
1620
/// name like `'1`, a name used by the user like `'a`, or a name like `'static`.
17-
#[derive(Debug, Clone)]
21+
#[derive(Debug, Clone, Copy)]
1822
pub(crate) struct RegionName {
1923
/// The name of the region (interned).
2024
pub(crate) name: Symbol,
@@ -25,7 +29,7 @@ pub(crate) struct RegionName {
2529
/// Denotes the source of a region that is named by a `RegionName`. For example, a free region that
2630
/// was named by the user would get `NamedLateParamRegion` and `'static` lifetime would get `Static`.
2731
/// This helps to print the right kinds of diagnostics.
28-
#[derive(Debug, Clone)]
32+
#[derive(Debug, Clone, Copy)]
2933
pub(crate) enum RegionNameSource {
3034
/// A bound (not free) region that was instantiated at the def site (not an HRTB).
3135
NamedEarlyParamRegion(Span),
@@ -42,7 +46,7 @@ pub(crate) enum RegionNameSource {
4246
/// The region corresponding to the return type of a closure.
4347
AnonRegionFromOutput(RegionNameHighlight, &'static str),
4448
/// The region from a type yielded by a coroutine.
45-
AnonRegionFromYieldTy(Span, String),
49+
AnonRegionFromYieldTy(Span, Symbol),
4650
/// An anonymous region from an async fn.
4751
AnonRegionFromAsyncFn(Span),
4852
/// An anonymous region from an impl self type or trait
@@ -51,19 +55,19 @@ pub(crate) enum RegionNameSource {
5155

5256
/// Describes what to highlight to explain to the user that we're giving an anonymous region a
5357
/// synthesized name, and how to highlight it.
54-
#[derive(Debug, Clone)]
58+
#[derive(Debug, Clone, Copy)]
5559
pub(crate) enum RegionNameHighlight {
5660
/// The anonymous region corresponds to a reference that was found by traversing the type in the HIR.
5761
MatchedHirTy(Span),
5862
/// The anonymous region corresponds to a `'_` in the generics list of a struct/enum/union.
5963
MatchedAdtAndSegment(Span),
6064
/// The anonymous region corresponds to a region where the type annotation is completely missing
6165
/// from the code, e.g. in a closure arguments `|x| { ... }`, where `x` is a reference.
62-
CannotMatchHirTy(Span, String),
66+
CannotMatchHirTy(Span, Symbol),
6367
/// The anonymous region corresponds to a region where the type annotation is completely missing
6468
/// from the code, and *even if* we print out the full name of the type, the region name won't
6569
/// be included. This currently occurs for opaque types like `impl Future`.
66-
Occluded(Span, String),
70+
Occluded(Span, Symbol),
6771
}
6872

6973
impl RegionName {
@@ -247,25 +251,28 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
247251

248252
assert!(self.regioncx.universal_regions().is_universal_region(fr));
249253

250-
if let Some(value) = self.region_names.try_borrow_mut().unwrap().get(&fr) {
251-
return Some(value.clone());
252-
}
254+
match self.region_names.borrow_mut().entry(fr) {
255+
IndexEntry::Occupied(precomputed_name) => Some(*precomputed_name.get()),
256+
IndexEntry::Vacant(slot) => {
257+
let new_name = self
258+
.give_name_from_error_region(fr)
259+
.or_else(|| self.give_name_if_anonymous_region_appears_in_arguments(fr))
260+
.or_else(|| self.give_name_if_anonymous_region_appears_in_upvars(fr))
261+
.or_else(|| self.give_name_if_anonymous_region_appears_in_output(fr))
262+
.or_else(|| self.give_name_if_anonymous_region_appears_in_yield_ty(fr))
263+
.or_else(|| self.give_name_if_anonymous_region_appears_in_impl_signature(fr))
264+
.or_else(|| {
265+
self.give_name_if_anonymous_region_appears_in_arg_position_impl_trait(fr)
266+
});
267+
268+
if let Some(new_name) = new_name {
269+
slot.insert(new_name);
270+
}
271+
debug!("give_region_a_name: gave name {:?}", new_name);
253272

254-
let value = self
255-
.give_name_from_error_region(fr)
256-
.or_else(|| self.give_name_if_anonymous_region_appears_in_arguments(fr))
257-
.or_else(|| self.give_name_if_anonymous_region_appears_in_upvars(fr))
258-
.or_else(|| self.give_name_if_anonymous_region_appears_in_output(fr))
259-
.or_else(|| self.give_name_if_anonymous_region_appears_in_yield_ty(fr))
260-
.or_else(|| self.give_name_if_anonymous_region_appears_in_impl_signature(fr))
261-
.or_else(|| self.give_name_if_anonymous_region_appears_in_arg_position_impl_trait(fr));
262-
263-
if let Some(value) = &value {
264-
self.region_names.try_borrow_mut().unwrap().insert(fr, value.clone());
273+
new_name
274+
}
265275
}
266-
267-
debug!("give_region_a_name: gave name {:?}", value);
268-
value
269276
}
270277

271278
/// Checks for the case where `fr` maps to something that the
@@ -457,9 +464,9 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
457464
);
458465
if type_name.contains(&format!("'{counter}")) {
459466
// Only add a label if we can confirm that a region was labelled.
460-
RegionNameHighlight::CannotMatchHirTy(span, type_name)
467+
RegionNameHighlight::CannotMatchHirTy(span, Symbol::intern(&type_name))
461468
} else {
462-
RegionNameHighlight::Occluded(span, type_name)
469+
RegionNameHighlight::Occluded(span, Symbol::intern(&type_name))
463470
}
464471
}
465472

@@ -888,7 +895,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
888895

889896
Some(RegionName {
890897
name: self.synthesize_region_name(),
891-
source: RegionNameSource::AnonRegionFromYieldTy(yield_span, type_name),
898+
source: RegionNameSource::AnonRegionFromYieldTy(yield_span, Symbol::intern(&type_name)),
892899
})
893900
}
894901

@@ -980,7 +987,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
980987
Some(RegionName {
981988
name: region_name,
982989
source: RegionNameSource::AnonRegionFromArgument(
983-
RegionNameHighlight::CannotMatchHirTy(arg_span, arg_name?.to_string()),
990+
RegionNameHighlight::CannotMatchHirTy(arg_span, arg_name?),
984991
),
985992
})
986993
} else {

compiler/rustc_borrowck/src/diagnostics/var_name.rs

-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
3-
41
use crate::region_infer::RegionInferenceContext;
52
use rustc_index::IndexSlice;
63
use rustc_middle::mir::{Body, Local};

compiler/rustc_borrowck/src/facts.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
use crate::location::{LocationIndex, LocationTable};
42
use crate::BorrowIndex;
53
use polonius_engine::AllFacts as PoloniusFacts;

compiler/rustc_borrowck/src/location.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
use rustc_index::IndexVec;
42
use rustc_middle::mir::{BasicBlock, Body, Location};
53

compiler/rustc_borrowck/src/member_constraints.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
use rustc_data_structures::captures::Captures;
42
use rustc_data_structures::fx::FxIndexMap;
53
use rustc_index::{IndexSlice, IndexVec};

compiler/rustc_borrowck/src/nll.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
//! The entry point of the NLL borrow checker.
42
53
use polonius_engine::{Algorithm, Output};

compiler/rustc_borrowck/src/path_utils.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
use crate::borrow_set::{BorrowData, BorrowSet, TwoPhaseActivation};
42
use crate::places_conflict;
53
use crate::AccessDepth;

compiler/rustc_borrowck/src/place_ext.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
use crate::borrow_set::LocalsStateAtExit;
42
use rustc_hir as hir;
53
use rustc_middle::mir::ProjectionElem;

compiler/rustc_borrowck/src/places_conflict.rs

-2
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@
5050
//! and either equal or disjoint.
5151
//! - If we did run out of access, the borrow can access a part of it.
5252
53-
#![deny(rustc::untranslatable_diagnostic)]
54-
#![deny(rustc::diagnostic_outside_of_impl)]
5553
use crate::ArtificialField;
5654
use crate::Overlap;
5755
use crate::{AccessDepth, Deep, Shallow};

compiler/rustc_borrowck/src/polonius/loan_invalidations.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
use rustc_data_structures::graph::dominators::Dominators;
42
use rustc_middle::mir::visit::Visitor;
53
use rustc_middle::mir::{self, BasicBlock, Body, Location, NonDivergingIntrinsic, Place, Rvalue};

compiler/rustc_borrowck/src/polonius/loan_kills.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
use rustc_middle::mir::visit::Visitor;
42
use rustc_middle::mir::{
53
Body, Local, Location, Place, PlaceRef, ProjectionElem, Rvalue, Statement, StatementKind,

compiler/rustc_borrowck/src/prefixes.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
//! From the NLL RFC: "The deep [aka 'supporting'] prefixes for an
42
//! place are formed by stripping away fields and derefs, except that
53
//! we stop when we reach the deref of a shared reference. [...] "

compiler/rustc_borrowck/src/region_infer/dump_mir.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
//! As part of generating the regions, if you enable `-Zdump-mir=nll`,
42
//! we will generate an annotated copy of the MIR that includes the
53
//! state of region inference. This code handles emitting the region

compiler/rustc_borrowck/src/region_infer/graphviz.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
//! This module provides linkage between RegionInferenceContext and
42
//! `rustc_graphviz` traits, specialized to attaching borrowck analysis
53
//! data to rendered labels.

compiler/rustc_borrowck/src/region_infer/opaque_types.rs

+2
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,8 @@ fn check_opaque_type_parameter_valid(
418418
.into_iter()
419419
.map(|i| tcx.def_span(opaque_generics.param_at(i, tcx).def_id))
420420
.collect();
421+
#[allow(rustc::diagnostic_outside_of_impl)]
422+
#[allow(rustc::untranslatable_diagnostic)]
421423
return Err(tcx
422424
.dcx()
423425
.struct_span_err(span, "non-defining opaque type use in defining scope")

compiler/rustc_borrowck/src/region_infer/reverse_sccs.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#![deny(rustc::untranslatable_diagnostic)]
2-
#![deny(rustc::diagnostic_outside_of_impl)]
31
use crate::constraints::ConstraintSccIndex;
42
use crate::RegionInferenceContext;
53
use itertools::Itertools;

0 commit comments

Comments
 (0)