mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 08:44:35 +00:00
Rollup merge of #86450 - tmiasko:move-size-limit, r=pnkfelix
Add flag to configure `large_assignments` lint The `large_assignments` lints detects moves over specified limit. The limit is configured through `move_size_limit = "N"` attribute placed at the root of a crate. When attribute is absent, the lint is disabled. Make it possible to enable the lint without making any changes to the source code, through a new flag `-Zmove-size-limit=N`. For example, to detect moves exceeding 1023 bytes in a cargo crate, including all dependencies one could use: ``` $ env RUSTFLAGS=-Zmove-size-limit=1024 cargo build -vv ``` Lint tracking issue #83518.
This commit is contained in:
commit
99a6474bc4
@ -735,6 +735,7 @@ fn test_debugging_options_tracking_hash() {
|
||||
tracked!(merge_functions, Some(MergeFunctions::Disabled));
|
||||
tracked!(mir_emit_retag, true);
|
||||
tracked!(mir_opt_level, Some(4));
|
||||
tracked!(move_size_limit, Some(4096));
|
||||
tracked!(mutable_noalias, Some(true));
|
||||
tracked!(new_llvm_pass_manager, Some(true));
|
||||
tracked!(no_generate_arange_section, true);
|
||||
|
@ -21,7 +21,12 @@ use std::num::IntErrorKind;
|
||||
pub fn provide(providers: &mut ty::query::Providers) {
|
||||
providers.limits = |tcx, ()| Limits {
|
||||
recursion_limit: get_recursion_limit(tcx.hir().krate_attrs(), tcx.sess),
|
||||
move_size_limit: get_limit(tcx.hir().krate_attrs(), tcx.sess, sym::move_size_limit, 0),
|
||||
move_size_limit: get_limit(
|
||||
tcx.hir().krate_attrs(),
|
||||
tcx.sess,
|
||||
sym::move_size_limit,
|
||||
tcx.sess.opts.debugging_opts.move_size_limit.unwrap_or(0),
|
||||
),
|
||||
type_length_limit: get_limit(
|
||||
tcx.hir().krate_attrs(),
|
||||
tcx.sess,
|
||||
|
@ -1148,6 +1148,8 @@ options! {
|
||||
(default: no)"),
|
||||
mir_opt_level: Option<usize> = (None, parse_opt_number, [TRACKED],
|
||||
"MIR optimization level (0-4; default: 1 in non optimized builds and 2 in optimized builds)"),
|
||||
move_size_limit: Option<usize> = (None, parse_opt_number, [TRACKED],
|
||||
"the size at which the `large_assignments` lint starts to be emitted"),
|
||||
mutable_noalias: Option<bool> = (None, parse_opt_bool, [TRACKED],
|
||||
"emit noalias metadata for mutable references (default: yes for LLVM >= 12, otherwise no)"),
|
||||
new_llvm_pass_manager: Option<bool> = (None, parse_opt_bool, [TRACKED],
|
||||
|
10
src/doc/unstable-book/src/compiler-flags/move-size-limit.md
Normal file
10
src/doc/unstable-book/src/compiler-flags/move-size-limit.md
Normal file
@ -0,0 +1,10 @@
|
||||
# `move_size_limit`
|
||||
|
||||
--------------------
|
||||
|
||||
The `-Zmove-size-limit=N` compiler flag enables `large_assignments` lints which
|
||||
will warn when moving objects whose size exceeds `N` bytes.
|
||||
|
||||
Lint warns only about moves in functions that participate in code generation.
|
||||
Consequently it will be ineffective for compiler invocatation that emit
|
||||
metadata only, i.e., `cargo check` like workflows.
|
@ -1,5 +1,5 @@
|
||||
error: moving 10024 bytes
|
||||
--> $DIR/large_moves.rs:10:13
|
||||
--> $DIR/large_moves.rs:12:13
|
||||
|
|
||||
LL | let x = async {
|
||||
| _____________^
|
||||
@ -17,19 +17,19 @@ LL | #![deny(large_assignments)]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: moving 10024 bytes
|
||||
--> $DIR/large_moves.rs:16:14
|
||||
--> $DIR/large_moves.rs:18:14
|
||||
|
|
||||
LL | let z = (x, 42);
|
||||
| ^ value moved from here
|
||||
|
||||
error: moving 10024 bytes
|
||||
--> $DIR/large_moves.rs:16:13
|
||||
--> $DIR/large_moves.rs:18:13
|
||||
|
|
||||
LL | let z = (x, 42);
|
||||
| ^^^^^^^ value moved from here
|
||||
|
||||
error: moving 10024 bytes
|
||||
--> $DIR/large_moves.rs:18:13
|
||||
--> $DIR/large_moves.rs:20:13
|
||||
|
|
||||
LL | let a = z.0;
|
||||
| ^^^ value moved from here
|
38
src/test/ui/async-await/large_moves.option.stderr
Normal file
38
src/test/ui/async-await/large_moves.option.stderr
Normal file
@ -0,0 +1,38 @@
|
||||
error: moving 10024 bytes
|
||||
--> $DIR/large_moves.rs:12:13
|
||||
|
|
||||
LL | let x = async {
|
||||
| _____________^
|
||||
LL | | let y = [0; 9999];
|
||||
LL | | dbg!(y);
|
||||
LL | | thing(&y).await;
|
||||
LL | | dbg!(y);
|
||||
LL | | };
|
||||
| |_____^ value moved from here
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/large_moves.rs:1:9
|
||||
|
|
||||
LL | #![deny(large_assignments)]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: moving 10024 bytes
|
||||
--> $DIR/large_moves.rs:18:14
|
||||
|
|
||||
LL | let z = (x, 42);
|
||||
| ^ value moved from here
|
||||
|
||||
error: moving 10024 bytes
|
||||
--> $DIR/large_moves.rs:18:13
|
||||
|
|
||||
LL | let z = (x, 42);
|
||||
| ^^^^^^^ value moved from here
|
||||
|
||||
error: moving 10024 bytes
|
||||
--> $DIR/large_moves.rs:20:13
|
||||
|
|
||||
LL | let a = z.0;
|
||||
| ^^^ value moved from here
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
@ -1,8 +1,10 @@
|
||||
#![deny(large_assignments)]
|
||||
#![feature(large_assignments)]
|
||||
#![move_size_limit = "1000"]
|
||||
#![cfg_attr(attribute, move_size_limit = "1000")]
|
||||
// build-fail
|
||||
// only-x86_64
|
||||
// revisions: attribute option
|
||||
// [option]compile-flags: -Zmove-size-limit=1000
|
||||
|
||||
// edition:2018
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user