Skip to content

Commit f001f93

Browse files
committed
Auto merge of #97000 - matthiaskrgr:rollup-qh3lhu8, r=matthiaskrgr
Rollup of 5 pull requests Successful merges: - #96932 (Clarify what values `BorrowedHandle`, `OwnedHandle` etc. can hold.) - #96948 (Add test of matches macro for trailing commas) - #96988 (Fix platform support links.) - #96989 (Be more precise than DefPathData::Misc.) - #96993 (rustdoc: fix GUI crash when searching for magic JS property values) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
2 parents 925e774 + 5a111df commit f001f93

File tree

18 files changed

+171
-56
lines changed

18 files changed

+171
-56
lines changed

compiler/rustc_hir/src/definitions.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -261,14 +261,16 @@ pub enum DefPathData {
261261
// they are treated specially by the `def_path` function.
262262
/// The crate root (marker).
263263
CrateRoot,
264-
// Catch-all for random `DefId` things like `DUMMY_NODE_ID`.
265-
Misc,
266264

267265
// Different kinds of items and item-like things:
268266
/// An impl.
269267
Impl,
270268
/// An `extern` block.
271269
ForeignMod,
270+
/// A `use` item.
271+
Use,
272+
/// A global asm item.
273+
GlobalAsm,
272274
/// Something in the type namespace.
273275
TypeNs(Symbol),
274276
/// Something in the value namespace.
@@ -443,9 +445,8 @@ impl DefPathData {
443445
match *self {
444446
TypeNs(name) | ValueNs(name) | MacroNs(name) | LifetimeNs(name) => Some(name),
445447

446-
Impl | ForeignMod | CrateRoot | Misc | ClosureExpr | Ctor | AnonConst | ImplTrait => {
447-
None
448-
}
448+
Impl | ForeignMod | CrateRoot | Use | GlobalAsm | ClosureExpr | Ctor | AnonConst
449+
| ImplTrait => None,
449450
}
450451
}
451452

@@ -459,7 +460,8 @@ impl DefPathData {
459460
CrateRoot => DefPathDataName::Anon { namespace: kw::Crate },
460461
Impl => DefPathDataName::Anon { namespace: kw::Impl },
461462
ForeignMod => DefPathDataName::Anon { namespace: kw::Extern },
462-
Misc => DefPathDataName::Anon { namespace: sym::misc },
463+
Use => DefPathDataName::Anon { namespace: kw::Use },
464+
GlobalAsm => DefPathDataName::Anon { namespace: sym::global_asm },
463465
ClosureExpr => DefPathDataName::Anon { namespace: sym::closure },
464466
Ctor => DefPathDataName::Anon { namespace: sym::constructor },
465467
AnonConst => DefPathDataName::Anon { namespace: sym::constant },

compiler/rustc_middle/src/ty/mod.rs

+2-6
Original file line numberDiff line numberDiff line change
@@ -1994,6 +1994,7 @@ impl<'tcx> TyCtxt<'tcx> {
19941994
.filter(|item| item.kind == AssocKind::Fn && item.defaultness.has_value())
19951995
}
19961996

1997+
/// Look up the name of a definition across crates. This does not look at HIR.
19971998
fn opt_item_name(self, def_id: DefId) -> Option<Symbol> {
19981999
if let Some(cnum) = def_id.as_crate_root() {
19992000
Some(self.crate_name(cnum))
@@ -2014,16 +2015,11 @@ impl<'tcx> TyCtxt<'tcx> {
20142015

20152016
/// Look up the name of a definition across crates. This does not look at HIR.
20162017
///
2017-
/// When possible, this function should be used for cross-crate lookups over
2018-
/// [`opt_item_name`] to avoid invalidating the incremental cache. If you
2019-
/// need to handle items without a name, or HIR items that will not be
2020-
/// serialized cross-crate, or if you need the span of the item, use
2018+
/// This method will ICE if the corresponding item does not have a name. In these cases, use
20212019
/// [`opt_item_name`] instead.
20222020
///
20232021
/// [`opt_item_name`]: Self::opt_item_name
20242022
pub fn item_name(self, id: DefId) -> Symbol {
2025-
// Look at cross-crate items first to avoid invalidating the incremental cache
2026-
// unless we have to.
20272023
self.opt_item_name(id).unwrap_or_else(|| {
20282024
bug!("item_name: no name for {:?}", self.def_path(id));
20292025
})

compiler/rustc_resolve/src/def_collector.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ impl<'a, 'b> visit::Visitor<'a> for DefCollector<'a, 'b> {
109109
visit::walk_item(self, i);
110110
return self.visit_macro_invoc(i.id);
111111
}
112-
ItemKind::GlobalAsm(..) => DefPathData::Misc,
112+
ItemKind::GlobalAsm(..) => DefPathData::GlobalAsm,
113113
ItemKind::Use(..) => {
114114
return visit::walk_item(self, i);
115115
}
@@ -160,11 +160,11 @@ impl<'a, 'b> visit::Visitor<'a> for DefCollector<'a, 'b> {
160160
}
161161

162162
fn visit_use_tree(&mut self, use_tree: &'a UseTree, id: NodeId, _nested: bool) {
163-
self.create_def(id, DefPathData::Misc, use_tree.span);
163+
self.create_def(id, DefPathData::Use, use_tree.span);
164164
match use_tree.kind {
165165
UseTreeKind::Simple(_, id1, id2) => {
166-
self.create_def(id1, DefPathData::Misc, use_tree.prefix.span);
167-
self.create_def(id2, DefPathData::Misc, use_tree.prefix.span);
166+
self.create_def(id1, DefPathData::Use, use_tree.prefix.span);
167+
self.create_def(id2, DefPathData::Use, use_tree.prefix.span);
168168
}
169169
UseTreeKind::Glob => (),
170170
UseTreeKind::Nested(..) => {}

compiler/rustc_symbol_mangling/src/v0.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,8 @@ impl<'tcx> Printer<'tcx> for &mut SymbolMangler<'tcx> {
788788

789789
// These should never show up as `path_append` arguments.
790790
DefPathData::CrateRoot
791-
| DefPathData::Misc
791+
| DefPathData::Use
792+
| DefPathData::GlobalAsm
792793
| DefPathData::Impl
793794
| DefPathData::MacroNs(_)
794795
| DefPathData::LifetimeNs(_) => {

library/std/src/os/windows/io/handle.rs

+19-12
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ use crate::sys_common::{AsInner, FromInner, IntoInner};
2222
/// so it can be used in FFI in places where a handle is passed as an argument,
2323
/// it is not captured or consumed.
2424
///
25-
/// Note that it *may* have the value `INVALID_HANDLE_VALUE` (-1), which is
26-
/// sometimes a valid handle value. See [here] for the full story.
25+
/// Note that it *may* have the value `-1`, which in `BorrowedHandle` always
26+
/// represents a valid handle value, such as [the current process handle], and
27+
/// not `INVALID_HANDLE_VALUE`, despite the two having the same value. See
28+
/// [here] for the full story.
2729
///
2830
/// And, it *may* have the value `NULL` (0), which can occur when consoles are
2931
/// detached from processes, or when `windows_subsystem` is used.
@@ -33,6 +35,7 @@ use crate::sys_common::{AsInner, FromInner, IntoInner};
3335
/// handle, which is then borrowed under the same lifetime.
3436
///
3537
/// [here]: https://devblogs.microsoft.com/oldnewthing/20040302-00/?p=40443
38+
/// [the current process handle]: https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getcurrentprocess#remarks
3639
#[derive(Copy, Clone)]
3740
#[repr(transparent)]
3841
#[unstable(feature = "io_safety", issue = "87074")]
@@ -45,8 +48,10 @@ pub struct BorrowedHandle<'handle> {
4548
///
4649
/// This closes the handle on drop.
4750
///
48-
/// Note that it *may* have the value `INVALID_HANDLE_VALUE` (-1), which is
49-
/// sometimes a valid handle value. See [here] for the full story.
51+
/// Note that it *may* have the value `-1`, which in `OwnedHandle` always
52+
/// represents a valid handle value, such as [the current process handle], and
53+
/// not `INVALID_HANDLE_VALUE`, despite the two having the same value. See
54+
/// [here] for the full story.
5055
///
5156
/// And, it *may* have the value `NULL` (0), which can occur when consoles are
5257
/// detached from processes, or when `windows_subsystem` is used.
@@ -59,6 +64,7 @@ pub struct BorrowedHandle<'handle> {
5964
/// [`RegCloseKey`]: https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regclosekey
6065
///
6166
/// [here]: https://devblogs.microsoft.com/oldnewthing/20040302-00/?p=40443
67+
/// [the current process handle]: https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getcurrentprocess#remarks
6268
#[repr(transparent)]
6369
#[unstable(feature = "io_safety", issue = "87074")]
6470
pub struct OwnedHandle {
@@ -75,11 +81,13 @@ pub struct OwnedHandle {
7581
/// `NULL`. This ensures that such FFI calls cannot start using the handle without
7682
/// checking for `NULL` first.
7783
///
78-
/// This type considers any value other than `NULL` to be valid, including `INVALID_HANDLE_VALUE`.
79-
/// This is because APIs that use `NULL` as their sentry value don't treat `INVALID_HANDLE_VALUE`
80-
/// as special.
84+
/// This type may hold any handle value that [`OwnedHandle`] may hold. As with `OwnedHandle`, when
85+
/// it holds `-1`, that value is interpreted as a valid handle value, such as
86+
/// [the current process handle], and not `INVALID_HANDLE_VALUE`.
8187
///
82-
/// If this holds a valid handle, it will close the handle on drop.
88+
/// If this holds a non-null handle, it will close the handle on drop.
89+
///
90+
/// [the current process handle]: https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getcurrentprocess#remarks
8391
#[repr(transparent)]
8492
#[unstable(feature = "io_safety", issue = "87074")]
8593
#[derive(Debug)]
@@ -95,11 +103,10 @@ pub struct HandleOrNull(OwnedHandle);
95103
/// `INVALID_HANDLE_VALUE`. This ensures that such FFI calls cannot start using the handle without
96104
/// checking for `INVALID_HANDLE_VALUE` first.
97105
///
98-
/// This type considers any value other than `INVALID_HANDLE_VALUE` to be valid, including `NULL`.
99-
/// This is because APIs that use `INVALID_HANDLE_VALUE` as their sentry value may return `NULL`
100-
/// under `windows_subsystem = "windows"` or other situations where I/O devices are detached.
106+
/// This type may hold any handle value that [`OwnedHandle`] may hold, except that when it holds
107+
/// `-1`, that value is interpreted to mean `INVALID_HANDLE_VALUE`.
101108
///
102-
/// If this holds a valid handle, it will close the handle on drop.
109+
/// If holds a handle other than `INVALID_HANDLE_VALUE`, it will close the handle on drop.
103110
#[repr(transparent)]
104111
#[unstable(feature = "io_safety", issue = "87074")]
105112
#[derive(Debug)]

library/std/src/os/windows/io/raw.rs

+7
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,15 @@ pub trait AsRawHandle {
3232
/// raw handle to the caller, and the handle is only guaranteed
3333
/// to be valid while the original object has not yet been destroyed.
3434
///
35+
/// This function may return null, such as when called on [`Stdin`],
36+
/// [`Stdout`], or [`Stderr`] when the console is detached.
37+
///
3538
/// However, borrowing is not strictly required. See [`AsHandle::as_handle`]
3639
/// for an API which strictly borrows a handle.
40+
///
41+
/// [`Stdin`]: io::Stdin
42+
/// [`Stdout`]: io::Stdout
43+
/// [`Stderr`]: io::Stderr
3744
#[stable(feature = "rust1", since = "1.0.0")]
3845
fn as_raw_handle(&self) -> RawHandle;
3946
}

src/doc/rustc/src/SUMMARY.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
- [Platform Support](platform-support.md)
1616
- [Template for target-specific documentation](platform-support/TEMPLATE.md)
1717
- [aarch64-apple-ios-sim](platform-support/aarch64-apple-ios-sim.md)
18-
- [aarch64-unknown-none-hermitkernel](platform-support/aarch64-unknown-none-hermitkernel.md)
1918
- [armv7-unknown-linux-uclibceabi](platform-support/armv7-unknown-linux-uclibceabi.md)
2019
- [armv7-unknown-linux-uclibceabihf](platform-support/armv7-unknown-linux-uclibceabihf.md)
2120
- [\*-kmc-solid_\*](platform-support/kmc-solid.md)
2221
- [m68k-unknown-linux-gnu](platform-support/m68k-unknown-linux-gnu.md)
2322
- [mips64-openwrt-linux-musl](platform-support/mips64-openwrt-linux-musl.md)
23+
- [nvptx64-nvidia-cuda](platform-support/nvptx64-nvidia-cuda.md)
2424
- [*-unknown-openbsd](platform-support/openbsd.md)
2525
- [wasm64-unknown-unknown](platform-support/wasm64-unknown-unknown.md)
2626
- [x86_64-unknown-none](platform-support/x86_64-unknown-none.md)

src/librustdoc/html/static/js/search.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ window.initSearch = rawSearchIndex => {
119119
*/
120120
let searchIndex;
121121
let currentResults;
122-
const ALIASES = {};
122+
const ALIASES = Object.create(null);
123123
const params = searchState.getQueryStringParams();
124124

125125
// Populate search bar with query string search term when provided,
@@ -1953,7 +1953,7 @@ window.initSearch = rawSearchIndex => {
19531953
}
19541954

19551955
if (aliases) {
1956-
ALIASES[crate] = {};
1956+
ALIASES[crate] = Object.create(null);
19571957
for (const alias_name in aliases) {
19581958
if (!hasOwnPropertyRustdoc(aliases, alias_name)) {
19591959
continue;

src/test/mir-opt/inline/cycle.g.Inline.diff

+37-4
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,55 @@
44
fn g() -> () {
55
let mut _0: (); // return place in scope 0 at $DIR/cycle.rs:11:8: 11:8
66
let _1: (); // in scope 0 at $DIR/cycle.rs:12:5: 12:12
7+
+ let mut _2: fn() {main}; // in scope 0 at $DIR/cycle.rs:12:5: 12:12
8+
+ let mut _5: (); // in scope 0 at $DIR/cycle.rs:6:5: 6:8
9+
+ scope 1 (inlined f::<fn() {main}>) { // at $DIR/cycle.rs:12:5: 12:12
10+
+ debug g => _2; // in scope 1 at $DIR/cycle.rs:5:6: 5:7
11+
+ let _3: (); // in scope 1 at $DIR/cycle.rs:6:5: 6:8
12+
+ let mut _4: &fn() {main}; // in scope 1 at $DIR/cycle.rs:6:5: 6:6
13+
+ scope 2 (inlined <fn() {main} as Fn<()>>::call - shim(fn() {main})) { // at $DIR/cycle.rs:6:5: 6:8
14+
+ }
15+
+ }
716

817
bb0: {
918
StorageLive(_1); // scope 0 at $DIR/cycle.rs:12:5: 12:12
10-
_1 = f::<fn() {main}>(main) -> bb1; // scope 0 at $DIR/cycle.rs:12:5: 12:12
11-
// mir::Constant
12-
// + span: $DIR/cycle.rs:12:5: 12:6
13-
// + literal: Const { ty: fn(fn() {main}) {f::<fn() {main}>}, val: Value(Scalar(<ZST>)) }
19+
- _1 = f::<fn() {main}>(main) -> bb1; // scope 0 at $DIR/cycle.rs:12:5: 12:12
20+
+ StorageLive(_2); // scope 0 at $DIR/cycle.rs:12:5: 12:12
21+
+ _2 = main; // scope 0 at $DIR/cycle.rs:12:5: 12:12
1422
// mir::Constant
23+
- // + span: $DIR/cycle.rs:12:5: 12:6
24+
- // + literal: Const { ty: fn(fn() {main}) {f::<fn() {main}>}, val: Value(Scalar(<ZST>)) }
25+
- // mir::Constant
1526
// + span: $DIR/cycle.rs:12:7: 12:11
1627
// + literal: Const { ty: fn() {main}, val: Value(Scalar(<ZST>)) }
28+
+ StorageLive(_3); // scope 1 at $DIR/cycle.rs:6:5: 6:8
29+
+ StorageLive(_4); // scope 1 at $DIR/cycle.rs:6:5: 6:6
30+
+ _4 = &_2; // scope 1 at $DIR/cycle.rs:6:5: 6:6
31+
+ StorageLive(_5); // scope 1 at $DIR/cycle.rs:6:5: 6:8
32+
+ _5 = const (); // scope 1 at $DIR/cycle.rs:6:5: 6:8
33+
+ _3 = move (*_4)() -> [return: bb4, unwind: bb2]; // scope 2 at $SRC_DIR/core/src/ops/function.rs:LL:COL
1734
}
1835

1936
bb1: {
37+
+ StorageDead(_2); // scope 0 at $DIR/cycle.rs:12:5: 12:12
2038
StorageDead(_1); // scope 0 at $DIR/cycle.rs:12:12: 12:13
2139
_0 = const (); // scope 0 at $DIR/cycle.rs:11:8: 13:2
2240
return; // scope 0 at $DIR/cycle.rs:13:2: 13:2
41+
+ }
42+
+
43+
+ bb2 (cleanup): {
44+
+ drop(_2) -> bb3; // scope 1 at $DIR/cycle.rs:7:1: 7:2
45+
+ }
46+
+
47+
+ bb3 (cleanup): {
48+
+ resume; // scope 1 at $DIR/cycle.rs:5:1: 7:2
49+
+ }
50+
+
51+
+ bb4: {
52+
+ StorageDead(_5); // scope 1 at $DIR/cycle.rs:6:5: 6:8
53+
+ StorageDead(_4); // scope 1 at $DIR/cycle.rs:6:7: 6:8
54+
+ StorageDead(_3); // scope 1 at $DIR/cycle.rs:6:8: 6:9
55+
+ drop(_2) -> bb1; // scope 1 at $DIR/cycle.rs:7:1: 7:2
2356
}
2457
}
2558

src/test/mir-opt/inline/cycle.main.Inline.diff

+54-4
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,72 @@
44
fn main() -> () {
55
let mut _0: (); // return place in scope 0 at $DIR/cycle.rs:16:11: 16:11
66
let _1: (); // in scope 0 at $DIR/cycle.rs:17:5: 17:9
7+
+ let mut _2: fn() {g}; // in scope 0 at $DIR/cycle.rs:17:5: 17:9
8+
+ let mut _5: (); // in scope 0 at $DIR/cycle.rs:6:5: 6:8
9+
+ scope 1 (inlined f::<fn() {g}>) { // at $DIR/cycle.rs:17:5: 17:9
10+
+ debug g => _2; // in scope 1 at $DIR/cycle.rs:5:6: 5:7
11+
+ let _3: (); // in scope 1 at $DIR/cycle.rs:6:5: 6:8
12+
+ let mut _4: &fn() {g}; // in scope 1 at $DIR/cycle.rs:6:5: 6:6
13+
+ scope 2 (inlined <fn() {g} as Fn<()>>::call - shim(fn() {g})) { // at $DIR/cycle.rs:6:5: 6:8
14+
+ scope 3 (inlined g) { // at $SRC_DIR/core/src/ops/function.rs:LL:COL
15+
+ let mut _6: fn() {main}; // in scope 3 at $DIR/cycle.rs:12:5: 12:12
16+
+ scope 4 (inlined f::<fn() {main}>) { // at $DIR/cycle.rs:12:5: 12:12
17+
+ debug g => _6; // in scope 4 at $DIR/cycle.rs:5:6: 5:7
18+
+ let _7: (); // in scope 4 at $DIR/cycle.rs:6:5: 6:8
19+
+ let mut _8: &fn() {main}; // in scope 4 at $DIR/cycle.rs:6:5: 6:6
20+
+ scope 5 (inlined <fn() {main} as Fn<()>>::call - shim(fn() {main})) { // at $DIR/cycle.rs:6:5: 6:8
21+
+ }
22+
+ }
23+
+ }
24+
+ }
25+
+ }
726

827
bb0: {
928
StorageLive(_1); // scope 0 at $DIR/cycle.rs:17:5: 17:9
10-
_1 = f::<fn() {g}>(g) -> bb1; // scope 0 at $DIR/cycle.rs:17:5: 17:9
11-
// mir::Constant
12-
// + span: $DIR/cycle.rs:17:5: 17:6
13-
// + literal: Const { ty: fn(fn() {g}) {f::<fn() {g}>}, val: Value(Scalar(<ZST>)) }
29+
- _1 = f::<fn() {g}>(g) -> bb1; // scope 0 at $DIR/cycle.rs:17:5: 17:9
30+
+ StorageLive(_2); // scope 0 at $DIR/cycle.rs:17:5: 17:9
31+
+ _2 = g; // scope 0 at $DIR/cycle.rs:17:5: 17:9
1432
// mir::Constant
33+
- // + span: $DIR/cycle.rs:17:5: 17:6
34+
- // + literal: Const { ty: fn(fn() {g}) {f::<fn() {g}>}, val: Value(Scalar(<ZST>)) }
35+
- // mir::Constant
1536
// + span: $DIR/cycle.rs:17:7: 17:8
1637
// + literal: Const { ty: fn() {g}, val: Value(Scalar(<ZST>)) }
38+
+ StorageLive(_3); // scope 1 at $DIR/cycle.rs:6:5: 6:8
39+
+ StorageLive(_4); // scope 1 at $DIR/cycle.rs:6:5: 6:6
40+
+ _4 = &_2; // scope 1 at $DIR/cycle.rs:6:5: 6:6
41+
+ StorageLive(_5); // scope 1 at $DIR/cycle.rs:6:5: 6:8
42+
+ _5 = const (); // scope 1 at $DIR/cycle.rs:6:5: 6:8
43+
+ StorageLive(_6); // scope 3 at $DIR/cycle.rs:12:5: 12:12
44+
+ StorageLive(_7); // scope 4 at $DIR/cycle.rs:6:5: 6:8
45+
+ StorageLive(_8); // scope 4 at $DIR/cycle.rs:6:5: 6:6
46+
+ _8 = &_6; // scope 4 at $DIR/cycle.rs:6:5: 6:6
47+
+ _7 = move (*_8)() -> [return: bb4, unwind: bb2]; // scope 5 at $SRC_DIR/core/src/ops/function.rs:LL:COL
1748
}
1849

1950
bb1: {
51+
+ StorageDead(_2); // scope 0 at $DIR/cycle.rs:17:5: 17:9
2052
StorageDead(_1); // scope 0 at $DIR/cycle.rs:17:9: 17:10
2153
_0 = const (); // scope 0 at $DIR/cycle.rs:16:11: 18:2
2254
return; // scope 0 at $DIR/cycle.rs:18:2: 18:2
55+
+ }
56+
+
57+
+ bb2 (cleanup): {
58+
+ drop(_2) -> bb3; // scope 1 at $DIR/cycle.rs:7:1: 7:2
59+
+ }
60+
+
61+
+ bb3 (cleanup): {
62+
+ resume; // scope 1 at $DIR/cycle.rs:5:1: 7:2
63+
+ }
64+
+
65+
+ bb4: {
66+
+ StorageDead(_8); // scope 4 at $DIR/cycle.rs:6:7: 6:8
67+
+ StorageDead(_7); // scope 4 at $DIR/cycle.rs:6:8: 6:9
68+
+ StorageDead(_6); // scope 3 at $DIR/cycle.rs:12:5: 12:12
69+
+ StorageDead(_5); // scope 1 at $DIR/cycle.rs:6:5: 6:8
70+
+ StorageDead(_4); // scope 1 at $DIR/cycle.rs:6:7: 6:8
71+
+ StorageDead(_3); // scope 1 at $DIR/cycle.rs:6:8: 6:9
72+
+ drop(_2) -> bb1; // scope 1 at $DIR/cycle.rs:7:1: 7:2
2373
}
2474
}
2575

0 commit comments

Comments
 (0)