Skip to content

Commit

Permalink
Mark format! with must_use hint
Browse files Browse the repository at this point in the history
  • Loading branch information
lukas committed Jul 5, 2024
1 parent 51917ba commit 0b31188
Show file tree
Hide file tree
Showing 13 changed files with 83 additions and 79 deletions.
18 changes: 9 additions & 9 deletions library/alloc/src/collections/btree/map/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1796,18 +1796,18 @@ fn test_ord_absence() {
}

fn map_debug<K: Debug>(mut map: BTreeMap<K, ()>) {
format!("{map:?}");
format!("{:?}", map.iter());
format!("{:?}", map.iter_mut());
format!("{:?}", map.keys());
format!("{:?}", map.values());
format!("{:?}", map.values_mut());
let _ = format!("{map:?}");
let _ = format!("{:?}", map.iter());
let _ = format!("{:?}", map.iter_mut());
let _ = format!("{:?}", map.keys());
let _ = format!("{:?}", map.values());
let _ = format!("{:?}", map.values_mut());
if true {
format!("{:?}", map.into_iter());
let _ = format!("{:?}", map.into_iter());
} else if true {
format!("{:?}", map.into_keys());
let _ = format!("{:?}", map.into_keys());
} else {
format!("{:?}", map.into_values());
let _ = format!("{:?}", map.into_values());
}
}

Expand Down
6 changes: 3 additions & 3 deletions library/alloc/src/collections/btree/set/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -705,9 +705,9 @@ fn test_ord_absence() {
}

fn set_debug<K: Debug>(set: BTreeSet<K>) {
format!("{set:?}");
format!("{:?}", set.iter());
format!("{:?}", set.into_iter());
let _ = format!("{set:?}");
let _ = format!("{:?}", set.iter());
let _ = format!("{:?}", set.into_iter());
}

fn set_clone<K: Clone>(mut set: BTreeSet<K>) {
Expand Down
1 change: 1 addition & 0 deletions library/alloc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,7 @@ pub mod vec;
#[unstable(feature = "liballoc_internals", issue = "none", reason = "implementation detail")]
pub mod __export {
pub use core::format_args;
pub use core::hint::must_use;
}

#[cfg(test)]
Expand Down
11 changes: 7 additions & 4 deletions library/alloc/src/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,10 +119,13 @@ macro_rules! vec {
/// ```
#[macro_export]
#[stable(feature = "rust1", since = "1.0.0")]
#[allow_internal_unstable(hint_must_use, liballoc_internals)]
#[cfg_attr(not(test), rustc_diagnostic_item = "format_macro")]
macro_rules! format {
($($arg:tt)*) => {{
let res = $crate::fmt::format($crate::__export::format_args!($($arg)*));
res
}}
($($arg:tt)*) => {
$crate::__export::must_use({
let res = $crate::fmt::format($crate::__export::format_args!($($arg)*));
res
})
}
}
10 changes: 5 additions & 5 deletions library/alloc/tests/fmt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -217,19 +217,19 @@ fn test_format_macro_interface() {

// make sure that format! doesn't move out of local variables
let a = Box::new(3);
format!("{a}");
format!("{a}");
let _ = format!("{a}");
let _ = format!("{a}");

// make sure that format! doesn't cause spurious unused-unsafe warnings when
// it's inside of an outer unsafe block
unsafe {
let a: isize = ::std::mem::transmute(3_usize);
format!("{a}");
let _ = format!("{a}");
}

// test that trailing commas are acceptable
format!("{}", "test",);
format!("{foo}", foo = "test",);
let _ = format!("{}", "test",);
let _ = format!("{foo}", foo = "test",);
}

// Basic test to make sure that we can invoke the `write!` macro with an
Expand Down
6 changes: 3 additions & 3 deletions library/core/tests/fmt/builders.rs
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,7 @@ mod debug_map {
}
}

format!("{Foo:?}");
let _ = format!("{Foo:?}");
}

#[test]
Expand All @@ -455,7 +455,7 @@ mod debug_map {
}
}

format!("{Foo:?}");
let _ = format!("{Foo:?}");
}

#[test]
Expand All @@ -469,7 +469,7 @@ mod debug_map {
}
}

format!("{Foo:?}");
let _ = format!("{Foo:?}");
}
}

Expand Down
6 changes: 3 additions & 3 deletions src/bootstrap/src/core/build_steps/llvm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -755,7 +755,7 @@ fn configure_cmake(
}

if builder.config.llvm_clang_cl.is_some() {
cflags.push(&format!(" --target={target}"));
cflags.push(format!(" --target={target}"));
}
cfg.define("CMAKE_C_FLAGS", cflags);
let mut cxxflags: OsString = builder
Expand All @@ -774,7 +774,7 @@ fn configure_cmake(
cxxflags.push(s);
}
if builder.config.llvm_clang_cl.is_some() {
cxxflags.push(&format!(" --target={target}"));
cxxflags.push(format!(" --target={target}"));
}
cfg.define("CMAKE_CXX_FLAGS", cxxflags);
if let Some(ar) = builder.ar(target) {
Expand Down Expand Up @@ -915,7 +915,7 @@ impl Step for Lld {
// Find clang's runtime library directory and push that as a search path to the
// cmake linker flags.
let clang_rt_dir = get_clang_cl_resource_dir(clang_cl_path);
ldflags.push_all(&format!("/libpath:{}", clang_rt_dir.display()));
ldflags.push_all(format!("/libpath:{}", clang_rt_dir.display()));
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/bootstrap/src/core/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2527,7 +2527,7 @@ impl Cargo {

if let Some(target_linker) = builder.linker(target) {
let target = crate::envify(&target.triple);
self.command.env(&format!("CARGO_TARGET_{target}_LINKER"), target_linker);
self.command.env(format!("CARGO_TARGET_{target}_LINKER"), target_linker);
}
// We want to set -Clinker using Cargo, therefore we only call `linker_flags` and not
// `linker_args` here.
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/deriving/deriving-in-fn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ pub fn main() {
}

let f = Foo { foo: 10 };
format!("{:?}", f);
let _ = format!("{:?}", f);
}
14 changes: 7 additions & 7 deletions tests/ui/fmt/struct-field-as-captured-argument.fixed
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ struct Foo {
fn main() {
let foo = Foo { field: 0 };
let bar = 3;
format!("{0}", foo.field); //~ ERROR invalid format string: field access isn't supported
format!("{1} {} {bar}", "aa", foo.field); //~ ERROR invalid format string: field access isn't supported
format!("{2} {} {1} {bar}", "aa", "bb", foo.field); //~ ERROR invalid format string: field access isn't supported
format!("{1} {} {baz}", "aa", foo.field, baz = 3); //~ ERROR invalid format string: field access isn't supported
format!("{1:?} {} {baz}", "aa", foo.field, baz = 3); //~ ERROR invalid format string: field access isn't supported
format!("{1:#?} {} {baz}", "aa", foo.field, baz = 3); //~ ERROR invalid format string: field access isn't supported
format!("{1:.3} {} {baz}", "aa", foo.field, baz = 3); //~ ERROR invalid format string: field access isn't supported
let _ = format!("{0}", foo.field); //~ ERROR invalid format string: field access isn't supported
let _ = format!("{1} {} {bar}", "aa", foo.field); //~ ERROR invalid format string: field access isn't supported
let _ = format!("{2} {} {1} {bar}", "aa", "bb", foo.field); //~ ERROR invalid format string: field access isn't supported
let _ = format!("{1} {} {baz}", "aa", foo.field, baz = 3); //~ ERROR invalid format string: field access isn't supported
let _ = format!("{1:?} {} {baz}", "aa", foo.field, baz = 3); //~ ERROR invalid format string: field access isn't supported
let _ = format!("{1:#?} {} {baz}", "aa", foo.field, baz = 3); //~ ERROR invalid format string: field access isn't supported
let _ = format!("{1:.3} {} {baz}", "aa", foo.field, baz = 3); //~ ERROR invalid format string: field access isn't supported
}
14 changes: 7 additions & 7 deletions tests/ui/fmt/struct-field-as-captured-argument.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ struct Foo {
fn main() {
let foo = Foo { field: 0 };
let bar = 3;
format!("{foo.field}"); //~ ERROR invalid format string: field access isn't supported
format!("{foo.field} {} {bar}", "aa"); //~ ERROR invalid format string: field access isn't supported
format!("{foo.field} {} {1} {bar}", "aa", "bb"); //~ ERROR invalid format string: field access isn't supported
format!("{foo.field} {} {baz}", "aa", baz = 3); //~ ERROR invalid format string: field access isn't supported
format!("{foo.field:?} {} {baz}", "aa", baz = 3); //~ ERROR invalid format string: field access isn't supported
format!("{foo.field:#?} {} {baz}", "aa", baz = 3); //~ ERROR invalid format string: field access isn't supported
format!("{foo.field:.3} {} {baz}", "aa", baz = 3); //~ ERROR invalid format string: field access isn't supported
let _ = format!("{foo.field}"); //~ ERROR invalid format string: field access isn't supported
let _ = format!("{foo.field} {} {bar}", "aa"); //~ ERROR invalid format string: field access isn't supported
let _ = format!("{foo.field} {} {1} {bar}", "aa", "bb"); //~ ERROR invalid format string: field access isn't supported
let _ = format!("{foo.field} {} {baz}", "aa", baz = 3); //~ ERROR invalid format string: field access isn't supported
let _ = format!("{foo.field:?} {} {baz}", "aa", baz = 3); //~ ERROR invalid format string: field access isn't supported
let _ = format!("{foo.field:#?} {} {baz}", "aa", baz = 3); //~ ERROR invalid format string: field access isn't supported
let _ = format!("{foo.field:.3} {} {baz}", "aa", baz = 3); //~ ERROR invalid format string: field access isn't supported
}
70 changes: 35 additions & 35 deletions tests/ui/fmt/struct-field-as-captured-argument.stderr
Original file line number Diff line number Diff line change
@@ -1,79 +1,79 @@
error: invalid format string: field access isn't supported
--> $DIR/struct-field-as-captured-argument.rs:11:15
--> $DIR/struct-field-as-captured-argument.rs:11:23
|
LL | format!("{foo.field}");
| ^^^^^^^^^ not supported in format string
LL | let _ = format!("{foo.field}");
| ^^^^^^^^^ not supported in format string
|
help: consider using a positional formatting argument instead
|
LL | format!("{0}", foo.field);
| ~ +++++++++++
LL | let _ = format!("{0}", foo.field);
| ~ +++++++++++

error: invalid format string: field access isn't supported
--> $DIR/struct-field-as-captured-argument.rs:12:15
--> $DIR/struct-field-as-captured-argument.rs:12:23
|
LL | format!("{foo.field} {} {bar}", "aa");
| ^^^^^^^^^ not supported in format string
LL | let _ = format!("{foo.field} {} {bar}", "aa");
| ^^^^^^^^^ not supported in format string
|
help: consider using a positional formatting argument instead
|
LL | format!("{1} {} {bar}", "aa", foo.field);
| ~ +++++++++++
LL | let _ = format!("{1} {} {bar}", "aa", foo.field);
| ~ +++++++++++

error: invalid format string: field access isn't supported
--> $DIR/struct-field-as-captured-argument.rs:13:15
--> $DIR/struct-field-as-captured-argument.rs:13:23
|
LL | format!("{foo.field} {} {1} {bar}", "aa", "bb");
| ^^^^^^^^^ not supported in format string
LL | let _ = format!("{foo.field} {} {1} {bar}", "aa", "bb");
| ^^^^^^^^^ not supported in format string
|
help: consider using a positional formatting argument instead
|
LL | format!("{2} {} {1} {bar}", "aa", "bb", foo.field);
| ~ +++++++++++
LL | let _ = format!("{2} {} {1} {bar}", "aa", "bb", foo.field);
| ~ +++++++++++

error: invalid format string: field access isn't supported
--> $DIR/struct-field-as-captured-argument.rs:14:15
--> $DIR/struct-field-as-captured-argument.rs:14:23
|
LL | format!("{foo.field} {} {baz}", "aa", baz = 3);
| ^^^^^^^^^ not supported in format string
LL | let _ = format!("{foo.field} {} {baz}", "aa", baz = 3);
| ^^^^^^^^^ not supported in format string
|
help: consider using a positional formatting argument instead
|
LL | format!("{1} {} {baz}", "aa", foo.field, baz = 3);
| ~ +++++++++++
LL | let _ = format!("{1} {} {baz}", "aa", foo.field, baz = 3);
| ~ +++++++++++

error: invalid format string: field access isn't supported
--> $DIR/struct-field-as-captured-argument.rs:15:15
--> $DIR/struct-field-as-captured-argument.rs:15:23
|
LL | format!("{foo.field:?} {} {baz}", "aa", baz = 3);
| ^^^^^^^^^ not supported in format string
LL | let _ = format!("{foo.field:?} {} {baz}", "aa", baz = 3);
| ^^^^^^^^^ not supported in format string
|
help: consider using a positional formatting argument instead
|
LL | format!("{1:?} {} {baz}", "aa", foo.field, baz = 3);
| ~ +++++++++++
LL | let _ = format!("{1:?} {} {baz}", "aa", foo.field, baz = 3);
| ~ +++++++++++

error: invalid format string: field access isn't supported
--> $DIR/struct-field-as-captured-argument.rs:16:15
--> $DIR/struct-field-as-captured-argument.rs:16:23
|
LL | format!("{foo.field:#?} {} {baz}", "aa", baz = 3);
| ^^^^^^^^^ not supported in format string
LL | let _ = format!("{foo.field:#?} {} {baz}", "aa", baz = 3);
| ^^^^^^^^^ not supported in format string
|
help: consider using a positional formatting argument instead
|
LL | format!("{1:#?} {} {baz}", "aa", foo.field, baz = 3);
| ~ +++++++++++
LL | let _ = format!("{1:#?} {} {baz}", "aa", foo.field, baz = 3);
| ~ +++++++++++

error: invalid format string: field access isn't supported
--> $DIR/struct-field-as-captured-argument.rs:17:15
--> $DIR/struct-field-as-captured-argument.rs:17:23
|
LL | format!("{foo.field:.3} {} {baz}", "aa", baz = 3);
| ^^^^^^^^^ not supported in format string
LL | let _ = format!("{foo.field:.3} {} {baz}", "aa", baz = 3);
| ^^^^^^^^^ not supported in format string
|
help: consider using a positional formatting argument instead
|
LL | format!("{1:.3} {} {baz}", "aa", foo.field, baz = 3);
| ~ +++++++++++
LL | let _ = format!("{1:.3} {} {baz}", "aa", foo.field, baz = 3);
| ~ +++++++++++

error: aborting due to 7 previous errors

2 changes: 1 addition & 1 deletion tests/ui/issues/issue-20676.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ use std::fmt;

fn main() {
let a: &dyn fmt::Debug = &1;
format!("{:?}", a);
let _ = format!("{:?}", a);
}

0 comments on commit 0b31188

Please sign in to comment.