Auto merge of #93138 - matthiaskrgr:rollup-m8akifd, r=matthiaskrgr
Rollup of 17 pull requests Successful merges: - #91032 (Introduce drop range tracking to generator interior analysis) - #92856 (Exclude "test" from doc_auto_cfg) - #92860 (Fix errors on blanket impls by ignoring the children of generated impls) - #93038 (Fix star handling in block doc comments) - #93061 (Only suggest adding `!` to expressions that can be macro invocation) - #93067 (rustdoc mobile: fix scroll offset when jumping to internal id) - #93086 (Add tests to ensure that `let_chains` works with `if_let_guard`) - #93087 (Fix src/test/run-make/raw-dylib-alt-calling-convention) - #93091 (⬆ chalk to 0.76.0) - #93094 (src/test/rustdoc-json: Check for `struct_field`s in `variant_tuple_struct.rs`) - #93098 (Show a more informative panic message when `DefPathHash` does not exist) - #93099 (rustdoc: auto create output directory when "--output-format json") - #93102 (Pretty printer algorithm revamp step 3) - #93104 (Support --bless for pp-exact pretty printer tests) - #93114 (update comment for `ensure_monomorphic_enough`) - #93128 (Add script to prevent point releases with same number as existing ones) - #93136 (Backport the 1.58.1 release notes to master) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
523be2e05d
62 changed files with 1925 additions and 339 deletions
|
|
@ -1,12 +1,17 @@
|
|||
# Test the behavior of #[link(.., kind = "raw-dylib")] with alternative calling conventions.
|
||||
|
||||
# only-i686-pc-windows-msvc
|
||||
# only-x86
|
||||
# only-windows
|
||||
|
||||
-include ../../run-make-fulldeps/tools.mk
|
||||
|
||||
all:
|
||||
$(call COMPILE_OBJ,"$(TMPDIR)"/extern.obj,extern.c)
|
||||
ifdef IS_MSVC
|
||||
$(CC) "$(TMPDIR)"/extern.obj -link -dll -out:"$(TMPDIR)"/extern.dll
|
||||
else
|
||||
$(CC) "$(TMPDIR)"/extern.obj -shared -o "$(TMPDIR)"/extern.dll
|
||||
endif
|
||||
$(RUSTC) --crate-type lib --crate-name raw_dylib_alt_calling_convention_test lib.rs
|
||||
$(RUSTC) --crate-type bin driver.rs -L "$(TMPDIR)"
|
||||
"$(TMPDIR)"/driver > "$(TMPDIR)"/output.txt
|
||||
|
|
|
|||
|
|
@ -62,9 +62,12 @@ pub fn library_function() {
|
|||
fastcall_fn_2(16, 3.5);
|
||||
fastcall_fn_3(3.5);
|
||||
fastcall_fn_4(1, 2, 3.0);
|
||||
fastcall_fn_5(S { x: 1, y: 2 }, 16);
|
||||
// FIXME: 91167
|
||||
// rustc generates incorrect code for the calls to fastcall_fn_5 and fastcall_fn_7
|
||||
// on i686-pc-windows-gnu; commenting these out until the indicated issue is fixed.
|
||||
//fastcall_fn_5(S { x: 1, y: 2 }, 16);
|
||||
fastcall_fn_6(Some(&S { x: 10, y: 12 }));
|
||||
fastcall_fn_7(S2 { x: 15, y: 16 }, 3);
|
||||
//fastcall_fn_7(S2 { x: 15, y: 16 }, 3);
|
||||
fastcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] });
|
||||
fastcall_fn_9(1, 3.0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,8 +11,6 @@ fastcall_fn_1(14)
|
|||
fastcall_fn_2(16, 3.5)
|
||||
fastcall_fn_3(3.5)
|
||||
fastcall_fn_4(1, 2, 3.0)
|
||||
fastcall_fn_5(S { x: 1, y: 2 }, 16)
|
||||
fastcall_fn_6(S { x: 10, y: 12 })
|
||||
fastcall_fn_7(S2 { x: 15, y: 16 }, 3)
|
||||
fastcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] })
|
||||
fastcall_fn_9(1, 3.0)
|
||||
|
|
|
|||
|
|
@ -29,3 +29,9 @@ assert-css: (".sidebar", {"display": "block", "left": "-1000px"})
|
|||
|
||||
// Check that the topbar is visible
|
||||
assert-property: (".mobile-topbar", {"clientHeight": "45"})
|
||||
|
||||
// Check that clicking an element from the sidebar scrolls to the right place
|
||||
// so the target is not obscured by the topbar.
|
||||
click: ".sidebar-menu-toggle"
|
||||
click: ".sidebar-links a"
|
||||
assert-position: ("#method\.must_use", {"y": 45})
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
// @has - "$.index[*][?(@.name=='EnumStruct')].kind" \"enum\"
|
||||
pub enum EnumStruct {
|
||||
// @has - "$.index[*][?(@.name=='VariantS')].inner.variant_kind" \"struct\"
|
||||
// @has - "$.index[*][?(@.name=='x')]"
|
||||
// @has - "$.index[*][?(@.name=='y')]"
|
||||
// @has - "$.index[*][?(@.name=='x')].kind" \"struct_field\"
|
||||
// @has - "$.index[*][?(@.name=='y')].kind" \"struct_field\"
|
||||
VariantS {
|
||||
x: u32,
|
||||
y: String,
|
||||
|
|
|
|||
|
|
@ -2,5 +2,7 @@
|
|||
// @has - "$.index[*][?(@.name=='EnumTupleStruct')].kind" \"enum\"
|
||||
pub enum EnumTupleStruct {
|
||||
// @has - "$.index[*][?(@.name=='VariantA')].inner.variant_kind" \"tuple\"
|
||||
// @has - "$.index[*][?(@.name=='0')].kind" \"struct_field\"
|
||||
// @has - "$.index[*][?(@.name=='1')].kind" \"struct_field\"
|
||||
VariantA(u32, String),
|
||||
}
|
||||
|
|
|
|||
14
src/test/rustdoc-json/impls/blanket_with_local.rs
Normal file
14
src/test/rustdoc-json/impls/blanket_with_local.rs
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
// Test for the ICE in rust/83718
|
||||
// A blanket impl plus a local type together shouldn't result in mismatched ID issues
|
||||
|
||||
// @has blanket_with_local.json "$.index[*][?(@.name=='Load')]"
|
||||
pub trait Load {
|
||||
fn load() {}
|
||||
}
|
||||
|
||||
impl<P> Load for P {
|
||||
fn load() {}
|
||||
}
|
||||
|
||||
// @has - "$.index[*][?(@.name=='Wrapper')]"
|
||||
pub struct Wrapper {}
|
||||
|
|
@ -3,6 +3,12 @@
|
|||
#![crate_name = "foo"]
|
||||
|
||||
// @has foo/fn.foo.html
|
||||
// @has - '//*[@class="item-info"]/*[@class="stab portability"]' 'non-test'
|
||||
#[cfg(not(test))]
|
||||
// @has - '//*[@class="item-info"]/*[@class="stab portability"]' 'non-doctest'
|
||||
#[cfg(not(doctest))]
|
||||
pub fn foo() {}
|
||||
|
||||
// @has foo/fn.bar.html
|
||||
// @has - '//*[@class="item-info"]/*[@class="stab portability"]' 'doc'
|
||||
// @!has - '//*[@class="item-info"]/*[@class="stab portability"]' 'test'
|
||||
#[cfg(any(test, doc))]
|
||||
pub fn bar() {}
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ pub struct Hyperdulia;
|
|||
|
||||
// @has 'oud/struct.Oystercatcher.html'
|
||||
// @count - '//*[@class="stab portability"]' 1
|
||||
// @matches - '//*[@class="stab portability"]' 'crate features solecism and oystercatcher'
|
||||
// @matches - '//*[@class="stab portability"]' 'crate feature oystercatcher only'
|
||||
// compile-flags:--cfg feature="oystercatcher"
|
||||
#[cfg(all(feature = "solecism", feature = "oystercatcher"))]
|
||||
pub struct Oystercatcher;
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ async fn fut() {}
|
|||
async fn fut_arg<T>(_: T) {}
|
||||
|
||||
async fn local_dropped_before_await() {
|
||||
// FIXME: it'd be nice for this to be allowed in a `Send` `async fn`
|
||||
// this is okay now because of the drop
|
||||
let x = non_send();
|
||||
drop(x);
|
||||
fut().await;
|
||||
|
|
@ -35,21 +35,40 @@ async fn non_send_temporary_in_match() {
|
|||
}
|
||||
}
|
||||
|
||||
fn get_formatter() -> std::fmt::Formatter<'static> {
|
||||
panic!()
|
||||
}
|
||||
|
||||
async fn non_sync_with_method_call() {
|
||||
// FIXME: it'd be nice for this to work.
|
||||
let f: &mut std::fmt::Formatter = &mut get_formatter();
|
||||
// It would by nice for this to work.
|
||||
if non_sync().fmt(f).unwrap() == () {
|
||||
fut().await;
|
||||
}
|
||||
}
|
||||
|
||||
async fn non_sync_with_method_call_panic() {
|
||||
let f: &mut std::fmt::Formatter = panic!();
|
||||
if non_sync().fmt(f).unwrap() == () {
|
||||
fut().await;
|
||||
}
|
||||
}
|
||||
|
||||
async fn non_sync_with_method_call_infinite_loop() {
|
||||
let f: &mut std::fmt::Formatter = loop {};
|
||||
if non_sync().fmt(f).unwrap() == () {
|
||||
fut().await;
|
||||
}
|
||||
}
|
||||
|
||||
fn assert_send(_: impl Send) {}
|
||||
|
||||
pub fn pass_assert() {
|
||||
assert_send(local_dropped_before_await());
|
||||
//~^ ERROR future cannot be sent between threads safely
|
||||
assert_send(non_send_temporary_in_match());
|
||||
//~^ ERROR future cannot be sent between threads safely
|
||||
assert_send(non_sync_with_method_call());
|
||||
//~^ ERROR future cannot be sent between threads safely
|
||||
assert_send(non_sync_with_method_call_panic());
|
||||
assert_send(non_sync_with_method_call_infinite_loop());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,28 +1,5 @@
|
|||
error: future cannot be sent between threads safely
|
||||
--> $DIR/async-fn-nonsend.rs:49:17
|
||||
|
|
||||
LL | assert_send(local_dropped_before_await());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `local_dropped_before_await` is not `Send`
|
||||
|
|
||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `Rc<()>`
|
||||
note: future is not `Send` as this value is used across an await
|
||||
--> $DIR/async-fn-nonsend.rs:24:10
|
||||
|
|
||||
LL | let x = non_send();
|
||||
| - has type `impl Debug` which is not `Send`
|
||||
LL | drop(x);
|
||||
LL | fut().await;
|
||||
| ^^^^^^ await occurs here, with `x` maybe used later
|
||||
LL | }
|
||||
| - `x` is later dropped here
|
||||
note: required by a bound in `assert_send`
|
||||
--> $DIR/async-fn-nonsend.rs:46:24
|
||||
|
|
||||
LL | fn assert_send(_: impl Send) {}
|
||||
| ^^^^ required by this bound in `assert_send`
|
||||
|
||||
error: future cannot be sent between threads safely
|
||||
--> $DIR/async-fn-nonsend.rs:51:17
|
||||
--> $DIR/async-fn-nonsend.rs:68:17
|
||||
|
|
||||
LL | assert_send(non_send_temporary_in_match());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_send_temporary_in_match` is not `Send`
|
||||
|
|
@ -32,41 +9,41 @@ note: future is not `Send` as this value is used across an await
|
|||
--> $DIR/async-fn-nonsend.rs:33:25
|
||||
|
|
||||
LL | match Some(non_send()) {
|
||||
| ---------- has type `impl Debug` which is not `Send`
|
||||
| ---------------- has type `Option<impl Debug>` which is not `Send`
|
||||
LL | Some(_) => fut().await,
|
||||
| ^^^^^^ await occurs here, with `non_send()` maybe used later
|
||||
| ^^^^^^ await occurs here, with `Some(non_send())` maybe used later
|
||||
...
|
||||
LL | }
|
||||
| - `non_send()` is later dropped here
|
||||
| - `Some(non_send())` is later dropped here
|
||||
note: required by a bound in `assert_send`
|
||||
--> $DIR/async-fn-nonsend.rs:46:24
|
||||
--> $DIR/async-fn-nonsend.rs:64:24
|
||||
|
|
||||
LL | fn assert_send(_: impl Send) {}
|
||||
| ^^^^ required by this bound in `assert_send`
|
||||
|
||||
error: future cannot be sent between threads safely
|
||||
--> $DIR/async-fn-nonsend.rs:53:17
|
||||
--> $DIR/async-fn-nonsend.rs:70:17
|
||||
|
|
||||
LL | assert_send(non_sync_with_method_call());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ future returned by `non_sync_with_method_call` is not `Send`
|
||||
|
|
||||
= help: the trait `Send` is not implemented for `dyn std::fmt::Write`
|
||||
note: future is not `Send` as this value is used across an await
|
||||
--> $DIR/async-fn-nonsend.rs:42:14
|
||||
--> $DIR/async-fn-nonsend.rs:46:14
|
||||
|
|
||||
LL | let f: &mut std::fmt::Formatter = panic!();
|
||||
| - has type `&mut Formatter<'_>` which is not `Send`
|
||||
LL | if non_sync().fmt(f).unwrap() == () {
|
||||
LL | let f: &mut std::fmt::Formatter = &mut get_formatter();
|
||||
| --------------- has type `Formatter<'_>` which is not `Send`
|
||||
...
|
||||
LL | fut().await;
|
||||
| ^^^^^^ await occurs here, with `f` maybe used later
|
||||
| ^^^^^^ await occurs here, with `get_formatter()` maybe used later
|
||||
LL | }
|
||||
LL | }
|
||||
| - `f` is later dropped here
|
||||
| - `get_formatter()` is later dropped here
|
||||
note: required by a bound in `assert_send`
|
||||
--> $DIR/async-fn-nonsend.rs:46:24
|
||||
--> $DIR/async-fn-nonsend.rs:64:24
|
||||
|
|
||||
LL | fn assert_send(_: impl Send) {}
|
||||
| ^^^^ required by this bound in `assert_send`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
|
|||
29
src/test/ui/async-await/partial-drop-partial-reinit.rs
Normal file
29
src/test/ui/async-await/partial-drop-partial-reinit.rs
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
// edition:2021
|
||||
#![feature(negative_impls)]
|
||||
#![allow(unused)]
|
||||
|
||||
fn main() {
|
||||
gimme_send(foo());
|
||||
//~^ ERROR cannot be sent between threads safely
|
||||
}
|
||||
|
||||
fn gimme_send<T: Send>(t: T) {
|
||||
drop(t);
|
||||
}
|
||||
|
||||
struct NotSend {}
|
||||
|
||||
impl Drop for NotSend {
|
||||
fn drop(&mut self) {}
|
||||
}
|
||||
|
||||
impl !Send for NotSend {}
|
||||
|
||||
async fn foo() {
|
||||
let mut x = (NotSend {},);
|
||||
drop(x.0);
|
||||
x.0 = NotSend {};
|
||||
bar().await;
|
||||
}
|
||||
|
||||
async fn bar() {}
|
||||
27
src/test/ui/async-await/partial-drop-partial-reinit.stderr
Normal file
27
src/test/ui/async-await/partial-drop-partial-reinit.stderr
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
error[E0277]: `NotSend` cannot be sent between threads safely
|
||||
--> $DIR/partial-drop-partial-reinit.rs:6:16
|
||||
|
|
||||
LL | gimme_send(foo());
|
||||
| ---------- ^^^^^ `NotSend` cannot be sent between threads safely
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
...
|
||||
LL | async fn foo() {
|
||||
| - within this `impl Future<Output = ()>`
|
||||
|
|
||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `NotSend`
|
||||
= note: required because it appears within the type `(NotSend,)`
|
||||
= note: required because it appears within the type `{ResumeTy, (NotSend,), impl Future<Output = ()>, ()}`
|
||||
= note: required because it appears within the type `[static generator@$DIR/partial-drop-partial-reinit.rs:22:16: 27:2]`
|
||||
= note: required because it appears within the type `from_generator::GenFuture<[static generator@$DIR/partial-drop-partial-reinit.rs:22:16: 27:2]>`
|
||||
= note: required because it appears within the type `impl Future<Output = [async output]>`
|
||||
= note: required because it appears within the type `impl Future<Output = ()>`
|
||||
note: required by a bound in `gimme_send`
|
||||
--> $DIR/partial-drop-partial-reinit.rs:10:18
|
||||
|
|
||||
LL | fn gimme_send<T: Send>(t: T) {
|
||||
| ^^^^ required by this bound in `gimme_send`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
|
|
@ -10,20 +10,12 @@ async fn foo() {
|
|||
//~^ ERROR type inside `async fn` body must be known in this context
|
||||
//~| ERROR type inside `async fn` body must be known in this context
|
||||
//~| ERROR type inside `async fn` body must be known in this context
|
||||
//~| ERROR type inside `async fn` body must be known in this context
|
||||
//~| ERROR type inside `async fn` body must be known in this context
|
||||
//~| NOTE cannot infer type for type parameter `T`
|
||||
//~| NOTE cannot infer type for type parameter `T`
|
||||
//~| NOTE cannot infer type for type parameter `T`
|
||||
//~| NOTE cannot infer type for type parameter `T`
|
||||
//~| NOTE cannot infer type for type parameter `T`
|
||||
//~| NOTE the type is part of the `async fn` body because of this `await`
|
||||
//~| NOTE the type is part of the `async fn` body because of this `await`
|
||||
//~| NOTE the type is part of the `async fn` body because of this `await`
|
||||
//~| NOTE the type is part of the `async fn` body because of this `await`
|
||||
//~| NOTE the type is part of the `async fn` body because of this `await`
|
||||
//~| NOTE in this expansion of desugaring of `await`
|
||||
//~| NOTE in this expansion of desugaring of `await`
|
||||
//~| NOTE in this expansion of desugaring of `await`
|
||||
//~| NOTE in this expansion of desugaring of `await`
|
||||
//~| NOTE in this expansion of desugaring of `await`
|
||||
|
|
|
|||
|
|
@ -34,30 +34,6 @@ note: the type is part of the `async fn` body because of this `await`
|
|||
LL | bar().await;
|
||||
| ^^^^^^
|
||||
|
||||
error[E0698]: type inside `async fn` body must be known in this context
|
||||
--> $DIR/unresolved_type_param.rs:9:5
|
||||
|
|
||||
LL | bar().await;
|
||||
| ^^^ cannot infer type for type parameter `T` declared on the function `bar`
|
||||
|
|
||||
note: the type is part of the `async fn` body because of this `await`
|
||||
--> $DIR/unresolved_type_param.rs:9:10
|
||||
|
|
||||
LL | bar().await;
|
||||
| ^^^^^^
|
||||
|
||||
error[E0698]: type inside `async fn` body must be known in this context
|
||||
--> $DIR/unresolved_type_param.rs:9:5
|
||||
|
|
||||
LL | bar().await;
|
||||
| ^^^ cannot infer type for type parameter `T` declared on the function `bar`
|
||||
|
|
||||
note: the type is part of the `async fn` body because of this `await`
|
||||
--> $DIR/unresolved_type_param.rs:9:10
|
||||
|
|
||||
LL | bar().await;
|
||||
| ^^^^^^
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0698`.
|
||||
|
|
|
|||
121
src/test/ui/generator/drop-control-flow.rs
Normal file
121
src/test/ui/generator/drop-control-flow.rs
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
// build-pass
|
||||
|
||||
// A test to ensure generators capture values that were conditionally dropped,
|
||||
// and also that values that are dropped along all paths to a yield do not get
|
||||
// included in the generator type.
|
||||
|
||||
#![feature(generators, negative_impls)]
|
||||
#![allow(unused_assignments, dead_code)]
|
||||
|
||||
struct Ptr;
|
||||
impl<'a> Drop for Ptr {
|
||||
fn drop(&mut self) {}
|
||||
}
|
||||
|
||||
struct NonSend;
|
||||
impl !Send for NonSend {}
|
||||
|
||||
fn assert_send<T: Send>(_: T) {}
|
||||
|
||||
// This test case is reduced from src/test/ui/drop/dynamic-drop-async.rs
|
||||
fn one_armed_if(arg: bool) {
|
||||
let _ = || {
|
||||
let arr = [Ptr];
|
||||
if arg {
|
||||
drop(arr);
|
||||
}
|
||||
yield;
|
||||
};
|
||||
}
|
||||
|
||||
fn two_armed_if(arg: bool) {
|
||||
assert_send(|| {
|
||||
let arr = [Ptr];
|
||||
if arg {
|
||||
drop(arr);
|
||||
} else {
|
||||
drop(arr);
|
||||
}
|
||||
yield;
|
||||
})
|
||||
}
|
||||
|
||||
fn if_let(arg: Option<i32>) {
|
||||
let _ = || {
|
||||
let arr = [Ptr];
|
||||
if let Some(_) = arg {
|
||||
drop(arr);
|
||||
}
|
||||
yield;
|
||||
};
|
||||
}
|
||||
|
||||
fn init_in_if(arg: bool) {
|
||||
assert_send(|| {
|
||||
let mut x = NonSend;
|
||||
drop(x);
|
||||
if arg {
|
||||
x = NonSend;
|
||||
} else {
|
||||
yield;
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
fn init_in_match_arm(arg: Option<i32>) {
|
||||
assert_send(|| {
|
||||
let mut x = NonSend;
|
||||
drop(x);
|
||||
match arg {
|
||||
Some(_) => x = NonSend,
|
||||
None => yield,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
fn reinit() {
|
||||
let _ = || {
|
||||
let mut arr = [Ptr];
|
||||
drop(arr);
|
||||
arr = [Ptr];
|
||||
yield;
|
||||
};
|
||||
}
|
||||
|
||||
fn loop_uninit() {
|
||||
let _ = || {
|
||||
let mut arr = [Ptr];
|
||||
let mut count = 0;
|
||||
drop(arr);
|
||||
while count < 3 {
|
||||
yield;
|
||||
arr = [Ptr];
|
||||
count += 1;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
fn nested_loop() {
|
||||
let _ = || {
|
||||
let mut arr = [Ptr];
|
||||
let mut count = 0;
|
||||
drop(arr);
|
||||
while count < 3 {
|
||||
for _ in 0..3 {
|
||||
yield;
|
||||
}
|
||||
arr = [Ptr];
|
||||
count += 1;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
fn main() {
|
||||
one_armed_if(true);
|
||||
if_let(Some(41));
|
||||
init_in_if(true);
|
||||
init_in_match_arm(Some(41));
|
||||
reinit();
|
||||
loop_uninit();
|
||||
nested_loop();
|
||||
}
|
||||
15
src/test/ui/generator/drop-yield-twice.rs
Normal file
15
src/test/ui/generator/drop-yield-twice.rs
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
#![feature(negative_impls, generators)]
|
||||
|
||||
struct Foo(i32);
|
||||
impl !Send for Foo {}
|
||||
|
||||
fn main() {
|
||||
assert_send(|| { //~ ERROR generator cannot be sent between threads safely
|
||||
let guard = Foo(42);
|
||||
yield;
|
||||
drop(guard);
|
||||
yield;
|
||||
})
|
||||
}
|
||||
|
||||
fn assert_send<T: Send>(_: T) {}
|
||||
25
src/test/ui/generator/drop-yield-twice.stderr
Normal file
25
src/test/ui/generator/drop-yield-twice.stderr
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
error: generator cannot be sent between threads safely
|
||||
--> $DIR/drop-yield-twice.rs:7:5
|
||||
|
|
||||
LL | assert_send(|| {
|
||||
| ^^^^^^^^^^^ generator is not `Send`
|
||||
|
|
||||
= help: within `[generator@$DIR/drop-yield-twice.rs:7:17: 12:6]`, the trait `Send` is not implemented for `Foo`
|
||||
note: generator is not `Send` as this value is used across a yield
|
||||
--> $DIR/drop-yield-twice.rs:9:9
|
||||
|
|
||||
LL | let guard = Foo(42);
|
||||
| ----- has type `Foo` which is not `Send`
|
||||
LL | yield;
|
||||
| ^^^^^ yield occurs here, with `guard` maybe used later
|
||||
...
|
||||
LL | })
|
||||
| - `guard` is later dropped here
|
||||
note: required by a bound in `assert_send`
|
||||
--> $DIR/drop-yield-twice.rs:15:19
|
||||
|
|
||||
LL | fn assert_send<T: Send>(_: T) {}
|
||||
| ^^^^ required by this bound in `assert_send`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
16
src/test/ui/generator/issue-57478.rs
Normal file
16
src/test/ui/generator/issue-57478.rs
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
// check-pass
|
||||
|
||||
#![feature(negative_impls, generators)]
|
||||
|
||||
struct Foo;
|
||||
impl !Send for Foo {}
|
||||
|
||||
fn main() {
|
||||
assert_send(|| {
|
||||
let guard = Foo;
|
||||
drop(guard);
|
||||
yield;
|
||||
})
|
||||
}
|
||||
|
||||
fn assert_send<T: Send>(_: T) {}
|
||||
40
src/test/ui/generator/partial-drop.rs
Normal file
40
src/test/ui/generator/partial-drop.rs
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
#![feature(negative_impls, generators)]
|
||||
|
||||
struct Foo;
|
||||
impl !Send for Foo {}
|
||||
|
||||
struct Bar {
|
||||
foo: Foo,
|
||||
x: i32,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
assert_send(|| {
|
||||
//~^ ERROR generator cannot be sent between threads safely
|
||||
// FIXME: it would be nice to make this work.
|
||||
let guard = Bar { foo: Foo, x: 42 };
|
||||
drop(guard.foo);
|
||||
yield;
|
||||
});
|
||||
|
||||
assert_send(|| {
|
||||
//~^ ERROR generator cannot be sent between threads safely
|
||||
// FIXME: it would be nice to make this work.
|
||||
let guard = Bar { foo: Foo, x: 42 };
|
||||
drop(guard);
|
||||
guard.foo = Foo;
|
||||
guard.x = 23;
|
||||
yield;
|
||||
});
|
||||
|
||||
assert_send(|| {
|
||||
//~^ ERROR generator cannot be sent between threads safely
|
||||
// FIXME: it would be nice to make this work.
|
||||
let guard = Bar { foo: Foo, x: 42 };
|
||||
let Bar { foo, x } = guard;
|
||||
drop(foo);
|
||||
yield;
|
||||
});
|
||||
}
|
||||
|
||||
fn assert_send<T: Send>(_: T) {}
|
||||
71
src/test/ui/generator/partial-drop.stderr
Normal file
71
src/test/ui/generator/partial-drop.stderr
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
error: generator cannot be sent between threads safely
|
||||
--> $DIR/partial-drop.rs:12:5
|
||||
|
|
||||
LL | assert_send(|| {
|
||||
| ^^^^^^^^^^^ generator is not `Send`
|
||||
|
|
||||
= help: within `[generator@$DIR/partial-drop.rs:12:17: 18:6]`, the trait `Send` is not implemented for `Foo`
|
||||
note: generator is not `Send` as this value is used across a yield
|
||||
--> $DIR/partial-drop.rs:17:9
|
||||
|
|
||||
LL | let guard = Bar { foo: Foo, x: 42 };
|
||||
| ----- has type `Bar` which is not `Send`
|
||||
LL | drop(guard.foo);
|
||||
LL | yield;
|
||||
| ^^^^^ yield occurs here, with `guard` maybe used later
|
||||
LL | });
|
||||
| - `guard` is later dropped here
|
||||
note: required by a bound in `assert_send`
|
||||
--> $DIR/partial-drop.rs:40:19
|
||||
|
|
||||
LL | fn assert_send<T: Send>(_: T) {}
|
||||
| ^^^^ required by this bound in `assert_send`
|
||||
|
||||
error: generator cannot be sent between threads safely
|
||||
--> $DIR/partial-drop.rs:20:5
|
||||
|
|
||||
LL | assert_send(|| {
|
||||
| ^^^^^^^^^^^ generator is not `Send`
|
||||
|
|
||||
= help: within `[generator@$DIR/partial-drop.rs:20:17: 28:6]`, the trait `Send` is not implemented for `Foo`
|
||||
note: generator is not `Send` as this value is used across a yield
|
||||
--> $DIR/partial-drop.rs:27:9
|
||||
|
|
||||
LL | let guard = Bar { foo: Foo, x: 42 };
|
||||
| ----- has type `Bar` which is not `Send`
|
||||
...
|
||||
LL | yield;
|
||||
| ^^^^^ yield occurs here, with `guard` maybe used later
|
||||
LL | });
|
||||
| - `guard` is later dropped here
|
||||
note: required by a bound in `assert_send`
|
||||
--> $DIR/partial-drop.rs:40:19
|
||||
|
|
||||
LL | fn assert_send<T: Send>(_: T) {}
|
||||
| ^^^^ required by this bound in `assert_send`
|
||||
|
||||
error: generator cannot be sent between threads safely
|
||||
--> $DIR/partial-drop.rs:30:5
|
||||
|
|
||||
LL | assert_send(|| {
|
||||
| ^^^^^^^^^^^ generator is not `Send`
|
||||
|
|
||||
= help: within `[generator@$DIR/partial-drop.rs:30:17: 37:6]`, the trait `Send` is not implemented for `Foo`
|
||||
note: generator is not `Send` as this value is used across a yield
|
||||
--> $DIR/partial-drop.rs:36:9
|
||||
|
|
||||
LL | let guard = Bar { foo: Foo, x: 42 };
|
||||
| ----- has type `Bar` which is not `Send`
|
||||
...
|
||||
LL | yield;
|
||||
| ^^^^^ yield occurs here, with `guard` maybe used later
|
||||
LL | });
|
||||
| - `guard` is later dropped here
|
||||
note: required by a bound in `assert_send`
|
||||
--> $DIR/partial-drop.rs:40:19
|
||||
|
|
||||
LL | fn assert_send<T: Send>(_: T) {}
|
||||
| ^^^^ required by this bound in `assert_send`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
25
src/test/ui/generator/reinit-in-match-guard.rs
Normal file
25
src/test/ui/generator/reinit-in-match-guard.rs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
// build-pass
|
||||
|
||||
#![feature(generators)]
|
||||
|
||||
#![allow(unused_assignments, dead_code)]
|
||||
|
||||
fn main() {
|
||||
let _ = || {
|
||||
let mut x = vec![22_usize];
|
||||
std::mem::drop(x);
|
||||
match y() {
|
||||
true if {
|
||||
x = vec![];
|
||||
false
|
||||
} => {}
|
||||
_ => {
|
||||
yield;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
fn y() -> bool {
|
||||
true
|
||||
}
|
||||
|
|
@ -11,16 +11,10 @@ LL | struct SemiTransparent;
|
|||
| ----------------------- similarly named unit struct `SemiTransparent` defined here
|
||||
...
|
||||
LL | semitransparent;
|
||||
| ^^^^^^^^^^^^^^^ not a value
|
||||
|
|
||||
help: use `!` to invoke the macro
|
||||
|
|
||||
LL | semitransparent!;
|
||||
| +
|
||||
help: a unit struct with a similar name exists
|
||||
|
|
||||
LL | SemiTransparent;
|
||||
| ~~~~~~~~~~~~~~~
|
||||
| ^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| not a value
|
||||
| help: a unit struct with a similar name exists: `SemiTransparent`
|
||||
|
||||
error[E0423]: expected value, found macro `opaque`
|
||||
--> $DIR/rustc-macro-transparency.rs:30:5
|
||||
|
|
@ -29,16 +23,10 @@ LL | struct Opaque;
|
|||
| -------------- similarly named unit struct `Opaque` defined here
|
||||
...
|
||||
LL | opaque;
|
||||
| ^^^^^^ not a value
|
||||
|
|
||||
help: use `!` to invoke the macro
|
||||
|
|
||||
LL | opaque!;
|
||||
| +
|
||||
help: a unit struct with a similar name exists
|
||||
|
|
||||
LL | Opaque;
|
||||
| ~~~~~~
|
||||
| ^^^^^^
|
||||
| |
|
||||
| not a value
|
||||
| help: a unit struct with a similar name exists (notice the capitalization): `Opaque`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ async fn wheeee<T>(t: T) {
|
|||
}
|
||||
|
||||
async fn yes() {
|
||||
wheeee(No {}).await; //~ ERROR `No` held across
|
||||
wheeee(&No {}).await; //~ ERROR `No` held across
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
error: `No` held across a suspend point, but should not be
|
||||
--> $DIR/dedup.rs:16:12
|
||||
--> $DIR/dedup.rs:16:13
|
||||
|
|
||||
LL | wheeee(No {}).await;
|
||||
| ^^^^^ ------ the value is held across this suspend point
|
||||
LL | wheeee(&No {}).await;
|
||||
| ^^^^^ ------ the value is held across this suspend point
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/dedup.rs:3:9
|
||||
|
|
@ -10,10 +10,10 @@ note: the lint level is defined here
|
|||
LL | #![deny(must_not_suspend)]
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
help: consider using a block (`{ ... }`) to shrink the value's scope, ending before the suspend point
|
||||
--> $DIR/dedup.rs:16:12
|
||||
--> $DIR/dedup.rs:16:13
|
||||
|
|
||||
LL | wheeee(No {}).await;
|
||||
| ^^^^^
|
||||
LL | wheeee(&No {}).await;
|
||||
| ^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
11
src/test/ui/resolve/resolve-hint-macro.fixed
Normal file
11
src/test/ui/resolve/resolve-hint-macro.fixed
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
// run-rustfix
|
||||
fn main() {
|
||||
assert_eq!(1, 1);
|
||||
//~^ ERROR expected function, found macro `assert_eq`
|
||||
assert_eq! { 1, 1 };
|
||||
//~^ ERROR expected struct, variant or union type, found macro `assert_eq`
|
||||
//~| ERROR expected identifier, found `1`
|
||||
//~| ERROR expected identifier, found `1`
|
||||
assert![true];
|
||||
//~^ ERROR expected value, found macro `assert`
|
||||
}
|
||||
|
|
@ -1,4 +1,11 @@
|
|||
// run-rustfix
|
||||
fn main() {
|
||||
assert_eq(1, 1);
|
||||
//~^ ERROR expected function, found macro `assert_eq`
|
||||
assert_eq { 1, 1 };
|
||||
//~^ ERROR expected struct, variant or union type, found macro `assert_eq`
|
||||
//~| ERROR expected identifier, found `1`
|
||||
//~| ERROR expected identifier, found `1`
|
||||
assert[true];
|
||||
//~^ ERROR expected value, found macro `assert`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,21 @@
|
|||
error: expected identifier, found `1`
|
||||
--> $DIR/resolve-hint-macro.rs:5:17
|
||||
|
|
||||
LL | assert_eq { 1, 1 };
|
||||
| --------- ^ expected identifier
|
||||
| |
|
||||
| while parsing this struct
|
||||
|
||||
error: expected identifier, found `1`
|
||||
--> $DIR/resolve-hint-macro.rs:5:20
|
||||
|
|
||||
LL | assert_eq { 1, 1 };
|
||||
| --------- ^ expected identifier
|
||||
| |
|
||||
| while parsing this struct
|
||||
|
||||
error[E0423]: expected function, found macro `assert_eq`
|
||||
--> $DIR/resolve-hint-macro.rs:2:5
|
||||
--> $DIR/resolve-hint-macro.rs:3:5
|
||||
|
|
||||
LL | assert_eq(1, 1);
|
||||
| ^^^^^^^^^ not a function
|
||||
|
|
@ -9,6 +25,29 @@ help: use `!` to invoke the macro
|
|||
LL | assert_eq!(1, 1);
|
||||
| +
|
||||
|
||||
error: aborting due to previous error
|
||||
error[E0574]: expected struct, variant or union type, found macro `assert_eq`
|
||||
--> $DIR/resolve-hint-macro.rs:5:5
|
||||
|
|
||||
LL | assert_eq { 1, 1 };
|
||||
| ^^^^^^^^^ not a struct, variant or union type
|
||||
|
|
||||
help: use `!` to invoke the macro
|
||||
|
|
||||
LL | assert_eq! { 1, 1 };
|
||||
| +
|
||||
|
||||
For more information about this error, try `rustc --explain E0423`.
|
||||
error[E0423]: expected value, found macro `assert`
|
||||
--> $DIR/resolve-hint-macro.rs:9:5
|
||||
|
|
||||
LL | assert[true];
|
||||
| ^^^^^^ not a value
|
||||
|
|
||||
help: use `!` to invoke the macro
|
||||
|
|
||||
LL | assert![true];
|
||||
| +
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0423, E0574.
|
||||
For more information about an error, try `rustc --explain E0423`.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// check-pass
|
||||
|
||||
#![feature(let_chains)]
|
||||
#![feature(if_let_guard, let_chains)]
|
||||
|
||||
use std::ops::Range;
|
||||
|
||||
|
|
@ -16,6 +16,16 @@ fn main() {
|
|||
&& let None = local_start {
|
||||
}
|
||||
|
||||
match opt {
|
||||
Some(ref first) if let second = first && let _third = second => {},
|
||||
_ => {}
|
||||
}
|
||||
match opt {
|
||||
Some(ref first) if let Range { start: local_start, end: _ } = first
|
||||
&& let None = local_start => {},
|
||||
_ => {}
|
||||
}
|
||||
|
||||
while let first = &opt && let Some(ref second) = first && let None = second.start {
|
||||
}
|
||||
while let Some(ref first) = opt && let second = first && let _third = second {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// run-pass
|
||||
|
||||
#![feature(let_chains)]
|
||||
#![feature(if_let_guard, let_chains)]
|
||||
|
||||
fn check_if_let(opt: Option<Option<Option<i32>>>, value: i32) -> bool {
|
||||
if let Some(first) = opt
|
||||
|
|
@ -15,6 +15,17 @@ fn check_if_let(opt: Option<Option<Option<i32>>>, value: i32) -> bool {
|
|||
}
|
||||
}
|
||||
|
||||
fn check_let_guard(opt: Option<Option<Option<i32>>>, value: i32) -> bool {
|
||||
match opt {
|
||||
Some(first) if let Some(second) = first && let Some(third) = second && third == value => {
|
||||
true
|
||||
}
|
||||
_ => {
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn check_while_let(opt: Option<Option<Option<i32>>>, value: i32) -> bool {
|
||||
while let Some(first) = opt
|
||||
&& let Some(second) = first
|
||||
|
|
@ -30,6 +41,9 @@ fn main() {
|
|||
assert_eq!(check_if_let(Some(Some(Some(1))), 1), true);
|
||||
assert_eq!(check_if_let(Some(Some(Some(1))), 9), false);
|
||||
|
||||
assert_eq!(check_let_guard(Some(Some(Some(1))), 1), true);
|
||||
assert_eq!(check_let_guard(Some(Some(Some(1))), 9), false);
|
||||
|
||||
assert_eq!(check_while_let(Some(Some(Some(1))), 1), true);
|
||||
assert_eq!(check_while_let(Some(Some(Some(1))), 9), false);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue