diff options
| author | bors <bors@rust-lang.org> | 2021-07-16 09:28:22 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-07-16 09:28:22 +0000 |
| commit | 59d92bd0173fb0436b93aa56ff2cb288d4717701 (patch) | |
| tree | 1f19cd5b098ae6b371eba0ae3d8e791fa45b13d8 /src | |
| parent | a6470c7fa8a511cfbcf9e9d3e1ab6779ac661edb (diff) | |
| parent | b19f37ca54709761948e3eaea3f86f5cd823e9d2 (diff) | |
| download | rust-59d92bd0173fb0436b93aa56ff2cb288d4717701.tar.gz rust-59d92bd0173fb0436b93aa56ff2cb288d4717701.zip | |
Auto merge of #87182 - GuillaumeGomez:rollup-whwohua, r=GuillaumeGomez
Rollup of 7 pull requests Successful merges: - #86983 (Add or improve natvis definitions for common standard library types) - #87069 (ExprUseVisitor: Treat ByValue use of Copy types as ImmBorrow) - #87138 (Correct invariant documentation for `steps_between`) - #87145 (Make --cap-lints and related options leave crate hash alone) - #87161 (RFC2229: Use the correct place type) - #87162 (Fix type decl layout "overflow") - #87167 (Fix sidebar display on small devices) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'src')
25 files changed, 769 insertions, 68 deletions
diff --git a/src/etc/natvis/intrinsic.natvis b/src/etc/natvis/intrinsic.natvis index 52e5d37c83f..558536fa613 100644 --- a/src/etc/natvis/intrinsic.natvis +++ b/src/etc/natvis/intrinsic.natvis @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> <Type Name="str"> - <DisplayString>{data_ptr,[length]s8}</DisplayString> - <StringView>data_ptr,[length]s8</StringView> + <DisplayString>{(char*)data_ptr,[length]s8}</DisplayString> + <StringView>(char*)data_ptr,[length]s8</StringView> <Expand> <Item Name="[len]" ExcludeView="simple">length</Item> <Synthetic Name="[chars]"> diff --git a/src/etc/natvis/liballoc.natvis b/src/etc/natvis/liballoc.natvis index 9cc60fc7b47..d001f40fccb 100644 --- a/src/etc/natvis/liballoc.natvis +++ b/src/etc/natvis/liballoc.natvis @@ -48,6 +48,7 @@ <Item Name="[len]" ExcludeView="simple">vec.len</Item> <Item Name="[capacity]" ExcludeView="simple">vec.buf.cap</Item> <Synthetic Name="[chars]"> + <DisplayString>{(char*)vec.buf.ptr.pointer,[vec.len]s8}</DisplayString> <Expand> <ArrayItems> <Size>vec.len</Size> @@ -57,22 +58,38 @@ </Synthetic> </Expand> </Type> + <Type Name="alloc::rc::Rc<*>"> <DisplayString>{ptr.pointer->value}</DisplayString> <Expand> <ExpandedItem>ptr.pointer->value</ExpandedItem> + <Item Name="[Reference count]">ptr.pointer->strong</Item> + <Item Name="[Weak reference count]">ptr.pointer->weak</Item> </Expand> </Type> + <Type Name="alloc::rc::Weak<*>"> + <DisplayString>{ptr.pointer->value}</DisplayString> + <Expand> + <ExpandedItem>ptr.pointer->value</ExpandedItem> + <Item Name="[Reference count]">ptr.pointer->strong</Item> + <Item Name="[Weak reference count]">ptr.pointer->weak</Item> + </Expand> + </Type> + <Type Name="alloc::sync::Arc<*>"> <DisplayString>{ptr.pointer->data}</DisplayString> <Expand> <ExpandedItem>ptr.pointer->data</ExpandedItem> + <Item Name="[Reference count]">ptr.pointer->strong</Item> + <Item Name="[Weak reference count]">ptr.pointer->weak</Item> </Expand> </Type> <Type Name="alloc::sync::Weak<*>"> <DisplayString>{ptr.pointer->data}</DisplayString> <Expand> <ExpandedItem>ptr.pointer->data</ExpandedItem> + <Item Name="[Reference count]">ptr.pointer->strong</Item> + <Item Name="[Weak reference count]">ptr.pointer->weak</Item> </Expand> </Type> <Type Name="alloc::borrow::Cow<*>"> diff --git a/src/etc/natvis/libcore.natvis b/src/etc/natvis/libcore.natvis index c8196d5c713..fa8ee2d70bb 100644 --- a/src/etc/natvis/libcore.natvis +++ b/src/etc/natvis/libcore.natvis @@ -1,23 +1,163 @@ <?xml version="1.0" encoding="utf-8"?> <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> - <Type Name="core::ptr::Unique<*>"> - <DisplayString>{{ Unique {pointer} }}</DisplayString> + <Type Name="core::cell::Cell<*>"> + <DisplayString>{value.value}</DisplayString> <Expand> - <Item Name="[ptr]">pointer</Item> + <ExpandedItem>value.value</ExpandedItem> + </Expand> + </Type> + <Type Name="core::cell::Ref<*>"> + <DisplayString>{value}</DisplayString> + <Expand> + <ExpandedItem>value</ExpandedItem> + </Expand> + </Type> + <Type Name="core::cell::RefMut<*>"> + <DisplayString>{value}</DisplayString> + <Expand> + <ExpandedItem>value</ExpandedItem> + </Expand> + </Type> + <Type Name="core::cell::RefCell<*>"> + <DisplayString>{value.value}</DisplayString> + <Expand> + <Item Name="[Borrow state]" Condition="borrow.value.value == 0">"Unborrowed",sb</Item> + <Item Name="[Borrow state]" Condition="borrow.value.value > 0">"Immutably borrowed",sb</Item> + <Item Name="[Borrow state]" Condition="borrow.value.value < 0">"Mutably borrowed",sb</Item> + <ExpandedItem>value.value</ExpandedItem> + </Expand> + </Type> + <Type Name="core::cell::UnsafeCell<*>"> + <DisplayString>{value}</DisplayString> + <Expand> + <ExpandedItem>value</ExpandedItem> </Expand> </Type> - <Type Name="core::ptr::Shared<*>"> - <DisplayString>{{ Shared {pointer} }}</DisplayString> + <Type Name="core::mem::manually_drop::ManuallyDrop<*>"> + <DisplayString>{value}</DisplayString> <Expand> - <Item Name="[ptr]">pointer</Item> + <ExpandedItem>value</ExpandedItem> + </Expand> + </Type> + + <Type Name="core::num::nonzero::NonZeroI8"> + <DisplayString>{__0}</DisplayString> + </Type> + <Type Name="core::num::nonzero::NonZeroI16"> + <DisplayString>{__0}</DisplayString> + </Type> + <Type Name="core::num::nonzero::NonZeroI32"> + <DisplayString>{__0}</DisplayString> + </Type> + <Type Name="core::num::nonzero::NonZeroI64"> + <DisplayString>{__0}</DisplayString> + </Type> + <Type Name="core::num::nonzero::NonZeroI128"> + <DisplayString>{__0}</DisplayString> + </Type> + <Type Name="core::num::nonzero::NonZeroIsize"> + <DisplayString>{__0}</DisplayString> + </Type> + <Type Name="core::num::nonzero::NonZeroU8"> + <DisplayString>{__0}</DisplayString> + </Type> + <Type Name="core::num::nonzero::NonZeroU16"> + <DisplayString>{__0}</DisplayString> + </Type> + <Type Name="core::num::nonzero::NonZeroU32"> + <DisplayString>{__0}</DisplayString> + </Type> + <Type Name="core::num::nonzero::NonZeroU64"> + <DisplayString>{__0}</DisplayString> + </Type> + <Type Name="core::num::nonzero::NonZeroU128"> + <DisplayString>{__0}</DisplayString> + </Type> + <Type Name="core::num::nonzero::NonZeroUsize"> + <DisplayString>{__0}</DisplayString> + </Type> + + <Type Name="core::num::wrapping::Wrapping<*>"> + <DisplayString>{__0}</DisplayString> + </Type> + + <Type Name="core::ops::range::Range<*>"> + <DisplayString>({start}..{end})</DisplayString> + </Type> + <Type Name="core::ops::range::RangeFrom<*>"> + <DisplayString>({start}..)</DisplayString> + </Type> + <Type Name="core::ops::range::RangeInclusive<*>"> + <DisplayString>({start}..={end})</DisplayString> + </Type> + <Type Name="core::ops::range::RangeTo<*>"> + <DisplayString>(..{end})</DisplayString> + </Type> + <Type Name="core::ops::range::RangeToInclusive<*>"> + <DisplayString>(..={end})</DisplayString> + </Type> + + <Type Name="core::pin::Pin<*>"> + <DisplayString>Pin({(void*)pointer}: {pointer})</DisplayString> + <Expand> + <ExpandedItem>pointer</ExpandedItem> </Expand> </Type> <Type Name="core::ptr::non_null::NonNull<*>"> - <DisplayString>{(void*) pointer}</DisplayString> + <DisplayString>NonNull({(void*) pointer}: {pointer})</DisplayString> + <Expand> + <ExpandedItem>pointer</ExpandedItem> + </Expand> + </Type> + + <Type Name="core::ptr::unique::Unique<*>"> + <DisplayString>Unique({(void*)pointer}: {pointer})</DisplayString> + <Expand> + <ExpandedItem>pointer</ExpandedItem> + </Expand> + </Type> + + <Type Name="core::sync::atomic::AtomicBool"> + <DisplayString>{(bool)v.value}</DisplayString> + </Type> + <Type Name="core::sync::atomic::AtomicI8"> + <DisplayString>{v.value}</DisplayString> + </Type> + <Type Name="core::sync::atomic::AtomicI16"> + <DisplayString>{v.value}</DisplayString> + </Type> + <Type Name="core::sync::atomic::AtomicI32"> + <DisplayString>{v.value}</DisplayString> + </Type> + <Type Name="core::sync::atomic::AtomicI64"> + <DisplayString>{v.value}</DisplayString> + </Type> + <Type Name="core::sync::atomic::AtomicIsize"> + <DisplayString>{v.value}</DisplayString> + </Type> + <Type Name="core::sync::atomic::AtomicU8"> + <DisplayString>{v.value}</DisplayString> + </Type> + <Type Name="core::sync::atomic::AtomicU16"> + <DisplayString>{v.value}</DisplayString> + </Type> + <Type Name="core::sync::atomic::AtomicU32"> + <DisplayString>{v.value}</DisplayString> + </Type> + <Type Name="core::sync::atomic::AtomicU64"> + <DisplayString>{v.value}</DisplayString> + </Type> + <Type Name="core::sync::atomic::AtomicUsize"> + <DisplayString>{v.value}</DisplayString> + </Type> + + <Type Name="core::time::Duration"> + <DisplayString>{secs,d}s {nanos,d}ns</DisplayString> <Expand> - <Item Name="[value]">*pointer</Item> + <Item Name="seconds">secs,d</Item> + <Item Name="nanoseconds">nanos,d</Item> </Expand> </Type> -</AutoVisualizer> \ No newline at end of file +</AutoVisualizer> diff --git a/src/etc/natvis/libstd.natvis b/src/etc/natvis/libstd.natvis index 3ccd2e9c30e..c7be0167de9 100644 --- a/src/etc/natvis/libstd.natvis +++ b/src/etc/natvis/libstd.natvis @@ -74,9 +74,10 @@ </Type> <Type Name="std::ffi::c_str::CString"> - <DisplayString>{inner.data_ptr,s}</DisplayString> + <DisplayString>{(char*)inner.data_ptr}</DisplayString> <Expand> <Synthetic Name="[chars]"> + <DisplayString>{(char*)inner.data_ptr}</DisplayString> <Expand> <ArrayItems> <Size>inner.length</Size> @@ -101,4 +102,19 @@ </Synthetic> </Expand> </Type> + + <Type Name="std::ffi::os_str::OsString"> + <DisplayString>{(char*)inner.inner.bytes.buf.ptr.pointer,[inner.inner.bytes.len]}</DisplayString> + <Expand> + <Synthetic Name="[chars]"> + <DisplayString>{(char*)inner.inner.bytes.buf.ptr.pointer,[inner.inner.bytes.len]}</DisplayString> + <Expand> + <ArrayItems> + <Size>inner.inner.bytes.len</Size> + <ValuePointer>(char*)inner.inner.bytes.buf.ptr.pointer</ValuePointer> + </ArrayItems> + </Expand> + </Synthetic> + </Expand> + </Type> </AutoVisualizer> diff --git a/src/librustdoc/html/static/css/rustdoc.css b/src/librustdoc/html/static/css/rustdoc.css index 208e8f723f4..89dbc4d825f 100644 --- a/src/librustdoc/html/static/css/rustdoc.css +++ b/src/librustdoc/html/static/css/rustdoc.css @@ -247,6 +247,9 @@ code, pre, a.test-arrow { pre { padding: 14px; } +.type-decl pre { + overflow-x: auto; +} .source .content pre { padding: 20px; @@ -1631,15 +1634,18 @@ details.undocumented[open] > summary::before { display: none; } + /* We do NOT hide this element so that alternative device readers still have this information + available. */ .sidebar-elems { position: fixed; z-index: 1; - left: 0; top: 45px; bottom: 0; + width: 246px; + /* We move the sidebar to the left by its own width so it doesn't appear. */ + left: -246px; overflow-y: auto; border-right: 1px solid; - display: none; } .sidebar > .block.version { @@ -1727,8 +1733,7 @@ details.undocumented[open] > summary::before { } .show-it { - display: block; - width: 246px; + left: 0; } .show-it > .block.items { diff --git a/src/test/debuginfo/duration-type.rs b/src/test/debuginfo/duration-type.rs new file mode 100644 index 00000000000..bc0266d644e --- /dev/null +++ b/src/test/debuginfo/duration-type.rs @@ -0,0 +1,22 @@ +// only-cdb +// compile-flags:-g + +// === CDB TESTS ================================================================================== + +// cdb-command: g + +// cdb-command: dx duration +// cdb-check:duration : 5s 12ns [Type: core::time::Duration] +// cdb-check: [<Raw View>] [Type: core::time::Duration] +// cdb-check: seconds : 5 [Type: unsigned __int64] +// cdb-check: nanoseconds : 12 [Type: unsigned int] + +use std::time::Duration; + +fn main() { + let duration = Duration::new(5, 12); + + zzz(); // #break +} + +fn zzz() { } diff --git a/src/test/debuginfo/marker-types.rs b/src/test/debuginfo/marker-types.rs new file mode 100644 index 00000000000..8373d7856bb --- /dev/null +++ b/src/test/debuginfo/marker-types.rs @@ -0,0 +1,49 @@ +// only-cdb +// compile-flags:-g + +// === CDB TESTS ================================================================================== + +// cdb-command: g + +// cdb-command: dx nonnull +// cdb-check:nonnull : NonNull(0x[...]: 0xc) [Type: core::ptr::non_null::NonNull<u32>] +// cdb-check: [<Raw View>] [Type: core::ptr::non_null::NonNull<u32>] +// cdb-check: 0xc [Type: unsigned int] + +// cdb-command: dx manuallydrop +// cdb-check:manuallydrop : 12345 [Type: core::mem::manually_drop::ManuallyDrop<i32>] +// cdb-check: [<Raw View>] [Type: core::mem::manually_drop::ManuallyDrop<i32>] + +// cdb-command: dx pin +// cdb-check:pin : Pin(0x[...]: "this") [Type: core::pin::Pin<ref_mut$<alloc::string::String> >] +// cdb-check: [<Raw View>] [Type: core::pin::Pin<ref_mut$<alloc::string::String> >] +// cdb-check: [len] : 0x4 [Type: unsigned [...]] +// cdb-check: [capacity] : 0x4 [Type: unsigned [...]] +// cdb-check: [chars] : "this" + +// cdb-command: dx unique +// cdb-check:unique : Unique(0x[...]: (0x2a, 4321)) [Type: core::ptr::unique::Unique<tuple$<u64,i32> >] +// cdb-check: [<Raw View>] [Type: core::ptr::unique::Unique<tuple$<u64,i32> >] +// cdb-check: [0] : 0x2a [Type: unsigned __int64] +// cdb-check: [1] : 4321 [Type: int] + +#![feature(ptr_internals)] + +use std::mem::ManuallyDrop; +use std::pin::Pin; +use std::ptr::{NonNull, Unique}; + +fn main() { + let nonnull: NonNull<_> = (&12u32).into(); + + let manuallydrop = ManuallyDrop::new(12345i32); + + let mut s = "this".to_string(); + let pin = Pin::new(&mut s); + + let unique: Unique<_> = (&mut (42u64, 4321i32)).into(); + + zzz(); // #break +} + +fn zzz() { } diff --git a/src/test/debuginfo/mutable-locs.rs b/src/test/debuginfo/mutable-locs.rs index 428a7e8d9c0..688483e43e4 100644 --- a/src/test/debuginfo/mutable-locs.rs +++ b/src/test/debuginfo/mutable-locs.rs @@ -9,26 +9,64 @@ // cdb-command: g // cdb-command:dx static_c,d -// cdb-check:static_c,d [Type: core::cell::Cell<i32>] -// cdb-check: [...] value [Type: core::cell::UnsafeCell<i32>] +// cdb-check:static_c,d : 10 [Type: core::cell::Cell<i32>] +// cdb-check: [<Raw View>] [Type: core::cell::Cell<i32>] // cdb-command: dx static_c.value,d -// cdb-check:static_c.value,d [Type: core::cell::UnsafeCell<i32>] -// cdb-check: [...] value : 10 [Type: int] +// cdb-check:static_c.value,d : 10 [Type: core::cell::UnsafeCell<i32>] +// cdb-check: [<Raw View>] [Type: core::cell::UnsafeCell<i32>] // cdb-command: dx dynamic_c,d -// cdb-check:dynamic_c,d [Type: core::cell::RefCell<i32>] -// cdb-check: [...] borrow [Type: core::cell::Cell<isize>] -// cdb-check: [...] value [Type: core::cell::UnsafeCell<i32>] +// cdb-check:dynamic_c,d : 15 [Type: core::cell::RefCell<i32>] +// cdb-check: [<Raw View>] [Type: core::cell::RefCell<i32>] +// cdb-check: [Borrow state] : Unborrowed // cdb-command: dx dynamic_c.value,d -// cdb-check:dynamic_c.value,d [Type: core::cell::UnsafeCell<i32>] -// cdb-check: [...] value : 15 [Type: int] +// cdb-check:dynamic_c.value,d : 15 [Type: core::cell::UnsafeCell<i32>] +// cdb-check: [<Raw View>] [Type: core::cell::UnsafeCell<i32>] // cdb-command: dx b,d -// cdb-check:b,d [Type: core::cell::RefMut<i32>] -// cdb-check: [...] value : [...] : 42 [Type: int *] -// cdb-check: [...] borrow [Type: core::cell::BorrowRefMut] +// cdb-check:b,d : 42 [Type: core::cell::RefMut<i32>] +// cdb-check: [<Raw View>] [Type: core::cell::RefMut<i32>] +// cdb-check: 42 [Type: int] + +// cdb-command: g + +// cdb-command: dx dynamic_c,d +// cdb-check:dynamic_c,d : 15 [Type: core::cell::RefCell<i32>] +// cdb-check: [<Raw View>] [Type: core::cell::RefCell<i32>] +// cdb-check: [Borrow state] : Immutably borrowed + +// cdb-command: dx r_borrow,d +// cdb-check:r_borrow,d : 15 [Type: core::cell::Ref<i32>] +// cdb-check: [<Raw View>] [Type: core::cell::Ref<i32>] +// cdb-check: 15 [Type: int] + +// cdb-command: g + +// cdb-command: dx dynamic_c,d +// cdb-check:dynamic_c,d : 15 [Type: core::cell::RefCell<i32>] +// cdb-check: [<Raw View>] [Type: core::cell::RefCell<i32>] +// cdb-check: [Borrow state] : Unborrowed + +// cdb-command: g + +// cdb-command: dx dynamic_c,d +// cdb-check:dynamic_c,d : 15 [Type: core::cell::RefCell<i32>] +// cdb-check: [<Raw View>] [Type: core::cell::RefCell<i32>] +// cdb-check: [Borrow state] : Mutably borrowed + +// cdb-command: dx r_borrow_mut,d +// cdb-check:r_borrow_mut,d : 15 [Type: core::cell::RefMut<i32>] +// cdb-check: [<Raw View>] [Type: core::cell::RefMut<i32>] +// cdb-check: 15 [Type: int] + +// cdb-command: g + +// cdb-command: dx dynamic_c,d +// cdb-check:dynamic_c,d : 15 [Type: core::cell::RefCell<i32>] +// cdb-check: [<Raw View>] [Type: core::cell::RefCell<i32>] +// cdb-check: [Borrow state] : Unborrowed #![allow(unused_variables)] @@ -46,6 +84,21 @@ fn main() { *b = 42; zzz(); // #break + + // Check that `RefCell`'s borrow state visualizes correctly + { + let r_borrow = dynamic_c.borrow(); + zzz(); // #break + } + + zzz(); // #break + + { + let r_borrow_mut = dynamic_c.borrow_mut(); + zzz(); // #break + } + + zzz(); // #break } fn zzz() {()} diff --git a/src/test/debuginfo/numeric-types.rs b/src/test/debuginfo/numeric-types.rs new file mode 100644 index 00000000000..2eae9239b61 --- /dev/null +++ b/src/test/debuginfo/numeric-types.rs @@ -0,0 +1,206 @@ +// only-cdb +// compile-flags:-g + +// Tests the visualizations for `NonZero{I,U}{8,16,32,64,128,size}`, `Wrapping<T>` and +// `Atomic{Bool,I8,I16,I32,I64,Isize,U8,U16,U32,U64,Usize}` located in `libcore.natvis`. + +// === CDB TESTS ================================================================================== +// cdb-command: g + +// cdb-command: dx nz_i8 +// cdb-check:nz_i8 : 11 [Type: core::num::nonzero::NonZeroI8] +// cdb-check: [<Raw View>] [Type: core::num::nonzero::NonZeroI8] + +// cdb-command: dx nz_i16 +// cdb-check:nz_i16 : 22 [Type: core::num::nonzero::NonZeroI16] +// cdb-check: [<Raw View>] [Type: core::num::nonzero::NonZeroI16] + +// cdb-command: dx nz_i32 +// cdb-check:nz_i32 : 33 [Type: core::num::nonzero::NonZeroI32] +// cdb-check: [<Raw View>] [Type: core::num::nonzero::NonZeroI32] + +// cdb-command: dx nz_i64 +// cdb-check:nz_i64 : 44 [Type: core::num::nonzero::NonZeroI64] +// cdb-check: [<Raw View>] [Type: core::num::nonzero::NonZeroI64] + +// 128-bit integers don't seem to work in CDB +// cdb-command: dx nz_i128 +// cdb-check: [<Raw View>] [Type: core::num::nonzero::NonZeroI128] + +// cdb-command: dx nz_isize +// cdb-check:nz_isize : 66 [Type: core::num::nonzero::NonZeroIsize] +// cdb-check: [<Raw View>] [Type: core::num::nonzero::NonZeroIsize] + +// cdb-command: dx nz_u8 +// cdb-check:nz_u8 : 0x4d [Type: core::num::nonzero::NonZeroU8] +// cdb-check: [<Raw View>] [Type: core::num::nonzero::NonZeroU8] + +// cdb-command: dx nz_u16 +// cdb-check:nz_u16 : 0x58 [Type: core::num::nonzero::NonZeroU16] +// cdb-check: [<Raw View>] [Type: core::num::nonzero::NonZeroU16] + +// cdb-command: dx nz_u32 +// cdb-check:nz_u32 : 0x63 [Type: core::num::nonzero::NonZeroU32] +// cdb-check: [<Raw View>] [Type: core::num::nonzero::NonZeroU32] + +// cdb-command: dx nz_u64 +// cdb-check:nz_u64 : 0x64 [Type: core::num::nonzero::NonZeroU64] +// cdb-check: [<Raw View>] [Type: core::num::nonzero::NonZeroU64] + +// 128-bit integers don't seem to work in CDB +// cdb-command: dx nz_u128 +// cdb-check: [<Raw View>] [Type: core::num::nonzero::NonZeroU128] + +// cdb-command: dx nz_usize +// cdb-check:nz_usize : 0x7a [Type: core::num::nonzero::NonZeroUsize] +// cdb-check: [<Raw View>] [Type: core::num::nonzero::NonZeroUsize] + +// cdb-command: dx w_i8 +// cdb-check:w_i8 : 10 [Type: core::num::wrapping::Wrapping<i8>] +// cdb-check: [<Raw View>] [Type: core::num::wrapping::Wrapping<i8>] + +// cdb-command: dx w_i16 +// cdb-check:w_i16 : 20 [Type: core::num::wrapping::Wrapping<i16>] +// cdb-check: [<Raw View>] [Type: core::num::wrapping::Wrapping<i16>] + +// cdb-command: dx w_i32 +// cdb-check:w_i32 : 30 [Type: core::num::wrapping::Wrapping<i32>] +// cdb-check: [<Raw View>] [Type: core::num::wrapping::Wrapping<i32>] + +// cdb-command: dx w_i64 +// cdb-check:w_i64 : 40 [Type: core::num::wrapping::Wrapping<i64>] +// cdb-check: [<Raw View>] [Type: core::num::wrapping::Wrapping<i64>] + +// 128-bit integers don't seem to work in CDB +// cdb-command: dx w_i128 +// cdb-check:w_i128 [Type: core::num::wrapping::Wrapping<i128>] +// cdb-check: [<Raw View>] [Type: core::num::wrapping::Wrapping<i128>] + +// cdb-command: dx w_isize +// cdb-check:w_isize : 60 [Type: core::num::wrapping::Wrapping<isize>] +// cdb-check: [<Raw View>] [Type: core::num::wrapping::Wrapping<isize>] + +// cdb-command: dx w_u8 +// cdb-check:w_u8 : 0x46 [Type: core::num::wrapping::Wrapping<u8>] +// cdb-check: [<Raw View>] [Type: core::num::wrapping::Wrapping<u8>] + +// cdb-command: dx w_u16 +// cdb-check:w_u16 : 0x50 [Type: core::num::wrapping::Wrapping<u16>] +// cdb-check: [<Raw View>] [Type: core::num::wrapping::Wrapping<u16>] + +// cdb-command: dx w_u32 +// cdb-check:w_u32 : 0x5a [Type: core::num::wrapping::Wrapping<u32>] +// cdb-check: [<Raw View>] [Type: core::num::wrapping::Wrapping<u32>] + +// cdb-command: dx w_u64 +// cdb-check:w_u64 : 0x64 [Type: core::num::wrapping::Wrapping<u64>] +// cdb-check: [<Raw View>] [Type: core::num::wrapping::Wrapping<u64>] + +// 128-bit integers don't seem to work in CDB +// cdb-command: dx w_u128 +// cdb-check:w_u128 [Type: core::num::wrapping::Wrapping<u128>] +// cdb-check: [<Raw View>] [Type: core::num::wrapping::Wrapping<u128>] + +// cdb-command: dx w_usize +// cdb-check:w_usize : 0x78 [Type: core::num::wrapping::Wrapping<usize>] +// cdb-check: [<Raw View>] [Type: core::num::wrapping::Wrapping<usize>] + +// cdb-command: dx a_bool_t +// cdb-check:a_bool_t : true [Type: core::sync::atomic::AtomicBool] +// cdb-check: [<Raw View>] [Type: core::sync::atomic::AtomicBool] + +// cdb-command: dx a_bool_f +// cdb-check:a_bool_f : false [Type: core::sync::atomic::AtomicBool] +// cdb-check: [<Raw View>] [Type: core::sync::atomic::AtomicBool] + +// cdb-command: dx a_i8 +// cdb-check:a_i8 : 2 [Type: core::sync::atomic::AtomicI8] +// cdb-check: [<Raw View>] [Type: core::sync::atomic::AtomicI8] + +// cdb-command: dx a_i16 +// cdb-check:a_i16 : 4 [Type: core::sync::atomic::AtomicI16] +// cdb-check: [<Raw View>] [Type: core::sync::atomic::AtomicI16] + +// cdb-command: dx a_i32 +// cdb-check:a_i32 : 8 [Type: core::sync::atomic::AtomicI32] +// cdb-check: [<Raw View>] [Type: core::sync::atomic::AtomicI32] + +// cdb-command: dx a_i64 +// cdb-check:a_i64 : 16 [Type: core::sync::atomic::AtomicI64] +// cdb-check: [<Raw View>] [Type: core::sync::atomic::AtomicI64] + +// cdb-command: dx a_isize +// cdb-check:a_isize : 32 [Type: core::sync::atomic::AtomicIsize] +// cdb-check: [<Raw View>] [Type: core::sync::atomic::AtomicIsize] + +// cdb-command: dx a_u8 +// cdb-check:a_u8 : 0x40 [Type: core::sync::atomic::AtomicU8] +// cdb-check: [<Raw View>] [Type: core::sync::atomic::AtomicU8] + +// cdb-command: dx a_u16 +// cdb-check:a_u16 : 0x80 [Type: core::sync::atomic::AtomicU16] +// cdb-check: [<Raw View>] [Type: core::sync::atomic::AtomicU16] + +// cdb-command: dx a_u32 +// cdb-check:a_u32 : 0x100 [Type: core::sync::atomic::AtomicU32] +// cdb-check: [<Raw View>] [Type: core::sync::atomic::AtomicU32] + +// cdb-command: dx a_u64 +// cdb-check:a_u64 : 0x200 [Type: core::sync::atomic::AtomicU64] +// cdb-check: [<Raw View>] [Type: core::sync::atomic::AtomicU64] + +// cdb-command: dx a_usize +// cdb-check:a_usize : 0x400 [Type: core::sync::atomic::AtomicUsize] +// cdb-check: [<Raw View>] [Type: core::sync::atomic::AtomicUsize] + +use std::num::*; +use std::sync::atomic::*; + +fn main() { + let nz_i8 = NonZeroI8::new(11).unwrap(); + let nz_i16 = NonZeroI16::new(22).unwrap(); + let nz_i32 = NonZeroI32::new(33).unwrap(); + let nz_i64 = NonZeroI64::new(44).unwrap(); + let nz_i128 = NonZeroI128::new(55).unwrap(); + let nz_isize = NonZeroIsize::new(66).unwrap(); + + let nz_u8 = NonZeroU8::new(77).unwrap(); + let nz_u16 = NonZeroU16::new(88).unwrap(); + let nz_u32 = NonZeroU32::new(99).unwrap(); + let nz_u64 = NonZeroU64::new(100).unwrap(); + let nz_u128 = NonZeroU128::new(111).unwrap(); + let nz_usize = NonZeroUsize::new(122).unwrap(); + + let w_i8 = Wrapping(10i8); + let w_i16 = Wrapping(20i16); + let w_i32 = Wrapping(30i32); + let w_i64 = Wrapping(40i64); + let w_i128 = Wrapping(50i128); + let w_isize = Wrapping(60isize); + + let w_u8 = Wrapping(70u8); + let w_u16 = Wrapping(80u16); + let w_u32 = Wrapping(90u32); + let w_u64 = Wrapping(100u64); + let w_u128 = Wrapping(110u128); + let w_usize = Wrapping(120usize); + + let a_bool_t = AtomicBool::new(true); + let a_bool_f = AtomicBool::new(false); + + let a_i8 = AtomicI8::new(2); + let a_i16 = AtomicI16::new(4); + let a_i32 = AtomicI32::new(8); + let a_i64 = AtomicI64::new(16); + let a_isize = AtomicIsize::new(32); + + let a_u8 = AtomicU8::new(64); + let a_u16 = AtomicU16::new(128); + let a_u32 = AtomicU32::new(256); + let a_u64 = AtomicU64::new(512); + let a_usize = AtomicUsize::new(1024); + + zzz(); // #break +} + +fn zzz() { } diff --git a/src/test/debuginfo/pretty-std.rs b/src/test/debuginfo/pretty-std.rs index 7ed76beb8c6..d5a6e148b7a 100644 --- a/src/test/debuginfo/pretty-std.rs +++ b/src/test/debuginfo/pretty-std.rs @@ -111,8 +111,9 @@ // cdb-check: [11] : 33 '!' [Type: char] // cdb-command: dx os_string -// cdb-check:os_string [Type: [...]::OsString] -// NOTE: OsString doesn't have a .natvis entry yet. +// cdb-check:os_string : "IAMA OS string 😃" [Type: std::ffi::os_str::OsString] +// cdb-check: [<Raw View>] [Type: std::ffi::os_str::OsString] +// cdb-check: [chars] : "IAMA OS string 😃" // cdb-command: dx some // cdb-check:some : Some [Type: enum$<core::option::Option<i16> >] @@ -129,10 +130,24 @@ // NOTE: cdb fails to interpret debug info of Option enums on i686. // cdb-check:some_string [Type: enum$<core::option::Option<alloc::string::String>, 1, [...], Some>] +// cdb-command: dx linkedlist +// cdb-check:linkedlist : { len=0x2 } [Type: alloc::collections::linked_list::LinkedList<i32>] +// cdb-check: [<Raw View>] [Type: alloc::collections::linked_list::LinkedList<i32>] +// cdb-check: [0x0] : 128 [Type: int] +// cdb-check: [0x1] : 42 [Type: int] + +// cdb-command: dx vecdeque +// cdb-check:vecdeque : { len=0x2 } [Type: alloc::collections::vec_deque::VecDeque<i32>] +// cdb-check: [<Raw View>] [Type: alloc::collections::vec_deque::VecDeque<i32>] +// cdb-check: [len] : 0x2 +// cdb-check: [capacity] : 0x8 [Type: unsigned [...]] +// cdb-check: [0x0] : 90 [Type: int] +// cdb-check: [0x1] : 20 [Type: int] + #![allow(unused_variables)] +use std::collections::{LinkedList, VecDeque}; use std::ffi::OsString; - fn main() { // &[] @@ -156,6 +171,16 @@ fn main() { let some_string = Some("IAMA optional string!".to_owned()); + // LinkedList + let mut linkedlist = LinkedList::new(); + linkedlist.push_back(42); + linkedlist.push_front(128); + + // VecDeque + let mut vecdeque = VecDeque::new(); + vecdeque.push_back(20); + vecdeque.push_front(90); + zzz(); // #break } diff --git a/src/test/debuginfo/range-types.rs b/src/test/debuginfo/range-types.rs index c0288b6ba80..7362a50a030 100644 --- a/src/test/debuginfo/range-types.rs +++ b/src/test/debuginfo/range-types.rs @@ -9,26 +9,27 @@ // cdb-command: g // cdb-command: dx r1,d -// cdb-check:r1,d [Type: core::ops::range::Range<i32>] -// cdb-check: [...] start : 3 [Type: int] -// cdb-check: [...] end : 5 [Type: int] +// cdb-check:r1,d : (3..5) [Type: core::ops::range::Range<i32>] +// cdb-check: [<Raw View>] [Type: core::ops::range::Range<i32>] // cdb-command: dx r2,d -// cdb-check:r2,d [Type: core::ops::range::RangeFrom<i32>] -// cdb-check: [...] start : 2 [Type: int] +// cdb-check:r2,d : (2..) [Type: core::ops::range::RangeFrom<i32>] +// cdb-check: [<Raw View>] [Type: core::ops::range::RangeFrom<i32>] // cdb-command: dx r3,d -// cdb-check:r3,d [Type: core::ops::range::RangeInclusive<i32>] -// cdb-check: [...] start : 1 [Type: int] -// cdb-check: [...] end : 4 [Type: int] -// cdb-check: [...] exhausted : false [Type: bool] +// cdb-check:r3,d : (1..=4) [Type: core::ops::range::RangeInclusive<i32>] +// cdb-check: [<Raw View>] [Type: core::ops::range::RangeInclusive<i32>] // cdb-command: dx r4,d -// cdb-check:r4,d [Type: core::ops::range::RangeToInclusive<i32>] -// cdb-check: [...] end : 3 [Type: int] +// cdb-check:r4,d : (..10) [Type: core::ops::range::RangeTo<i32>] +// cdb-check: [<Raw View>] [Type: core::ops::range::RangeTo<i32>] // cdb-command: dx r5,d -// cdb-check:r5,d [Type: core::ops::range::RangeFull] +// cdb-check:r5,d : (..=3) [Type: core::ops::range::RangeToInclusive<i32>] +// cdb-check: [<Raw View>] [Type: core::ops::range::RangeToInclusive<i32>] + +// cdb-command: dx r6,d +// cdb-check:r6,d [Type: core::ops::range::RangeFull] #[allow(unused_variables)] @@ -36,11 +37,12 @@ use std::ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeToInclusive}; fn main() { - let r1 = Range{start: 3, end: 5}; - let r2 = RangeFrom{start: 2}; - let r3 = RangeInclusive::new(1, 4); - let r4 = RangeToInclusive{end: 3}; - let r5 = RangeFull{}; + let r1 = (3..5); + let r2 = (2..); + let r3 = (1..=4); + let r4 = (..10); + let r5 = (..=3); + let r6 = (..); zzz(); // #break } diff --git a/src/test/debuginfo/rc_arc.rs b/src/test/debuginfo/rc_arc.rs index 6e558bd3c13..55cddf7c6c6 100644 --- a/src/test/debuginfo/rc_arc.rs +++ b/src/test/debuginfo/rc_arc.rs @@ -29,22 +29,39 @@ // cdb-command:dx r,d // cdb-check:r,d : 42 [Type: alloc::rc::Rc<i32>] +// cdb-check: [<Raw View>] [Type: alloc::rc::Rc<i32>] +// cdb-check: [Reference count] : 2 [Type: core::cell::Cell<usize>] +// cdb-check: [Weak reference count] : 2 [Type: core::cell::Cell<usize>] // cdb-command:dx r1,d // cdb-check:r1,d : 42 [Type: alloc::rc::Rc<i32>] +// cdb-check: [<Raw View>] [Type: alloc::rc::Rc<i32>] +// cdb-check: [Reference count] : 2 [Type: core::cell::Cell<usize>] +// cdb-check: [Weak reference count] : 2 [Type: core::cell::Cell<usize>] // cdb-command:dx w1,d -// cdb-check:w1,d [Type: alloc::rc::Weak<i32>] -// cdb-check: [...] ptr : [...] [Type: core::ptr::non_null::NonNull<alloc::rc::RcBox<i32> >] +// cdb-check:w1,d : 42 [Type: alloc::rc::Weak<i32>] +// cdb-check: [<Raw View>] [Type: alloc::rc::Weak<i32>] +// cdb-check: [Reference count] : 2 [Type: core::cell::Cell<usize>] +// cdb-check: [Weak reference count] : 2 [Type: core::cell::Cell<usize>] // cdb-command:dx a,d // cdb-check:a,d : 42 [Type: alloc::sync::Arc<i32>] +// cdb-check: [<Raw View>] [Type: alloc::sync::Arc<i32>] +// cdb-check: [Reference count] : 2 [Type: core::sync::atomic::AtomicUsize] +// cdb-check: [Weak reference count] : 2 [Type: core::sync::atomic::AtomicUsize] // cdb-command:dx a1,d // cdb-check:a1,d : 42 [Type: alloc::sync::Arc<i32>] +// cdb-check: [<Raw View>] [Type: alloc::sync::Arc<i32>] +// cdb-check: [Reference count] : 2 [Type: core::sync::atomic::AtomicUsize] +// cdb-check: [Weak reference count] : 2 [Type: core::sync::atomic::AtomicUsize] // cdb-command:dx w2,d // cdb-check:w2,d : 42 [Type: alloc::sync::Weak<i32>] +// cdb-check: [<Raw View>] [Type: alloc::sync::Weak<i32>] +// cdb-check: [Reference count] : 2 [Type: core::sync::atomic::AtomicUsize] +// cdb-check: [Weak reference count] : 2 [Type: core::sync::atomic::AtomicUsize] use std::rc::Rc; use std::sync::Arc; diff --git a/src/test/debuginfo/rwlock-read.rs b/src/test/debuginfo/rwlock-read.rs index ac652c8ccf4..e1c10a4d37f 100644 --- a/src/test/debuginfo/rwlock-read.rs +++ b/src/test/debuginfo/rwlock-read.rs @@ -11,15 +11,15 @@ // cdb-command:dx l // cdb-check:l [Type: std::sync::rwlock::RwLock<i32>] // cdb-check: [...] poison [Type: std::sync::poison::Flag] -// cdb-check: [...] data [Type: core::cell::UnsafeCell<i32>] +// cdb-check: [...] data : 0 [Type: core::cell::UnsafeCell<i32>] // // cdb-command:dx r // cdb-check:r [Type: std::sync::rwlock::RwLockReadGuard<i32>] // cdb-check: [...] lock : [...] [Type: std::sync::rwlock::RwLock<i32> *] // // cdb-command:dx r.lock->data,d -// cdb-check:r.lock->data,d [Type: core::cell::UnsafeCell<i32>] -// cdb-check: [...] value : 0 [Type: int] +// cdb-check:r.lock->data,d : 0 [Type: core::cell::UnsafeCell<i32>] +// cdb-check: [<Raw View>] [Type: core::cell::UnsafeCell<i32>] #[allow(unused_variables)] diff --git a/src/test/rustdoc-gui/sidebar-mobile.goml b/src/test/rustdoc-gui/sidebar-mobile.goml new file mode 100644 index 00000000000..9a1442e48a9 --- /dev/null +++ b/src/test/rustdoc-gui/sidebar-mobile.goml @@ -0,0 +1,10 @@ +// This test ensure that the sidebar isn't "hidden" on mobile but instead moved out of the viewport. +// This is especially important for devices for "text-first" content (like for users with +// sight issues). +goto: file://|DOC_PATH|/test_docs/struct.Foo.html +// Switching to "mobile view" by reducing the width to 600px. +size: (600, 600) +assert-css: (".sidebar-elems", {"display": "block", "left": "-246px"}) +// Opening the sidebar menu. +click: ".sidebar-menu" +assert-css: (".sidebar-elems", {"display": "block", "left": "0px"}) diff --git a/src/test/rustdoc-gui/src/lib2/lib.rs b/src/test/rustdoc-gui/src/lib2/lib.rs index ec8ab339e28..0466909479b 100644 --- a/src/test/rustdoc-gui/src/lib2/lib.rs +++ b/src/test/rustdoc-gui/src/lib2/lib.rs @@ -47,3 +47,10 @@ pub mod sub_mod { /// ``` pub struct Foo; } + +pub mod long_trait { + use std::ops::DerefMut; + + pub trait ALongNameBecauseItHelpsTestingTheCurrentProblem: DerefMut<Target = u32> + + From<u128> + Send + Sync + AsRef<str> + 'static {} +} diff --git a/src/test/rustdoc-gui/type-declation-overflow.goml b/src/test/rustdoc-gui/type-declation-overflow.goml new file mode 100644 index 00000000000..0a316e220a4 --- /dev/null +++ b/src/test/rustdoc-gui/type-declation-overflow.goml @@ -0,0 +1,8 @@ +// This test ensures that the type declaration content overflow is handled inside the <pre> directly. +goto: file://|DOC_PATH|/lib2/long_trait/trait.ALongNameBecauseItHelpsTestingTheCurrentProblem.html +// We set a fixed size so there is no chance of "random" resize. +size: (1100, 800) +// Logically, the <body> scroll width should be the width of the window. +assert-property: ("body", {"scrollWidth": "1100"}) +// However, since there is overflow in the type declaration, its scroll width is bigger. +assert-property: (".type-decl pre", {"scrollWidth": "1324"}) diff --git a/src/test/ui/closures/2229_closure_analysis/issue-87097.rs b/src/test/ui/closures/2229_closure_analysis/issue-87097.rs new file mode 100644 index 00000000000..241ddcb83e1 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/issue-87097.rs @@ -0,0 +1,35 @@ +// run-pass +// edition:2021 + +enum Variant { + A, + B, //~ WARNING: variant is never constructed: `B` +} + +struct A { + field: Variant, +} + +fn discriminant_is_a_ref() { + let here = A { field: Variant::A }; + let out_ref = &here.field; + + || match out_ref { //~ WARNING: unused closure that must be used + Variant::A => (), + Variant::B => (), + }; +} + +fn discriminant_is_a_field() { + let here = A { field: Variant::A }; + + || match here.field { //~ WARNING: unused closure that must be used + Variant::A => (), + Variant::B => (), + }; +} + +fn main() { + discriminant_is_a_ref(); + discriminant_is_a_field(); +} diff --git a/src/test/ui/closures/2229_closure_analysis/issue-87097.stderr b/src/test/ui/closures/2229_closure_analysis/issue-87097.stderr new file mode 100644 index 00000000000..38f2929a05f --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/issue-87097.stderr @@ -0,0 +1,33 @@ +warning: variant is never constructed: `B` + --> $DIR/issue-87097.rs:6:5 + | +LL | B, + | ^ + | + = note: `#[warn(dead_code)]` on by default + +warning: unused closure that must be used + --> $DIR/issue-87097.rs:17:5 + | +LL | / || match out_ref { +LL | | Variant::A => (), +LL | | Variant::B => (), +LL | | }; + | |______^ + | + = note: `#[warn(unused_must_use)]` on by default + = note: closures are lazy and do nothing unless called + +warning: unused closure that must be used + --> $DIR/issue-87097.rs:26:5 + | +LL | / || match here.field { +LL | | Variant::A => (), +LL | | Variant::B => (), +LL | | }; + | |______^ + | + = note: closures are lazy and do nothing unless called + +warning: 3 warnings emitted + diff --git a/src/test/ui/closures/2229_closure_analysis/move_closure.rs b/src/test/ui/closures/2229_closure_analysis/move_closure.rs index 3b284eadbd0..0e7abf64fab 100644 --- a/src/test/ui/closures/2229_closure_analysis/move_closure.rs +++ b/src/test/ui/closures/2229_closure_analysis/move_closure.rs @@ -195,6 +195,21 @@ fn box_mut_2() { //~| NOTE: Min Capture p_foo[Deref,Deref,(0, 0)] -> UniqueImmBorrow } +// Test that move closures can take ownership of Copy type +fn returned_closure_owns_copy_type_data() -> impl Fn() -> i32 { + let x = 10; + + let c = #[rustc_capture_analysis] move || x; + //~^ ERROR: attributes on expressions are experimental + //~| NOTE: see issue #15701 <https://github.com/rust-lang/rust/issues/15701> + //~| First Pass analysis includes: + //~| NOTE: Capturing x[] -> ImmBorrow + //~| Min Capture analysis includes: + //~| NOTE: Min Capture x[] -> ByValue + + c +} + fn main() { simple_move_closure(); simple_ref(); diff --git a/src/test/ui/closures/2229_closure_analysis/move_closure.stderr b/src/test/ui/closures/2229_closure_analysis/move_closure.stderr index c8e2708feee..82ed99f9444 100644 --- a/src/test/ui/closures/2229_closure_analysis/move_closure.stderr +++ b/src/test/ui/closures/2229_closure_analysis/move_closure.stderr @@ -88,6 +88,39 @@ LL | let c = #[rustc_capture_analysis] move || p_foo.x += 10; = note: see issue #15701 <https://github.com/rust-lang/rust/issues/15701> for more information = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable +error[E0658]: attributes on expressions are experimental + --> $DIR/move_closure.rs:202:13 + | +LL | let c = #[rustc_capture_analysis] move || x; + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #15701 <https://github.com/rust-lang/rust/issues/15701> for more information + = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable + +error: First Pass analysis includes: + --> $DIR/move_closure.rs:202:39 + | +LL | let c = #[rustc_capture_analysis] move || x; + | ^^^^^^^^^ + | +note: Capturing x[] -> ImmBorrow + --> $DIR/move_closure.rs:202:47 + | +LL | let c = #[rustc_capture_analysis] move || x; + | ^ + +error: Min Capture analysis includes: + --> $DIR/move_closure.rs:202:39 + | +LL | let c = #[rustc_capture_analysis] move || x; + | ^^^^^^^^^ + | +note: Min Capture x[] -> ByValue + --> $DIR/move_closure.rs:202:47 + | +LL | let c = #[rustc_capture_analysis] move || x; + | ^ + error: First Pass analysis includes: --> $DIR/move_closure.rs:15:5 | @@ -424,6 +457,6 @@ note: Min Capture p_foo[Deref,Deref,(0, 0)] -> UniqueImmBorrow LL | let c = #[rustc_capture_analysis] move || p_foo.x += 10; | ^^^^^^^ -error: aborting due to 30 previous errors +error: aborting due to 33 previous errors For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/move_closure.rs b/src/test/ui/closures/2229_closure_analysis/run_pass/move_closure.rs index 65c8a5a7850..e1b61e85ec1 100644 --- a/src/test/ui/closures/2229_closure_analysis/run_pass/move_closure.rs +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/move_closure.rs @@ -3,6 +3,8 @@ // Test that move closures compile properly with `capture_disjoint_fields` enabled. +#![allow(unused)] + fn simple_ref() { let mut s = 10; let ref_s = &mut s; @@ -92,6 +94,15 @@ fn data_moved_but_not_fn_once() { c(); } +// Test that move closures can take ownership of Copy type +fn returned_closure_owns_copy_type_data() -> impl Fn() -> i32 { + let x = 10; + + let c = move || x; + + c +} + fn main() { simple_ref(); struct_contains_ref_to_another_struct(); @@ -100,4 +111,6 @@ fn main() { disjoint_via_ref(); data_moved_but_not_fn_once(); + + returned_closure_owns_copy_type_data(); } diff --git a/src/tools/clippy/clippy_lints/src/escape.rs b/src/tools/clippy/clippy_lints/src/escape.rs index 3581ab41906..5f400d079da 100644 --- a/src/tools/clippy/clippy_lints/src/escape.rs +++ b/src/tools/clippy/clippy_lints/src/escape.rs @@ -11,7 +11,7 @@ use rustc_span::source_map::Span; use rustc_span::symbol::kw; use rustc_target::abi::LayoutOf; use rustc_target::spec::abi::Abi; -use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId}; +use rustc_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId}; #[derive(Copy, Clone)] pub struct BoxedLocal { @@ -133,13 +133,10 @@ fn is_argument(map: rustc_middle::hir::map::Map<'_>, id: HirId) -> bool { } impl<'a, 'tcx> Delegate<'tcx> for EscapeDelegate<'a, 'tcx> { - fn consume(&mut self, cmt: &PlaceWithHirId<'tcx>, _: HirId, mode: ConsumeMode) { + fn consume(&mut self, cmt: &PlaceWithHirId<'tcx>, _: HirId) { if cmt.place.projections.is_empty() { if let PlaceBase::Local(lid) = cmt.place.base { - if let ConsumeMode::Move = mode { - // moved out or in. clearly can't be localized - self.set.remove(&lid); - } + self.set.remove(&lid); let map = &self.cx.tcx.hir(); if let Some(Node::Binding(_)) = map.find(cmt.hir_id) { if self.set.contains(&lid) { diff --git a/src/tools/clippy/clippy_lints/src/loops/mut_range_bound.rs b/src/tools/clippy/clippy_lints/src/loops/mut_range_bound.rs index d07b5a93b67..1e54a1e2de1 100644 --- a/src/tools/clippy/clippy_lints/src/loops/mut_range_bound.rs +++ b/src/tools/clippy/clippy_lints/src/loops/mut_range_bound.rs @@ -7,7 +7,7 @@ use rustc_infer::infer::TyCtxtInferExt; use rustc_lint::LateContext; use rustc_middle::{mir::FakeReadCause, ty}; use rustc_span::source_map::Span; -use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId}; +use rustc_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId}; pub(super) fn check(cx: &LateContext<'_>, arg: &Expr<'_>, body: &Expr<'_>) { if let Some(higher::Range { @@ -82,7 +82,7 @@ struct MutatePairDelegate<'a, 'tcx> { } impl<'tcx> Delegate<'tcx> for MutatePairDelegate<'_, 'tcx> { - fn consume(&mut self, _: &PlaceWithHirId<'tcx>, _: HirId, _: ConsumeMode) {} + fn consume(&mut self, _: &PlaceWithHirId<'tcx>, _: HirId) {} fn borrow(&mut self, cmt: &PlaceWithHirId<'tcx>, diag_expr_id: HirId, bk: ty::BorrowKind) { if let ty::BorrowKind::MutBorrow = bk { diff --git a/src/tools/clippy/clippy_lints/src/needless_pass_by_value.rs b/src/tools/clippy/clippy_lints/src/needless_pass_by_value.rs index e33a33e2386..57fd03f4e12 100644 --- a/src/tools/clippy/clippy_lints/src/needless_pass_by_value.rs +++ b/src/tools/clippy/clippy_lints/src/needless_pass_by_value.rs @@ -326,10 +326,8 @@ impl MovedVariablesCtxt { } impl<'tcx> euv::Delegate<'tcx> for MovedVariablesCtxt { - fn consume(&mut self, cmt: &euv::PlaceWithHirId<'tcx>, _: HirId, mode: euv::ConsumeMode) { - if let euv::ConsumeMode::Move = mode { - self.move_common(cmt); - } + fn consume(&mut self, cmt: &euv::PlaceWithHirId<'tcx>, _: HirId) { + self.move_common(cmt); } fn borrow(&mut self, _: &euv::PlaceWithHirId<'tcx>, _: HirId, _: ty::BorrowKind) {} diff --git a/src/tools/clippy/clippy_utils/src/usage.rs b/src/tools/clippy/clippy_utils/src/usage.rs index 182d8cb11ea..ac885e99944 100644 --- a/src/tools/clippy/clippy_utils/src/usage.rs +++ b/src/tools/clippy/clippy_utils/src/usage.rs @@ -10,7 +10,7 @@ use rustc_lint::LateContext; use rustc_middle::hir::map::Map; use rustc_middle::mir::FakeReadCause; use rustc_middle::ty; -use rustc_typeck::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId}; +use rustc_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId}; /// Returns a set of mutated local variable IDs, or `None` if mutations could not be determined. pub fn mutated_variables<'tcx>(expr: &'tcx Expr<'_>, cx: &LateContext<'tcx>) -> Option<HirIdSet> { @@ -67,7 +67,7 @@ impl<'tcx> MutVarsDelegate { } impl<'tcx> Delegate<'tcx> for MutVarsDelegate { - fn consume(&mut self, _: &PlaceWithHirId<'tcx>, _: HirId, _: ConsumeMode) {} + fn consume(&mut self, _: &PlaceWithHirId<'tcx>, _: HirId) {} fn borrow(&mut self, cmt: &PlaceWithHirId<'tcx>, _: HirId, bk: ty::BorrowKind) { if let ty::BorrowKind::MutBorrow = bk { |
