about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2021-01-30 10:50:16 +0000
committerbors <bors@rust-lang.org>2021-01-30 10:50:16 +0000
commit7ce1b3b24491cbe10669cbe2b5733c2fe7cfe5b7 (patch)
treeb4bc76e37d133d24df1e8a93a0a2a0fa4aa74e7a /src
parentebaea9e850648dfeaeec353fd66c155c80de5ded (diff)
parent31e7634749a737be8118ec8fe92c2dfcd2d10046 (diff)
downloadrust-7ce1b3b24491cbe10669cbe2b5733c2fe7cfe5b7.tar.gz
rust-7ce1b3b24491cbe10669cbe2b5733c2fe7cfe5b7.zip
Auto merge of #81545 - JohnTitor:rollup-zlt3tn6, r=JohnTitor
Rollup of 16 pull requests

Successful merges:

 - #79023 (Add `core::stream::Stream`)
 - #80562 (Consider Scalar to be a bool only if its unsigned)
 - #80886 (Stabilize raw ref macros)
 - #80959 (Stabilize `unsigned_abs`)
 - #81291 (Support FRU pattern with `[feature(capture_disjoint_fields)]`)
 - #81409 (Slight simplification of chars().count())
 - #81468 (cfg(version): treat nightlies as complete)
 - #81473 (Warn write-only fields)
 - #81495 (rustdoc: Remove unnecessary optional)
 - #81499 (Updated Vec::splice documentation)
 - #81501 (update rustfmt to v1.4.34)
 - #81505 (`fn cold_path` doesn't need to be pub)
 - #81512 (Add missing variants in match binding)
 - #81515 (Fix typo in pat.rs)
 - #81519 (Don't print error output from rustup when detecting default build triple)
 - #81520 (Don't clone LLVM submodule when download-ci-llvm is set)

Failed merges:

r? `@ghost`
`@rustbot` modify labels: rollup
Diffstat (limited to 'src')
-rw-r--r--src/bootstrap/bootstrap.py5
-rw-r--r--src/librustdoc/clean/types.rs3
-rw-r--r--src/librustdoc/config.rs26
-rw-r--r--src/librustdoc/core.rs2
-rw-r--r--src/librustdoc/lib.rs4
-rw-r--r--src/librustdoc/passes/calculate_doc_coverage.rs2
-rw-r--r--src/test/codegen/abi-repr-ext.rs13
-rw-r--r--src/test/ui/borrowck/borrowck-assign-to-subfield.rs1
-rw-r--r--src/test/ui/cfg/assume-incomplete-release/assume-incomplete.rs38
-rw-r--r--src/test/ui/cfg/assume-incomplete-release/auxiliary/ver-cfg-rel.rs56
-rw-r--r--src/test/ui/closures/2229_closure_analysis/run_pass/fru_syntax.rs46
-rw-r--r--src/test/ui/closures/2229_closure_analysis/run_pass/fru_syntax.stderr11
-rw-r--r--src/test/ui/consts/min_const_fn/allow_raw_ptr_dereference_const_fn.rs3
-rw-r--r--src/test/ui/consts/ptr_comparisons.rs5
-rw-r--r--src/test/ui/consts/ptr_comparisons.stderr18
-rw-r--r--src/test/ui/lint/dead-code/write-only-field.rs20
-rw-r--r--src/test/ui/lint/dead-code/write-only-field.stderr26
m---------src/tools/rustfmt10
18 files changed, 253 insertions, 36 deletions
diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py
index 8576f57959a..6708b27b505 100644
--- a/src/bootstrap/bootstrap.py
+++ b/src/bootstrap/bootstrap.py
@@ -194,7 +194,8 @@ def default_build_triple(verbose):
     # being detected as GNU instead of MSVC.
     default_encoding = sys.getdefaultencoding()
     try:
-        version = subprocess.check_output(["rustc", "--version", "--verbose"])
+        version = subprocess.check_output(["rustc", "--version", "--verbose"],
+                stderr=subprocess.DEVNULL)
         version = version.decode(default_encoding)
         host = next(x for x in version.split('\n') if x.startswith("host: "))
         triple = host.split("host: ")[1]
@@ -1085,10 +1086,10 @@ def bootstrap(help_triggered):
     else:
         build.set_normal_environment()
 
+    build.build = args.build or build.build_triple()
     build.update_submodules()
 
     # Fetch/build the bootstrap
-    build.build = args.build or build.build_triple()
     build.download_stage0()
     sys.stdout.flush()
     build.ensure_vendored()
diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs
index 18683f6809f..8a49fe0228c 100644
--- a/src/librustdoc/clean/types.rs
+++ b/src/librustdoc/clean/types.rs
@@ -1436,8 +1436,7 @@ impl Type {
             Array(..) => PrimitiveType::Array,
             RawPointer(..) => PrimitiveType::RawPointer,
             QPath { ref self_type, .. } => return self_type.inner_def_id(cache),
-            // FIXME: remove this wildcard
-            _ => return None,
+            Generic(_) | Infer | ImplTrait(_) => return None,
         };
         cache.and_then(|c| Primitive(t).def_id_full(c))
     }
diff --git a/src/librustdoc/config.rs b/src/librustdoc/config.rs
index 95c6989dab4..63a25e5dbfb 100644
--- a/src/librustdoc/config.rs
+++ b/src/librustdoc/config.rs
@@ -35,6 +35,12 @@ crate enum OutputFormat {
     Html,
 }
 
+impl Default for OutputFormat {
+    fn default() -> OutputFormat {
+        OutputFormat::Html
+    }
+}
+
 impl OutputFormat {
     crate fn is_json(&self) -> bool {
         matches!(self, OutputFormat::Json)
@@ -118,7 +124,7 @@ crate struct Options {
     crate enable_per_target_ignores: bool,
 
     /// The path to a rustc-like binary to build tests with. If not set, we
-    /// default to loading from $sysroot/bin/rustc.
+    /// default to loading from `$sysroot/bin/rustc`.
     crate test_builder: Option<PathBuf>,
 
     // Options that affect the documentation process
@@ -142,8 +148,10 @@ crate struct Options {
     crate crate_version: Option<String>,
     /// Collected options specific to outputting final pages.
     crate render_options: RenderOptions,
-    /// Output format rendering (used only for "show-coverage" option for the moment)
-    crate output_format: Option<OutputFormat>,
+    /// The format that we output when rendering.
+    ///
+    /// Currently used only for the `--show-coverage` option.
+    crate output_format: OutputFormat,
     /// If this option is set to `true`, rustdoc will only run checks and not generate
     /// documentation.
     crate run_check: bool,
@@ -271,7 +279,7 @@ crate struct RenderInfo {
     crate deref_trait_did: Option<DefId>,
     crate deref_mut_trait_did: Option<DefId>,
     crate owned_box_did: Option<DefId>,
-    crate output_format: Option<OutputFormat>,
+    crate output_format: OutputFormat,
 }
 
 impl Options {
@@ -537,28 +545,28 @@ impl Options {
 
         let output_format = match matches.opt_str("output-format") {
             Some(s) => match OutputFormat::try_from(s.as_str()) {
-                Ok(o) => {
-                    if o.is_json()
+                Ok(out_fmt) => {
+                    if out_fmt.is_json()
                         && !(show_coverage || nightly_options::match_is_nightly_build(matches))
                     {
                         diag.struct_err("json output format isn't supported for doc generation")
                             .emit();
                         return Err(1);
-                    } else if !o.is_json() && show_coverage {
+                    } else if !out_fmt.is_json() && show_coverage {
                         diag.struct_err(
                             "html output format isn't supported for the --show-coverage option",
                         )
                         .emit();
                         return Err(1);
                     }
-                    Some(o)
+                    out_fmt
                 }
                 Err(e) => {
                     diag.struct_err(&e).emit();
                     return Err(1);
                 }
             },
-            None => None,
+            None => OutputFormat::default(),
         };
         let crate_name = matches.opt_str("crate-name");
         let proc_macro_crate = crate_types.contains(&CrateType::ProcMacro);
diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs
index 8eea102fa2f..aa18684aea1 100644
--- a/src/librustdoc/core.rs
+++ b/src/librustdoc/core.rs
@@ -463,7 +463,7 @@ crate fn run_global_ctxt(
     mut default_passes: passes::DefaultPassOption,
     mut manual_passes: Vec<String>,
     render_options: RenderOptions,
-    output_format: Option<OutputFormat>,
+    output_format: OutputFormat,
 ) -> (clean::Crate, RenderInfo, RenderOptions) {
     // Certain queries assume that some checks were run elsewhere
     // (see https://github.com/rust-lang/rust/pull/73566#issuecomment-656954425),
diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs
index c61cbf78f77..e98cb237635 100644
--- a/src/librustdoc/lib.rs
+++ b/src/librustdoc/lib.rs
@@ -578,7 +578,7 @@ fn main_options(options: config::Options) -> MainResult {
                 let (error_format, edition, debugging_options) = diag_opts;
                 let diag = core::new_handler(error_format, None, &debugging_options);
                 match output_format {
-                    None | Some(config::OutputFormat::Html) => sess.time("render_html", || {
+                    config::OutputFormat::Html => sess.time("render_html", || {
                         run_renderer::<html::render::Context<'_>>(
                             krate,
                             render_opts,
@@ -588,7 +588,7 @@ fn main_options(options: config::Options) -> MainResult {
                             tcx,
                         )
                     }),
-                    Some(config::OutputFormat::Json) => sess.time("render_json", || {
+                    config::OutputFormat::Json => sess.time("render_json", || {
                         run_renderer::<json::JsonRenderer<'_>>(
                             krate,
                             render_opts,
diff --git a/src/librustdoc/passes/calculate_doc_coverage.rs b/src/librustdoc/passes/calculate_doc_coverage.rs
index 61e14c05222..cdbff62d064 100644
--- a/src/librustdoc/passes/calculate_doc_coverage.rs
+++ b/src/librustdoc/passes/calculate_doc_coverage.rs
@@ -132,7 +132,7 @@ impl<'a, 'b> CoverageCalculator<'a, 'b> {
 
     fn print_results(&self) {
         let output_format = self.ctx.renderinfo.borrow().output_format;
-        if output_format.map(|o| o.is_json()).unwrap_or_else(|| false) {
+        if output_format.is_json() {
             println!("{}", self.to_json());
             return;
         }
diff --git a/src/test/codegen/abi-repr-ext.rs b/src/test/codegen/abi-repr-ext.rs
new file mode 100644
index 00000000000..f93ccd79411
--- /dev/null
+++ b/src/test/codegen/abi-repr-ext.rs
@@ -0,0 +1,13 @@
+#![crate_type="lib"]
+
+#[repr(i8)]
+pub enum Type {
+    Type1 = 0,
+    Type2 = 1
+}
+
+// CHECK: define signext i8 @test()
+#[no_mangle]
+pub extern "C" fn test() -> Type {
+    Type::Type1
+}
diff --git a/src/test/ui/borrowck/borrowck-assign-to-subfield.rs b/src/test/ui/borrowck/borrowck-assign-to-subfield.rs
index 050d702b625..dfa3a561ec7 100644
--- a/src/test/ui/borrowck/borrowck-assign-to-subfield.rs
+++ b/src/test/ui/borrowck/borrowck-assign-to-subfield.rs
@@ -1,5 +1,6 @@
 // run-pass
 // pretty-expanded FIXME #23616
+#![allow(dead_code)]
 
 pub fn main() {
     struct A {
diff --git a/src/test/ui/cfg/assume-incomplete-release/assume-incomplete.rs b/src/test/ui/cfg/assume-incomplete-release/assume-incomplete.rs
new file mode 100644
index 00000000000..24d2dc64551
--- /dev/null
+++ b/src/test/ui/cfg/assume-incomplete-release/assume-incomplete.rs
@@ -0,0 +1,38 @@
+// run-pass
+// aux-build:ver-cfg-rel.rs
+// revisions: assume no_assume
+// [assume]compile-flags: -Z assume-incomplete-release
+
+#![feature(cfg_version)]
+
+extern crate ver_cfg_rel;
+
+use ver_cfg_rel::ver_cfg_rel;
+
+#[ver_cfg_rel("-2")]
+fn foo_2() { }
+
+#[ver_cfg_rel("-1")]
+fn foo_1() { }
+
+#[cfg(assume)]
+#[ver_cfg_rel("0")]
+fn foo() { compile_error!("wrong+0") }
+
+#[cfg(no_assume)]
+#[ver_cfg_rel("0")]
+fn foo() { }
+
+#[ver_cfg_rel("1")]
+fn bar() { compile_error!("wrong+1") }
+
+#[ver_cfg_rel("2")]
+fn bar() { compile_error!("wrong+2") }
+
+fn main() {
+    foo_2();
+    foo_1();
+
+    #[cfg(no_assume)]
+    foo();
+}
diff --git a/src/test/ui/cfg/assume-incomplete-release/auxiliary/ver-cfg-rel.rs b/src/test/ui/cfg/assume-incomplete-release/auxiliary/ver-cfg-rel.rs
new file mode 100644
index 00000000000..6787527027e
--- /dev/null
+++ b/src/test/ui/cfg/assume-incomplete-release/auxiliary/ver-cfg-rel.rs
@@ -0,0 +1,56 @@
+// force-host
+// no-prefer-dynamic
+
+#![crate_type = "proc-macro"]
+
+extern crate proc_macro;
+use proc_macro::{TokenStream, TokenTree as Tt};
+use std::str::FromStr;
+
+// String containing the current version number of the tip, i.e. "1.41.2"
+static VERSION_NUMBER: &str = include_str!("../../../../../version");
+
+#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
+struct Version {
+    major: i16,
+    minor: i16,
+    patch: i16,
+}
+
+fn parse_version(s: &str) -> Option<Version> {
+    let mut digits = s.splitn(3, '.');
+    let major = digits.next()?.parse().ok()?;
+    let minor = digits.next()?.parse().ok()?;
+    let patch = digits.next().unwrap_or("0").trim().parse().ok()?;
+    Some(Version { major, minor, patch })
+}
+
+#[proc_macro_attribute]
+/// Emits a #[cfg(version)] relative to the current one, so passing
+/// -1 as argument on compiler 1.50 will emit #[cfg(version("1.49.0"))],
+/// while 1 will emit #[cfg(version("1.51.0"))]
+pub fn ver_cfg_rel(attr: TokenStream, input: TokenStream) -> TokenStream {
+    let mut v_rel = None;
+    for a in attr.into_iter() {
+        match a {
+            Tt::Literal(l) => {
+                let mut s = l.to_string();
+                let s = s.trim_matches('"');
+                let v: i16 = s.parse().unwrap();
+                v_rel = Some(v);
+                break;
+            },
+            _ => panic!("{:?}", a),
+        }
+    }
+    let v_rel = v_rel.unwrap();
+
+    let mut v = parse_version(VERSION_NUMBER).unwrap();
+    v.minor += v_rel;
+
+    let attr_str = format!("#[cfg(version(\"{}.{}.{}\"))]", v.major, v.minor, v.patch);
+    let mut res = Vec::<Tt>::new();
+    res.extend(TokenStream::from_str(&attr_str).unwrap().into_iter());
+    res.extend(input.into_iter());
+    res.into_iter().collect()
+}
diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/fru_syntax.rs b/src/test/ui/closures/2229_closure_analysis/run_pass/fru_syntax.rs
new file mode 100644
index 00000000000..e89cf4550c1
--- /dev/null
+++ b/src/test/ui/closures/2229_closure_analysis/run_pass/fru_syntax.rs
@@ -0,0 +1,46 @@
+// run-pass
+
+// Test that functional record update/struct update syntax works inside
+// a closure when the feature `capture_disjoint_fields` is enabled.
+
+#![feature(capture_disjoint_fields)]
+//~^ WARNING: the feature `capture_disjoint_fields` is incomplete
+//~| NOTE: `#[warn(incomplete_features)]` on by default
+//~| NOTE: see issue #53488 <https://github.com/rust-lang/rust/issues/53488>
+
+#[derive(Clone)]
+struct S {
+    a: String,
+    b: String,
+}
+
+struct T {
+    a: String,
+    s: S,
+}
+
+fn main() {
+    let a = String::new();
+    let b = String::new();
+    let c = String::new();
+    let s = S {a, b};
+    let t = T {
+        a: c,
+        s: s.clone()
+    };
+
+    let c = || {
+        let s2 = S {
+            a: format!("New s2"),
+            ..s
+        };
+        let s3 = S {
+            a: format!("New s3"),
+            ..t.s
+        };
+        println!("{} {}", s2.a, s2.b);
+        println!("{} {} {}", s3.a, s3.b, t.a);
+    };
+
+    c();
+}
diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/fru_syntax.stderr b/src/test/ui/closures/2229_closure_analysis/run_pass/fru_syntax.stderr
new file mode 100644
index 00000000000..7ed73abba86
--- /dev/null
+++ b/src/test/ui/closures/2229_closure_analysis/run_pass/fru_syntax.stderr
@@ -0,0 +1,11 @@
+warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/fru_syntax.rs:6:12
+   |
+LL | #![feature(capture_disjoint_fields)]
+   |            ^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: `#[warn(incomplete_features)]` on by default
+   = note: see issue #53488 <https://github.com/rust-lang/rust/issues/53488> for more information
+
+warning: 1 warning emitted
+
diff --git a/src/test/ui/consts/min_const_fn/allow_raw_ptr_dereference_const_fn.rs b/src/test/ui/consts/min_const_fn/allow_raw_ptr_dereference_const_fn.rs
index 25dc457d144..f4279e6b825 100644
--- a/src/test/ui/consts/min_const_fn/allow_raw_ptr_dereference_const_fn.rs
+++ b/src/test/ui/consts/min_const_fn/allow_raw_ptr_dereference_const_fn.rs
@@ -1,11 +1,10 @@
 // check-pass
 #![feature(const_raw_ptr_deref)]
-#![feature(raw_ref_macros)]
 
 use std::ptr;
 
 const fn test_fn(x: *const i32) {
-    let x2 = unsafe { ptr::raw_const!(*x) };
+    let x2 = unsafe { ptr::addr_of!(*x) };
 }
 
 fn main() {}
diff --git a/src/test/ui/consts/ptr_comparisons.rs b/src/test/ui/consts/ptr_comparisons.rs
index 595ed30bf9c..f16f6fd6de4 100644
--- a/src/test/ui/consts/ptr_comparisons.rs
+++ b/src/test/ui/consts/ptr_comparisons.rs
@@ -9,8 +9,7 @@
     core_intrinsics,
     const_raw_ptr_comparison,
     const_ptr_offset,
-    const_raw_ptr_deref,
-    raw_ref_macros
+    const_raw_ptr_deref
 )]
 
 const FOO: &usize = &42;
@@ -64,7 +63,7 @@ const _: *const usize = unsafe { (FOO as *const usize).offset(2) };
 
 const _: *const u8 =
 //~^ NOTE
-    unsafe { std::ptr::raw_const!((*(FOO as *const usize as *const [u8; 1000]))[999]) };
+    unsafe { std::ptr::addr_of!((*(FOO as *const usize as *const [u8; 1000]))[999]) };
 //~^ ERROR any use of this value will cause an error
 //~| NOTE
 
diff --git a/src/test/ui/consts/ptr_comparisons.stderr b/src/test/ui/consts/ptr_comparisons.stderr
index 49511b84500..96b63c0acb0 100644
--- a/src/test/ui/consts/ptr_comparisons.stderr
+++ b/src/test/ui/consts/ptr_comparisons.stderr
@@ -6,9 +6,9 @@ LL |         unsafe { intrinsics::offset(self, count) }
    |                  |
    |                  inbounds test failed: pointer must be in-bounds at offset $TWO_WORDS, but is outside bounds of alloc2 which has size $WORD
    |                  inside `ptr::const_ptr::<impl *const usize>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
-   |                  inside `_` at $DIR/ptr_comparisons.rs:62:34
+   |                  inside `_` at $DIR/ptr_comparisons.rs:61:34
    | 
-  ::: $DIR/ptr_comparisons.rs:62:1
+  ::: $DIR/ptr_comparisons.rs:61:1
    |
 LL | const _: *const usize = unsafe { (FOO as *const usize).offset(2) };
    | -------------------------------------------------------------------
@@ -16,17 +16,17 @@ LL | const _: *const usize = unsafe { (FOO as *const usize).offset(2) };
    = note: `#[deny(const_err)]` on by default
 
 error: any use of this value will cause an error
-  --> $DIR/ptr_comparisons.rs:67:35
+  --> $DIR/ptr_comparisons.rs:66:33
    |
 LL | / const _: *const u8 =
 LL | |
-LL | |     unsafe { std::ptr::raw_const!((*(FOO as *const usize as *const [u8; 1000]))[999]) };
-   | |___________________________________^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___-
-   |                                     |
-   |                                     memory access failed: pointer must be in-bounds at offset 1000, but is outside bounds of alloc2 which has size $WORD
+LL | |     unsafe { std::ptr::addr_of!((*(FOO as *const usize as *const [u8; 1000]))[999]) };
+   | |_________________________________^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___-
+   |                                   |
+   |                                   memory access failed: pointer must be in-bounds at offset 1000, but is outside bounds of alloc2 which has size $WORD
 
 error: any use of this value will cause an error
-  --> $DIR/ptr_comparisons.rs:71:27
+  --> $DIR/ptr_comparisons.rs:70:27
    |
 LL | const _: usize = unsafe { std::mem::transmute::<*const usize, usize>(FOO) + 4 };
    | --------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
@@ -34,7 +34,7 @@ LL | const _: usize = unsafe { std::mem::transmute::<*const usize, usize>(FOO) +
    |                           "pointer-to-integer cast" needs an rfc before being allowed inside constants
 
 error: any use of this value will cause an error
-  --> $DIR/ptr_comparisons.rs:76:27
+  --> $DIR/ptr_comparisons.rs:75:27
    |
 LL | const _: usize = unsafe { *std::mem::transmute::<&&usize, &usize>(&FOO) + 4 };
    | --------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
diff --git a/src/test/ui/lint/dead-code/write-only-field.rs b/src/test/ui/lint/dead-code/write-only-field.rs
new file mode 100644
index 00000000000..78cfcfda8f9
--- /dev/null
+++ b/src/test/ui/lint/dead-code/write-only-field.rs
@@ -0,0 +1,20 @@
+#![deny(dead_code)]
+
+struct S {
+    f: i32, //~ ERROR: field is never read
+    sub: Sub, //~ ERROR: field is never read
+}
+
+struct Sub {
+    f: i32, //~ ERROR: field is never read
+}
+
+fn field_write(s: &mut S) {
+    s.f = 1;
+    s.sub.f = 2;
+}
+
+fn main() {
+    let mut s = S { f: 0, sub: Sub { f: 0 } };
+    field_write(&mut s);
+}
diff --git a/src/test/ui/lint/dead-code/write-only-field.stderr b/src/test/ui/lint/dead-code/write-only-field.stderr
new file mode 100644
index 00000000000..70d2149665b
--- /dev/null
+++ b/src/test/ui/lint/dead-code/write-only-field.stderr
@@ -0,0 +1,26 @@
+error: field is never read: `f`
+  --> $DIR/write-only-field.rs:4:5
+   |
+LL |     f: i32,
+   |     ^^^^^^
+   |
+note: the lint level is defined here
+  --> $DIR/write-only-field.rs:1:9
+   |
+LL | #![deny(dead_code)]
+   |         ^^^^^^^^^
+
+error: field is never read: `sub`
+  --> $DIR/write-only-field.rs:5:5
+   |
+LL |     sub: Sub,
+   |     ^^^^^^^^
+
+error: field is never read: `f`
+  --> $DIR/write-only-field.rs:9:5
+   |
+LL |     f: i32,
+   |     ^^^^^^
+
+error: aborting due to 3 previous errors
+
diff --git a/src/tools/rustfmt b/src/tools/rustfmt
-Subproject 216a64300563351cad20bb3847110c14561687e
+Subproject ea268b9f559fbafcfc24f4982173b01dfad9e44