about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2017-06-16 14:41:15 +0000
committerbors <bors@rust-lang.org>2017-06-16 14:41:15 +0000
commitb40be00a0cac84d23f51c5c5109c8f824ab19ab3 (patch)
treeb0ccb328f6bc81c24818214b4a65185890d6abf4
parentebbc9ea914a1cefa48afb9cc6c9f7a14ff7c6857 (diff)
parentb34ac5dbdab8221a227238f2ec8089df3a2aa06d (diff)
downloadrust-b40be00a0cac84d23f51c5c5109c8f824ab19ab3.tar.gz
rust-b40be00a0cac84d23f51c5c5109c8f824ab19ab3.zip
Auto merge of #42612 - est31:master, r=nagisa
Autogenerate stubs and SUMMARY.md in the unstable book

Removes a speed bump in compiler development by autogenerating stubs for features in the unstable book. See #42454 for discussion.

The PR contains three commits, separated in order to make review easy:

* The first commit converts the tidy tool from a binary crate to a crate that contains both a library and a binary. In the second commit, we'll use the tidy library
* The second and main commit introduces autogeneration of SUMMARY.md and feature stub files
* The third commit turns off the tidy lint that checks for features without a stub, and removes the stub files. A separate commit due to the large number of files touched

Members of the doc team who wish to document some features can either do this (where `$rustsrc` is the root of the rust repo git checkout):

1. cd to `$rustsrc/src/tools/unstable-book-gen` and then do `cargo run $rustsrc/src $rustsrc/src/doc/unstable-book` to put the stubs into the unstable book
2. cd to `$rustsrc` and run `git ls-files --others --exclude-standard` to list the newly added stubs
3. choose a file to edit, then `git add` it and `git commit`
4. afterwards, remove all changes by the tool by doing `git --reset hard` and `git clean -f`

Or they can do this:

1. remove the comment marker in `src/tools/tidy/src/unstable_book.rs` line 122
2. run `./x.py test src/tools/tidy` to list the unstable features which only have stubs
3. revert the change in 1
3. document one of the chosen unstable features

The changes done by this PR also allow for further development:

* tidy obtains information about tracking issues. We can now forbid differing tracking issues between differing `#![unstable]` annotations. I haven't done this but plan to in a future PR
* we now have a general framework for generating stuff for the unstable book at build time. Further changes can autogenerate a list of the API a given library feature exposes.

The old way to simply click through the documentation after it has been uploaded to rust-lang.org works as well.

r? @nagisa

Fixes #42454
-rw-r--r--src/Cargo.lock7
-rw-r--r--src/Cargo.toml1
-rw-r--r--src/bootstrap/doc.rs27
-rw-r--r--src/bootstrap/lib.rs5
-rw-r--r--src/bootstrap/step.rs21
-rw-r--r--src/doc/unstable-book/src/language-features/abi-sysv64.md7
-rw-r--r--src/doc/unstable-book/src/language-features/abi-unadjusted.md6
-rw-r--r--src/doc/unstable-book/src/language-features/abi-vectorcall.md7
-rw-r--r--src/doc/unstable-book/src/language-features/abi-x86-interrupt.md7
-rw-r--r--src/doc/unstable-book/src/language-features/allow-internal-unstable.md6
-rw-r--r--src/doc/unstable-book/src/language-features/asm.md2
-rw-r--r--src/doc/unstable-book/src/language-features/associated-type-defaults.md10
-rw-r--r--src/doc/unstable-book/src/language-features/cfg-target-feature.md10
-rw-r--r--src/doc/unstable-book/src/language-features/cfg-target-has-atomic.md10
-rw-r--r--src/doc/unstable-book/src/language-features/cfg-target-thread-local.md10
-rw-r--r--src/doc/unstable-book/src/language-features/cfg-target-vendor.md10
-rw-r--r--src/doc/unstable-book/src/language-features/custom-attribute.md10
-rw-r--r--src/doc/unstable-book/src/language-features/custom-derive.md10
-rw-r--r--src/doc/unstable-book/src/language-features/decl-macro.md10
-rw-r--r--src/doc/unstable-book/src/language-features/default-type-parameter-fallback.md10
-rw-r--r--src/doc/unstable-book/src/language-features/drop-types-in-const.md10
-rw-r--r--src/doc/unstable-book/src/language-features/dropck-eyepatch.md10
-rw-r--r--src/doc/unstable-book/src/language-features/dropck-parametricity.md10
-rw-r--r--src/doc/unstable-book/src/language-features/exclusive-range-pattern.md10
-rw-r--r--src/doc/unstable-book/src/language-features/fundamental.md10
-rw-r--r--src/doc/unstable-book/src/language-features/generic-param-attrs.md10
-rw-r--r--src/doc/unstable-book/src/language-features/global-asm.md (renamed from src/doc/unstable-book/src/language-features/global_asm.md)0
-rw-r--r--src/doc/unstable-book/src/language-features/link-cfg.md10
-rw-r--r--src/doc/unstable-book/src/language-features/link-llvm-intrinsics.md10
-rw-r--r--src/doc/unstable-book/src/language-features/linkage.md10
-rw-r--r--src/doc/unstable-book/src/language-features/log-syntax.md10
-rw-r--r--src/doc/unstable-book/src/language-features/macro-reexport.md10
-rw-r--r--src/doc/unstable-book/src/language-features/main.md10
-rw-r--r--src/doc/unstable-book/src/language-features/naked-functions.md10
-rw-r--r--src/doc/unstable-book/src/language-features/needs-allocator.md10
-rw-r--r--src/doc/unstable-book/src/language-features/needs-panic-runtime.md10
-rw-r--r--src/doc/unstable-book/src/language-features/never-type.md10
-rw-r--r--src/doc/unstable-book/src/language-features/no-core.md10
-rw-r--r--src/doc/unstable-book/src/language-features/no-debug.md10
-rw-r--r--src/doc/unstable-book/src/language-features/omit-gdb-pretty-printer-section.md6
-rw-r--r--src/doc/unstable-book/src/language-features/optin-builtin-traits.md9
-rw-r--r--src/doc/unstable-book/src/language-features/overlapping-marker-traits.md7
-rw-r--r--src/doc/unstable-book/src/language-features/panic-runtime.md10
-rw-r--r--src/doc/unstable-book/src/language-features/placement-in-syntax.md10
-rw-r--r--src/doc/unstable-book/src/language-features/platform-intrinsics.md10
-rw-r--r--src/doc/unstable-book/src/language-features/prelude-import.md6
-rw-r--r--src/doc/unstable-book/src/language-features/quote.md10
-rw-r--r--src/doc/unstable-book/src/language-features/repr-align.md11
-rw-r--r--src/doc/unstable-book/src/language-features/repr-simd.md10
-rw-r--r--src/doc/unstable-book/src/language-features/rustc-attrs.md10
-rw-r--r--src/doc/unstable-book/src/language-features/rustc-diagnostic-macros.md6
-rw-r--r--src/doc/unstable-book/src/language-features/sanitizer-runtime.md6
-rw-r--r--src/doc/unstable-book/src/language-features/simd-ffi.md10
-rw-r--r--src/doc/unstable-book/src/language-features/simd.md10
-rw-r--r--src/doc/unstable-book/src/language-features/specialization.md10
-rw-r--r--src/doc/unstable-book/src/language-features/staged-api.md6
-rw-r--r--src/doc/unstable-book/src/language-features/start.md10
-rw-r--r--src/doc/unstable-book/src/language-features/static-nobundle.md10
-rw-r--r--src/doc/unstable-book/src/language-features/stmt-expr-attributes.md10
-rw-r--r--src/doc/unstable-book/src/language-features/structural-match.md10
-rw-r--r--src/doc/unstable-book/src/language-features/target-feature.md6
-rw-r--r--src/doc/unstable-book/src/language-features/thread-local.md10
-rw-r--r--src/doc/unstable-book/src/language-features/trace-macros.md10
-rw-r--r--src/doc/unstable-book/src/language-features/type-ascription.md10
-rw-r--r--src/doc/unstable-book/src/language-features/unboxed-closures.md10
-rw-r--r--src/doc/unstable-book/src/language-features/untagged-unions.md10
-rw-r--r--src/doc/unstable-book/src/language-features/unwind-attributes.md6
-rw-r--r--src/doc/unstable-book/src/language-features/use-extern-macros.md10
-rw-r--r--src/doc/unstable-book/src/library-features/alloc.md7
-rw-r--r--src/doc/unstable-book/src/library-features/as-c-str.md8
-rw-r--r--src/doc/unstable-book/src/library-features/ascii-ctype.md5
-rw-r--r--src/doc/unstable-book/src/library-features/box-heap.md7
-rw-r--r--src/doc/unstable-book/src/library-features/char-escape-debug.md7
-rw-r--r--src/doc/unstable-book/src/library-features/coerce-unsized.md7
-rw-r--r--src/doc/unstable-book/src/library-features/collection-placement.md7
-rw-r--r--src/doc/unstable-book/src/library-features/collections-range.md7
-rw-r--r--src/doc/unstable-book/src/library-features/command-envs.md7
-rw-r--r--src/doc/unstable-book/src/library-features/concat-idents-macro.md7
-rw-r--r--src/doc/unstable-book/src/library-features/core-char-ext.md7
-rw-r--r--src/doc/unstable-book/src/library-features/core-float.md7
-rw-r--r--src/doc/unstable-book/src/library-features/core-slice-ext.md7
-rw-r--r--src/doc/unstable-book/src/library-features/core-str-ext.md7
-rw-r--r--src/doc/unstable-book/src/library-features/decode-utf8.md7
-rw-r--r--src/doc/unstable-book/src/library-features/discriminant-value.md7
-rw-r--r--src/doc/unstable-book/src/library-features/error-type-id.md7
-rw-r--r--src/doc/unstable-book/src/library-features/exact-size-is-empty.md7
-rw-r--r--src/doc/unstable-book/src/library-features/fixed-size-array.md7
-rw-r--r--src/doc/unstable-book/src/library-features/float-bits-conv.md7
-rw-r--r--src/doc/unstable-book/src/library-features/fmt-flags-align.md7
-rw-r--r--src/doc/unstable-book/src/library-features/fn-traits.md7
-rw-r--r--src/doc/unstable-book/src/library-features/fnbox.md7
-rw-r--r--src/doc/unstable-book/src/library-features/from_utf8_error_as_bytes.md7
-rw-r--r--src/doc/unstable-book/src/library-features/fused.md7
-rw-r--r--src/doc/unstable-book/src/library-features/get-type-id.md7
-rw-r--r--src/doc/unstable-book/src/library-features/heap-api.md7
-rw-r--r--src/doc/unstable-book/src/library-features/i128.md7
-rw-r--r--src/doc/unstable-book/src/library-features/inclusive-range.md7
-rw-r--r--src/doc/unstable-book/src/library-features/integer-atomics.md7
-rw-r--r--src/doc/unstable-book/src/library-features/into-boxed-c-str.md7
-rw-r--r--src/doc/unstable-book/src/library-features/into-boxed-os-str.md7
-rw-r--r--src/doc/unstable-book/src/library-features/into-boxed-path.md7
-rw-r--r--src/doc/unstable-book/src/library-features/io.md7
-rw-r--r--src/doc/unstable-book/src/library-features/ip.md7
-rw-r--r--src/doc/unstable-book/src/library-features/iter-rfind.md7
-rw-r--r--src/doc/unstable-book/src/library-features/iterator-step-by.md7
-rw-r--r--src/doc/unstable-book/src/library-features/linked-list-extras.md7
-rw-r--r--src/doc/unstable-book/src/library-features/lookup-host.md7
-rw-r--r--src/doc/unstable-book/src/library-features/manually-drop.md0
-rw-r--r--src/doc/unstable-book/src/library-features/mpsc-select.md5
-rw-r--r--src/doc/unstable-book/src/library-features/needs-drop.md7
-rw-r--r--src/doc/unstable-book/src/library-features/never-type-impls.md7
-rw-r--r--src/doc/unstable-book/src/library-features/nonzero.md7
-rw-r--r--src/doc/unstable-book/src/library-features/offset-to.md7
-rw-r--r--src/doc/unstable-book/src/library-features/once-poison.md7
-rw-r--r--src/doc/unstable-book/src/library-features/oom.md7
-rw-r--r--src/doc/unstable-book/src/library-features/option-entry.md7
-rw-r--r--src/doc/unstable-book/src/library-features/ord-max-min.md7
-rw-r--r--src/doc/unstable-book/src/library-features/osstring-shrink-to-fit.md7
-rw-r--r--src/doc/unstable-book/src/library-features/panic-abort.md7
-rw-r--r--src/doc/unstable-book/src/library-features/panic-unwind.md7
-rw-r--r--src/doc/unstable-book/src/library-features/pattern.md7
-rw-r--r--src/doc/unstable-book/src/library-features/placement-in.md7
-rw-r--r--src/doc/unstable-book/src/library-features/placement-new-protocol.md7
-rw-r--r--src/doc/unstable-book/src/library-features/proc-macro-internals.md7
-rw-r--r--src/doc/unstable-book/src/library-features/range-contains.md7
-rw-r--r--src/doc/unstable-book/src/library-features/raw.md7
-rw-r--r--src/doc/unstable-book/src/library-features/reverse-cmp-key.md7
-rw-r--r--src/doc/unstable-book/src/library-features/rustc-private.md7
-rw-r--r--src/doc/unstable-book/src/library-features/shared.md7
-rw-r--r--src/doc/unstable-book/src/library-features/sip-hash-13.md7
-rw-r--r--src/doc/unstable-book/src/library-features/slice-concat-ext.md7
-rw-r--r--src/doc/unstable-book/src/library-features/slice-get-slice.md7
-rw-r--r--src/doc/unstable-book/src/library-features/slice-rotate.md7
-rw-r--r--src/doc/unstable-book/src/library-features/step-by.md7
-rw-r--r--src/doc/unstable-book/src/library-features/step-trait.md7
-rw-r--r--src/doc/unstable-book/src/library-features/str-box-extras.md9
-rw-r--r--src/doc/unstable-book/src/library-features/str-checked-slicing.md7
-rw-r--r--src/doc/unstable-book/src/library-features/str-escape.md7
-rw-r--r--src/doc/unstable-book/src/library-features/str-mut-extras.md8
-rw-r--r--src/doc/unstable-book/src/library-features/thread-id.md7
-rw-r--r--src/doc/unstable-book/src/library-features/thread-local-state.md7
-rw-r--r--src/doc/unstable-book/src/library-features/toowned-clone-into.md7
-rw-r--r--src/doc/unstable-book/src/library-features/trusted-len.md7
-rw-r--r--src/doc/unstable-book/src/library-features/try-from.md7
-rw-r--r--src/doc/unstable-book/src/library-features/unicode.md7
-rw-r--r--src/doc/unstable-book/src/library-features/unique.md7
-rw-r--r--src/doc/unstable-book/src/library-features/unsize.md7
-rw-r--r--src/doc/unstable-book/src/library-features/utf8-error-error-len.md7
-rw-r--r--src/doc/unstable-book/src/library-features/vec-remove-item.md7
-rw-r--r--src/doc/unstable-book/src/library-features/vec-resize-default.md7
-rw-r--r--src/tools/tidy/src/features.rs66
-rw-r--r--src/tools/tidy/src/lib.rs88
-rw-r--r--src/tools/tidy/src/main.rs80
-rw-r--r--src/tools/tidy/src/unstable_book.rs79
-rw-r--r--src/tools/unstable-book-gen/Cargo.toml9
-rw-r--r--src/tools/unstable-book-gen/src/SUMMARY.md8
-rw-r--r--src/tools/unstable-book-gen/src/main.rs149
-rw-r--r--src/tools/unstable-book-gen/src/stub-issue.md7
-rw-r--r--src/tools/unstable-book-gen/src/stub-no-issue.md5
159 files changed, 420 insertions, 1263 deletions
diff --git a/src/Cargo.lock b/src/Cargo.lock
index 5de710b68bb..9fae4b7e924 100644
--- a/src/Cargo.lock
+++ b/src/Cargo.lock
@@ -1893,6 +1893,13 @@ dependencies = [
 ]
 
 [[package]]
+name = "unstable-book-gen"
+version = "0.1.0"
+dependencies = [
+ "tidy 0.1.0",
+]
+
+[[package]]
 name = "url"
 version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/src/Cargo.toml b/src/Cargo.toml
index 85a6df3573a..8efa484287a 100644
--- a/src/Cargo.toml
+++ b/src/Cargo.toml
@@ -9,6 +9,7 @@ members = [
   "tools/error_index_generator",
   "tools/linkchecker",
   "tools/rustbook",
+  "tools/unstable-book-gen",
   "tools/tidy",
   "tools/build-manifest",
   "tools/remote-test-client",
diff --git a/src/bootstrap/doc.rs b/src/bootstrap/doc.rs
index fc75b6ff5c3..23a38f6a896 100644
--- a/src/bootstrap/doc.rs
+++ b/src/bootstrap/doc.rs
@@ -27,18 +27,26 @@ use {Build, Compiler, Mode};
 use util::{cp_r, symlink_dir};
 use build_helper::up_to_date;
 
-/// Invoke `rustbook` as compiled in `stage` for `target` for the doc book
-/// `name` into the `out` path.
+/// Invoke `rustbook` for `target` for the doc book `name`.
 ///
 /// This will not actually generate any documentation if the documentation has
 /// already been generated.
 pub fn rustbook(build: &Build, target: &str, name: &str) {
+    let src = build.src.join("src/doc");
+    rustbook_src(build, target, name, &src);
+}
+
+/// Invoke `rustbook` for `target` for the doc book `name` from the `src` path.
+///
+/// This will not actually generate any documentation if the documentation has
+/// already been generated.
+pub fn rustbook_src(build: &Build, target: &str, name: &str, src: &Path) {
     let out = build.doc_out(target);
     t!(fs::create_dir_all(&out));
 
     let out = out.join(name);
     let compiler = Compiler::new(0, &build.config.build);
-    let src = build.src.join("src/doc").join(name);
+    let src = src.join(name);
     let index = out.join("index.html");
     let rustbook = build.tool(&compiler, "rustbook");
     if up_to_date(&src, &index) && up_to_date(&rustbook, &index) {
@@ -354,6 +362,19 @@ pub fn error_index(build: &Build, target: &str) {
     build.run(&mut index);
 }
 
+pub fn unstable_book_gen(build: &Build, target: &str) {
+    println!("Generating unstable book md files ({})", target);
+    let out = build.md_doc_out(target).join("unstable-book");
+    t!(fs::create_dir_all(&out));
+    t!(fs::remove_dir_all(&out));
+    let compiler = Compiler::new(0, &build.config.build);
+    let mut cmd = build.tool_cmd(&compiler, "unstable-book-gen");
+    cmd.arg(build.src.join("src"));
+    cmd.arg(out);
+
+    build.run(&mut cmd);
+}
+
 fn symlink_dir_force(src: &Path, dst: &Path) -> io::Result<()> {
     if let Ok(m) = fs::symlink_metadata(dst) {
         if m.file_type().is_dir() {
diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs
index c8cd71f8f28..e0e6583b935 100644
--- a/src/bootstrap/lib.rs
+++ b/src/bootstrap/lib.rs
@@ -680,6 +680,11 @@ impl Build {
         self.out.join(target).join("doc")
     }
 
+    /// Output directory for some generated md crate documentation for a target (temporary)
+    fn md_doc_out(&self, target: &str) -> PathBuf {
+        self.out.join(target).join("md-doc")
+    }
+
     /// Output directory for all crate documentation for a target (temporary)
     ///
     /// The artifacts here are then copied into `doc_out` above.
diff --git a/src/bootstrap/step.rs b/src/bootstrap/step.rs
index 8c366200267..5f0724c6577 100644
--- a/src/bootstrap/step.rs
+++ b/src/bootstrap/step.rs
@@ -548,6 +548,10 @@ pub fn build_rules<'a>(build: &'a Build) -> Rules {
          .dep(|s| s.name("maybe-clean-tools"))
          .dep(|s| s.name("librustc-tool"))
          .run(move |s| compile::tool(build, s.stage, s.target, "error_index_generator"));
+    rules.build("tool-unstable-book-gen", "src/tools/unstable-book-gen")
+         .dep(|s| s.name("maybe-clean-tools"))
+         .dep(|s| s.name("libstd-tool"))
+         .run(move |s| compile::tool(build, s.stage, s.target, "unstable-book-gen"));
     rules.build("tool-tidy", "src/tools/tidy")
          .dep(|s| s.name("maybe-clean-tools"))
          .dep(|s| s.name("libstd-tool"))
@@ -662,8 +666,12 @@ pub fn build_rules<'a>(build: &'a Build) -> Rules {
               .target(&build.config.build)
               .stage(0)
          })
+         .dep(move |s| s.name("doc-unstable-book-gen"))
          .default(build.config.docs)
-         .run(move |s| doc::rustbook(build, s.target, "unstable-book"));
+         .run(move |s| doc::rustbook_src(build,
+                                         s.target,
+                                         "unstable-book",
+                                         &build.md_doc_out(s.target)));
     rules.doc("doc-standalone", "src/doc")
          .dep(move |s| {
              s.name("rustc")
@@ -679,6 +687,17 @@ pub fn build_rules<'a>(build: &'a Build) -> Rules {
          .default(build.config.docs)
          .host(true)
          .run(move |s| doc::error_index(build, s.target));
+    rules.doc("doc-unstable-book-gen", "src/tools/unstable-book-gen")
+         .dep(move |s| {
+             s.name("tool-unstable-book-gen")
+              .host(&build.config.build)
+              .target(&build.config.build)
+              .stage(0)
+         })
+         .dep(move |s| s.name("libstd-link"))
+         .default(build.config.docs)
+         .host(true)
+         .run(move |s| doc::unstable_book_gen(build, s.target));
     for (krate, path, default) in krates("std") {
         rules.doc(&krate.doc_step, path)
              .dep(|s| s.name("libstd-link"))
diff --git a/src/doc/unstable-book/src/language-features/abi-sysv64.md b/src/doc/unstable-book/src/language-features/abi-sysv64.md
deleted file mode 100644
index 27f61d56342..00000000000
--- a/src/doc/unstable-book/src/language-features/abi-sysv64.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `abi_sysv64`
-
-The tracking issue for this feature is: [#36167]
-
-[#36167]: https://github.com/rust-lang/rust/issues/36167
-
-------------------------
diff --git a/src/doc/unstable-book/src/language-features/abi-unadjusted.md b/src/doc/unstable-book/src/language-features/abi-unadjusted.md
deleted file mode 100644
index 2e3113abdbf..00000000000
--- a/src/doc/unstable-book/src/language-features/abi-unadjusted.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# `abi_unadjusted`
-
-The tracking issue for this feature is: none.
-
-------------------------
-
diff --git a/src/doc/unstable-book/src/language-features/abi-vectorcall.md b/src/doc/unstable-book/src/language-features/abi-vectorcall.md
deleted file mode 100644
index 3e36b1569fd..00000000000
--- a/src/doc/unstable-book/src/language-features/abi-vectorcall.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `abi_vectorcall`
-
-The tracking issue for this feature is: none.
-
-------------------------
-
-
diff --git a/src/doc/unstable-book/src/language-features/abi-x86-interrupt.md b/src/doc/unstable-book/src/language-features/abi-x86-interrupt.md
deleted file mode 100644
index c89d2ee2106..00000000000
--- a/src/doc/unstable-book/src/language-features/abi-x86-interrupt.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `abi_x86_interrupt`
-
-The tracking issue for this feature is: [#40180]
-
-[#40180]: https://github.com/rust-lang/rust/issues/40180
-
-------------------------
diff --git a/src/doc/unstable-book/src/language-features/allow-internal-unstable.md b/src/doc/unstable-book/src/language-features/allow-internal-unstable.md
deleted file mode 100644
index 74709ad5aeb..00000000000
--- a/src/doc/unstable-book/src/language-features/allow-internal-unstable.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# `allow_internal_unstable`
-
-The tracking issue for this feature is: None.
-
-------------------------
-
diff --git a/src/doc/unstable-book/src/language-features/asm.md b/src/doc/unstable-book/src/language-features/asm.md
index 8deb8f46256..f22095fe5de 100644
--- a/src/doc/unstable-book/src/language-features/asm.md
+++ b/src/doc/unstable-book/src/language-features/asm.md
@@ -190,4 +190,4 @@ constraints, etc.
 [llvm-docs]: http://llvm.org/docs/LangRef.html#inline-assembler-expressions
 
 If you need more power and don't mind losing some of the niceties of
-`asm!`, check out [global_asm](language-features/global_asm.html).
+`asm!`, check out [global_asm](language-features/global-asm.html).
diff --git a/src/doc/unstable-book/src/language-features/associated-type-defaults.md b/src/doc/unstable-book/src/language-features/associated-type-defaults.md
deleted file mode 100644
index 56cc8a5b306..00000000000
--- a/src/doc/unstable-book/src/language-features/associated-type-defaults.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `associated_type_defaults`
-
-The tracking issue for this feature is: [#29661]
-
-[#29661]: https://github.com/rust-lang/rust/issues/29661
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/cfg-target-feature.md b/src/doc/unstable-book/src/language-features/cfg-target-feature.md
deleted file mode 100644
index ddd88bdc2cb..00000000000
--- a/src/doc/unstable-book/src/language-features/cfg-target-feature.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `cfg_target_feature`
-
-The tracking issue for this feature is: [#29717]
-
-[#29717]: https://github.com/rust-lang/rust/issues/29717
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/cfg-target-has-atomic.md b/src/doc/unstable-book/src/language-features/cfg-target-has-atomic.md
deleted file mode 100644
index 7496e42e1cd..00000000000
--- a/src/doc/unstable-book/src/language-features/cfg-target-has-atomic.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `cfg_target_has_atomic`
-
-The tracking issue for this feature is: [#32976]
-
-[#32976]: https://github.com/rust-lang/rust/issues/32976
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/cfg-target-thread-local.md b/src/doc/unstable-book/src/language-features/cfg-target-thread-local.md
deleted file mode 100644
index a5adb38db3d..00000000000
--- a/src/doc/unstable-book/src/language-features/cfg-target-thread-local.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `cfg_target_thread_local`
-
-The tracking issue for this feature is: [#29594]
-
-[#29594]: https://github.com/rust-lang/rust/issues/29594
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/cfg-target-vendor.md b/src/doc/unstable-book/src/language-features/cfg-target-vendor.md
deleted file mode 100644
index ddd88bdc2cb..00000000000
--- a/src/doc/unstable-book/src/language-features/cfg-target-vendor.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `cfg_target_feature`
-
-The tracking issue for this feature is: [#29717]
-
-[#29717]: https://github.com/rust-lang/rust/issues/29717
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/custom-attribute.md b/src/doc/unstable-book/src/language-features/custom-attribute.md
deleted file mode 100644
index 838f09670d2..00000000000
--- a/src/doc/unstable-book/src/language-features/custom-attribute.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `custom_attribute`
-
-The tracking issue for this feature is: [#29642]
-
-[#29642]: https://github.com/rust-lang/rust/issues/29642
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/custom-derive.md b/src/doc/unstable-book/src/language-features/custom-derive.md
deleted file mode 100644
index d5fdd2b708b..00000000000
--- a/src/doc/unstable-book/src/language-features/custom-derive.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `custom_derive`
-
-The tracking issue for this feature is: [#29644]
-
-[#29644]: https://github.com/rust-lang/rust/issues/29644
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/decl-macro.md b/src/doc/unstable-book/src/language-features/decl-macro.md
deleted file mode 100644
index 4700b252e2d..00000000000
--- a/src/doc/unstable-book/src/language-features/decl-macro.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `decl_macro`
-
-The tracking issue for this feature is: [#39412]
-
-[#39412]: https://github.com/rust-lang/rust/issues/39412
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/default-type-parameter-fallback.md b/src/doc/unstable-book/src/language-features/default-type-parameter-fallback.md
deleted file mode 100644
index fd16dbf8985..00000000000
--- a/src/doc/unstable-book/src/language-features/default-type-parameter-fallback.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `default_type_parameter_fallback`
-
-The tracking issue for this feature is: [#27336]
-
-[#27336]: https://github.com/rust-lang/rust/issues/27336
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/drop-types-in-const.md b/src/doc/unstable-book/src/language-features/drop-types-in-const.md
deleted file mode 100644
index b3367d0df44..00000000000
--- a/src/doc/unstable-book/src/language-features/drop-types-in-const.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `drop_types_in_const`
-
-The tracking issue for this feature is: [#33156]
-
-[#33156]: https://github.com/rust-lang/rust/issues/33156
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/dropck-eyepatch.md b/src/doc/unstable-book/src/language-features/dropck-eyepatch.md
deleted file mode 100644
index 2f189e9b645..00000000000
--- a/src/doc/unstable-book/src/language-features/dropck-eyepatch.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `dropck_eyepatch`
-
-The tracking issue for this feature is: [#34761]
-
-[#34761]: https://github.com/rust-lang/rust/issues/34761
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/dropck-parametricity.md b/src/doc/unstable-book/src/language-features/dropck-parametricity.md
deleted file mode 100644
index c5ae721954b..00000000000
--- a/src/doc/unstable-book/src/language-features/dropck-parametricity.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `dropck_parametricity`
-
-The tracking issue for this feature is: [#28498]
-
-[#28498]: https://github.com/rust-lang/rust/issues/28498
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/exclusive-range-pattern.md b/src/doc/unstable-book/src/language-features/exclusive-range-pattern.md
deleted file mode 100644
index b669ce83132..00000000000
--- a/src/doc/unstable-book/src/language-features/exclusive-range-pattern.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `exclusive_range_pattern`
-
-The tracking issue for this feature is: [#37854]
-
-[#37854]: https://github.com/rust-lang/rust/issues/37854
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/fundamental.md b/src/doc/unstable-book/src/language-features/fundamental.md
deleted file mode 100644
index a068dadf95d..00000000000
--- a/src/doc/unstable-book/src/language-features/fundamental.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `fundamental`
-
-The tracking issue for this feature is: [#29635]
-
-[#29635]: https://github.com/rust-lang/rust/issues/29635
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/generic-param-attrs.md b/src/doc/unstable-book/src/language-features/generic-param-attrs.md
deleted file mode 100644
index ba49c850e4d..00000000000
--- a/src/doc/unstable-book/src/language-features/generic-param-attrs.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `generic_param_attrs`
-
-The tracking issue for this feature is: [#34761]
-
-[#34761]: https://github.com/rust-lang/rust/issues/34761
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/global_asm.md b/src/doc/unstable-book/src/language-features/global-asm.md
index f1ef74a63b5..f1ef74a63b5 100644
--- a/src/doc/unstable-book/src/language-features/global_asm.md
+++ b/src/doc/unstable-book/src/language-features/global-asm.md
diff --git a/src/doc/unstable-book/src/language-features/link-cfg.md b/src/doc/unstable-book/src/language-features/link-cfg.md
deleted file mode 100644
index 7393d0628e4..00000000000
--- a/src/doc/unstable-book/src/language-features/link-cfg.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `link_cfg`
-
-The tracking issue for this feature is: [#37406]
-
-[#37406]: https://github.com/rust-lang/rust/issues/37406
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/link-llvm-intrinsics.md b/src/doc/unstable-book/src/language-features/link-llvm-intrinsics.md
deleted file mode 100644
index ba639cb57fc..00000000000
--- a/src/doc/unstable-book/src/language-features/link-llvm-intrinsics.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `link_llvm_intrinsics`
-
-The tracking issue for this feature is: [#29602]
-
-[#29602]: https://github.com/rust-lang/rust/issues/29602
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/linkage.md b/src/doc/unstable-book/src/language-features/linkage.md
deleted file mode 100644
index 5773d28a00e..00000000000
--- a/src/doc/unstable-book/src/language-features/linkage.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `linkage`
-
-The tracking issue for this feature is: [#29603]
-
-[#29603]: https://github.com/rust-lang/rust/issues/29603
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/log-syntax.md b/src/doc/unstable-book/src/language-features/log-syntax.md
deleted file mode 100644
index b13f5ccfd91..00000000000
--- a/src/doc/unstable-book/src/language-features/log-syntax.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `log_syntax`
-
-The tracking issue for this feature is: [#29598]
-
-[#29598]: https://github.com/rust-lang/rust/issues/29598
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/macro-reexport.md b/src/doc/unstable-book/src/language-features/macro-reexport.md
deleted file mode 100644
index 32ffa3b4c31..00000000000
--- a/src/doc/unstable-book/src/language-features/macro-reexport.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `macro_reexport`
-
-The tracking issue for this feature is: [#29638]
-
-[#29638]: https://github.com/rust-lang/rust/issues/29638
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/main.md b/src/doc/unstable-book/src/language-features/main.md
deleted file mode 100644
index 579aabfff88..00000000000
--- a/src/doc/unstable-book/src/language-features/main.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `main`
-
-The tracking issue for this feature is: [#29634]
-
-[#29634]: https://github.com/rust-lang/rust/issues/29634
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/naked-functions.md b/src/doc/unstable-book/src/language-features/naked-functions.md
deleted file mode 100644
index e56ce4770aa..00000000000
--- a/src/doc/unstable-book/src/language-features/naked-functions.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `naked_functions`
-
-The tracking issue for this feature is: [#32408]
-
-[#32408]: https://github.com/rust-lang/rust/issues/32408
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/needs-allocator.md b/src/doc/unstable-book/src/language-features/needs-allocator.md
deleted file mode 100644
index 22aa10b2183..00000000000
--- a/src/doc/unstable-book/src/language-features/needs-allocator.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `needs_allocator`
-
-The tracking issue for this feature is: [#27389]
-
-[#27389]: https://github.com/rust-lang/rust/issues/27389
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/needs-panic-runtime.md b/src/doc/unstable-book/src/language-features/needs-panic-runtime.md
deleted file mode 100644
index 627c946c1bb..00000000000
--- a/src/doc/unstable-book/src/language-features/needs-panic-runtime.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `needs_panic_runtime`
-
-The tracking issue for this feature is: [#32837]
-
-[#32837]: https://github.com/rust-lang/rust/issues/32837
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/never-type.md b/src/doc/unstable-book/src/language-features/never-type.md
deleted file mode 100644
index 3b3729a4b21..00000000000
--- a/src/doc/unstable-book/src/language-features/never-type.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `never_type`
-
-The tracking issue for this feature is: [#35121]
-
-[#35121]: https://github.com/rust-lang/rust/issues/35121
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/no-core.md b/src/doc/unstable-book/src/language-features/no-core.md
deleted file mode 100644
index 6238753447c..00000000000
--- a/src/doc/unstable-book/src/language-features/no-core.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `no_core`
-
-The tracking issue for this feature is: [#29639]
-
-[#29639]: https://github.com/rust-lang/rust/issues/29639
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/no-debug.md b/src/doc/unstable-book/src/language-features/no-debug.md
deleted file mode 100644
index 7536ed9d4e1..00000000000
--- a/src/doc/unstable-book/src/language-features/no-debug.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `no_debug`
-
-The tracking issue for this feature is: [#29721]
-
-[#29721]: https://github.com/rust-lang/rust/issues/29721
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/omit-gdb-pretty-printer-section.md b/src/doc/unstable-book/src/language-features/omit-gdb-pretty-printer-section.md
deleted file mode 100644
index d8ac520fcb5..00000000000
--- a/src/doc/unstable-book/src/language-features/omit-gdb-pretty-printer-section.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# `omit_gdb_pretty_printer_section`
-
-The tracking issue for this feature is: None.
-
-------------------------
-
diff --git a/src/doc/unstable-book/src/language-features/optin-builtin-traits.md b/src/doc/unstable-book/src/language-features/optin-builtin-traits.md
deleted file mode 100644
index 0b2d60accd5..00000000000
--- a/src/doc/unstable-book/src/language-features/optin-builtin-traits.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# `optin_builtin_traits`
-
-The tracking issue for this feature is: [#13231]
-
-[#13231]: https://github.com/rust-lang/rust/issues/13231
-
-------------------------
-
-
diff --git a/src/doc/unstable-book/src/language-features/overlapping-marker-traits.md b/src/doc/unstable-book/src/language-features/overlapping-marker-traits.md
deleted file mode 100644
index a4920839c6c..00000000000
--- a/src/doc/unstable-book/src/language-features/overlapping-marker-traits.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `overlapping_marker_traits`
-
-The tracking issue for this feature is: [#29864]
-
-[#29864]: https://github.com/rust-lang/rust/issues/29864
-
-------------------------
diff --git a/src/doc/unstable-book/src/language-features/panic-runtime.md b/src/doc/unstable-book/src/language-features/panic-runtime.md
deleted file mode 100644
index 65b067e8296..00000000000
--- a/src/doc/unstable-book/src/language-features/panic-runtime.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `panic_runtime`
-
-The tracking issue for this feature is: [#32837]
-
-[#32837]: https://github.com/rust-lang/rust/issues/32837
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/placement-in-syntax.md b/src/doc/unstable-book/src/language-features/placement-in-syntax.md
deleted file mode 100644
index da12559a01b..00000000000
--- a/src/doc/unstable-book/src/language-features/placement-in-syntax.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `placement_in_syntax`
-
-The tracking issue for this feature is: [#27779]
-
-[#27779]: https://github.com/rust-lang/rust/issues/27779
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/platform-intrinsics.md b/src/doc/unstable-book/src/language-features/platform-intrinsics.md
deleted file mode 100644
index 377ac8f7342..00000000000
--- a/src/doc/unstable-book/src/language-features/platform-intrinsics.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `platform_intrinsics`
-
-The tracking issue for this feature is: [#27731]
-
-[#27731]: https://github.com/rust-lang/rust/issues/27731
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/prelude-import.md b/src/doc/unstable-book/src/language-features/prelude-import.md
deleted file mode 100644
index 75dae5cfb74..00000000000
--- a/src/doc/unstable-book/src/language-features/prelude-import.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# `prelude_import`
-
-The tracking issue for this feature is: None.
-
-------------------------
-
diff --git a/src/doc/unstable-book/src/language-features/quote.md b/src/doc/unstable-book/src/language-features/quote.md
deleted file mode 100644
index b4e078d920c..00000000000
--- a/src/doc/unstable-book/src/language-features/quote.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `quote`
-
-The tracking issue for this feature is: [#29601]
-
-[#29601]: https://github.com/rust-lang/rust/issues/29601
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/repr-align.md b/src/doc/unstable-book/src/language-features/repr-align.md
deleted file mode 100644
index deea04f4c51..00000000000
--- a/src/doc/unstable-book/src/language-features/repr-align.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# `repr_align`
-
-The tracking issue for this feature is: [#33626]
-
-[#33626]: https://github.com/rust-lang/rust/issues/33626
-
-------------------------
-
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/repr-simd.md b/src/doc/unstable-book/src/language-features/repr-simd.md
deleted file mode 100644
index c6f051e4fff..00000000000
--- a/src/doc/unstable-book/src/language-features/repr-simd.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `repr_simd`
-
-The tracking issue for this feature is: [#27731]
-
-[#27731]: https://github.com/rust-lang/rust/issues/27731
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/rustc-attrs.md b/src/doc/unstable-book/src/language-features/rustc-attrs.md
deleted file mode 100644
index d1f18cead06..00000000000
--- a/src/doc/unstable-book/src/language-features/rustc-attrs.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `rustc_attrs`
-
-The tracking issue for this feature is: [#29642]
-
-[#29642]: https://github.com/rust-lang/rust/issues/29642
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/rustc-diagnostic-macros.md b/src/doc/unstable-book/src/language-features/rustc-diagnostic-macros.md
deleted file mode 100644
index 0df6ca12089..00000000000
--- a/src/doc/unstable-book/src/language-features/rustc-diagnostic-macros.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# `rustc_diagnostic_macros`
-
-The tracking issue for this feature is: None.
-
-------------------------
-
diff --git a/src/doc/unstable-book/src/language-features/sanitizer-runtime.md b/src/doc/unstable-book/src/language-features/sanitizer-runtime.md
deleted file mode 100644
index f19504de58e..00000000000
--- a/src/doc/unstable-book/src/language-features/sanitizer-runtime.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# `sanitizer_runtime`
-
-The tracking issue for this feature is: None.
-
-------------------------
-
diff --git a/src/doc/unstable-book/src/language-features/simd-ffi.md b/src/doc/unstable-book/src/language-features/simd-ffi.md
deleted file mode 100644
index d85779c3d3d..00000000000
--- a/src/doc/unstable-book/src/language-features/simd-ffi.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `simd_ffi`
-
-The tracking issue for this feature is: [#27731]
-
-[#27731]: https://github.com/rust-lang/rust/issues/27731
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/simd.md b/src/doc/unstable-book/src/language-features/simd.md
deleted file mode 100644
index 13c9722c524..00000000000
--- a/src/doc/unstable-book/src/language-features/simd.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `simd`
-
-The tracking issue for this feature is: [#27731]
-
-[#27731]: https://github.com/rust-lang/rust/issues/27731
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/specialization.md b/src/doc/unstable-book/src/language-features/specialization.md
deleted file mode 100644
index efc380df6e1..00000000000
--- a/src/doc/unstable-book/src/language-features/specialization.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `specialization`
-
-The tracking issue for this feature is: [#31844]
-
-[#31844]: https://github.com/rust-lang/rust/issues/31844
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/staged-api.md b/src/doc/unstable-book/src/language-features/staged-api.md
deleted file mode 100644
index 1409e570e88..00000000000
--- a/src/doc/unstable-book/src/language-features/staged-api.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# `staged_api`
-
-The tracking issue for this feature is: None.
-
-------------------------
-
diff --git a/src/doc/unstable-book/src/language-features/start.md b/src/doc/unstable-book/src/language-features/start.md
deleted file mode 100644
index 1ea6d59c78d..00000000000
--- a/src/doc/unstable-book/src/language-features/start.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `start`
-
-The tracking issue for this feature is: [#29633]
-
-[#29633]: https://github.com/rust-lang/rust/issues/29633
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/static-nobundle.md b/src/doc/unstable-book/src/language-features/static-nobundle.md
deleted file mode 100644
index 97b9d71d433..00000000000
--- a/src/doc/unstable-book/src/language-features/static-nobundle.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `static_nobundle`
-
-The tracking issue for this feature is: [#37403]
-
-[#37403]: https://github.com/rust-lang/rust/issues/37403
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/stmt-expr-attributes.md b/src/doc/unstable-book/src/language-features/stmt-expr-attributes.md
deleted file mode 100644
index 71092fcf290..00000000000
--- a/src/doc/unstable-book/src/language-features/stmt-expr-attributes.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `stmt_expr_attributes`
-
-The tracking issue for this feature is: [#15701]
-
-[#15701]: https://github.com/rust-lang/rust/issues/15701
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/structural-match.md b/src/doc/unstable-book/src/language-features/structural-match.md
deleted file mode 100644
index b3ca26e6474..00000000000
--- a/src/doc/unstable-book/src/language-features/structural-match.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `structural_match`
-
-The tracking issue for this feature is: [#31434]
-
-[#31434]: https://github.com/rust-lang/rust/issues/31434
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/target-feature.md b/src/doc/unstable-book/src/language-features/target-feature.md
deleted file mode 100644
index 85ab1ab39ef..00000000000
--- a/src/doc/unstable-book/src/language-features/target-feature.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# `target_feature`
-
-The tracking issue for this feature is: None.
-
-------------------------
-
diff --git a/src/doc/unstable-book/src/language-features/thread-local.md b/src/doc/unstable-book/src/language-features/thread-local.md
deleted file mode 100644
index 83de2f9cd4b..00000000000
--- a/src/doc/unstable-book/src/language-features/thread-local.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `thread_local`
-
-The tracking issue for this feature is: [#29594]
-
-[#29594]: https://github.com/rust-lang/rust/issues/29594
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/trace-macros.md b/src/doc/unstable-book/src/language-features/trace-macros.md
deleted file mode 100644
index 856f1b0a7bb..00000000000
--- a/src/doc/unstable-book/src/language-features/trace-macros.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `trace_macros`
-
-The tracking issue for this feature is: [#29598]
-
-[#29598]: https://github.com/rust-lang/rust/issues/29598
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/type-ascription.md b/src/doc/unstable-book/src/language-features/type-ascription.md
deleted file mode 100644
index 3ebd0d87ccf..00000000000
--- a/src/doc/unstable-book/src/language-features/type-ascription.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `type_ascription`
-
-The tracking issue for this feature is: [#23416]
-
-[#23416]: https://github.com/rust-lang/rust/issues/23416
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/unboxed-closures.md b/src/doc/unstable-book/src/language-features/unboxed-closures.md
deleted file mode 100644
index 2cbb436ce0b..00000000000
--- a/src/doc/unstable-book/src/language-features/unboxed-closures.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `unboxed_closures`
-
-The tracking issue for this feature is: [#29625]
-
-[#29625]: https://github.com/rust-lang/rust/issues/29625
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/untagged-unions.md b/src/doc/unstable-book/src/language-features/untagged-unions.md
deleted file mode 100644
index 6fe4f088ac2..00000000000
--- a/src/doc/unstable-book/src/language-features/untagged-unions.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `untagged_unions`
-
-The tracking issue for this feature is: [#32836]
-
-[#32836]: https://github.com/rust-lang/rust/issues/32836
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/language-features/unwind-attributes.md b/src/doc/unstable-book/src/language-features/unwind-attributes.md
deleted file mode 100644
index 0167a33b081..00000000000
--- a/src/doc/unstable-book/src/language-features/unwind-attributes.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# `unwind_attributes`
-
-The tracking issue for this feature is: None.
-
-------------------------
-
diff --git a/src/doc/unstable-book/src/language-features/use-extern-macros.md b/src/doc/unstable-book/src/language-features/use-extern-macros.md
deleted file mode 100644
index bc614911502..00000000000
--- a/src/doc/unstable-book/src/language-features/use-extern-macros.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# `use_extern_macros`
-
-The tracking issue for this feature is: [#35896]
-
-[#35896]: https://github.com/rust-lang/rust/issues/35896
-
-------------------------
-
-
-
diff --git a/src/doc/unstable-book/src/library-features/alloc.md b/src/doc/unstable-book/src/library-features/alloc.md
deleted file mode 100644
index 47eeb0874fb..00000000000
--- a/src/doc/unstable-book/src/library-features/alloc.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `alloc`
-
-The tracking issue for this feature is: [#27783]
-
-[#27783]: https://github.com/rust-lang/rust/issues/27783
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/as-c-str.md b/src/doc/unstable-book/src/library-features/as-c-str.md
deleted file mode 100644
index ed32eedb348..00000000000
--- a/src/doc/unstable-book/src/library-features/as-c-str.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# `as_c_str`
-
-The tracking issue for this feature is: [#40380]
-
-[#40380]: https://github.com/rust-lang/rust/issues/40380
-
-------------------------
-
diff --git a/src/doc/unstable-book/src/library-features/ascii-ctype.md b/src/doc/unstable-book/src/library-features/ascii-ctype.md
deleted file mode 100644
index e253b4dcd9b..00000000000
--- a/src/doc/unstable-book/src/library-features/ascii-ctype.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# `ascii_ctype`
-
-The tracking issue for this feature is: [#39658]
-
-[#39658]: https://github.com/rust-lang/rust/issues/39658
diff --git a/src/doc/unstable-book/src/library-features/box-heap.md b/src/doc/unstable-book/src/library-features/box-heap.md
deleted file mode 100644
index 0f3f01ba0e1..00000000000
--- a/src/doc/unstable-book/src/library-features/box-heap.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `box_heap`
-
-The tracking issue for this feature is: [#27779]
-
-[#27779]: https://github.com/rust-lang/rust/issues/27779
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/char-escape-debug.md b/src/doc/unstable-book/src/library-features/char-escape-debug.md
deleted file mode 100644
index 21aa486219e..00000000000
--- a/src/doc/unstable-book/src/library-features/char-escape-debug.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `char_escape_debug`
-
-The tracking issue for this feature is: [#35068]
-
-[#35068]: https://github.com/rust-lang/rust/issues/35068
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/coerce-unsized.md b/src/doc/unstable-book/src/library-features/coerce-unsized.md
deleted file mode 100644
index 078d3faf42a..00000000000
--- a/src/doc/unstable-book/src/library-features/coerce-unsized.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `coerce_unsized`
-
-The tracking issue for this feature is: [#27732]
-
-[#27732]: https://github.com/rust-lang/rust/issues/27732
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/collection-placement.md b/src/doc/unstable-book/src/library-features/collection-placement.md
deleted file mode 100644
index 268ca6ea590..00000000000
--- a/src/doc/unstable-book/src/library-features/collection-placement.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `collection_placement`
-
-The tracking issue for this feature is: [#30172]
-
-[#30172]: https://github.com/rust-lang/rust/issues/30172
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/collections-range.md b/src/doc/unstable-book/src/library-features/collections-range.md
deleted file mode 100644
index ea4f999ba0f..00000000000
--- a/src/doc/unstable-book/src/library-features/collections-range.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `collections_range`
-
-The tracking issue for this feature is: [#30877]
-
-[#30877]: https://github.com/rust-lang/rust/issues/30877
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/command-envs.md b/src/doc/unstable-book/src/library-features/command-envs.md
deleted file mode 100644
index 0ab89e278cd..00000000000
--- a/src/doc/unstable-book/src/library-features/command-envs.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `command_envs`
-
-The tracking issue for this feature is: [#38526]
-
-[#38526]: https://github.com/rust-lang/rust/issues/38526
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/concat-idents-macro.md b/src/doc/unstable-book/src/library-features/concat-idents-macro.md
deleted file mode 100644
index ac2fdd4fceb..00000000000
--- a/src/doc/unstable-book/src/library-features/concat-idents-macro.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `concat_idents_macro`
-
-The tracking issue for this feature is: [#29599]
-
-[#29599]: https://github.com/rust-lang/rust/issues/29599
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/core-char-ext.md b/src/doc/unstable-book/src/library-features/core-char-ext.md
deleted file mode 100644
index d37d6b5c6d0..00000000000
--- a/src/doc/unstable-book/src/library-features/core-char-ext.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `core_char_ext`
-
-The tracking issue for this feature is: [#32110]
-
-[#32110]: https://github.com/rust-lang/rust/issues/32110
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/core-float.md b/src/doc/unstable-book/src/library-features/core-float.md
deleted file mode 100644
index 194b2608dd0..00000000000
--- a/src/doc/unstable-book/src/library-features/core-float.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `core_float`
-
-The tracking issue for this feature is: [#32110]
-
-[#32110]: https://github.com/rust-lang/rust/issues/32110
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/core-slice-ext.md b/src/doc/unstable-book/src/library-features/core-slice-ext.md
deleted file mode 100644
index c50d44ac0ce..00000000000
--- a/src/doc/unstable-book/src/library-features/core-slice-ext.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `core_slice_ext`
-
-The tracking issue for this feature is: [#32110]
-
-[#32110]: https://github.com/rust-lang/rust/issues/32110
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/core-str-ext.md b/src/doc/unstable-book/src/library-features/core-str-ext.md
deleted file mode 100644
index 08c68f11c6e..00000000000
--- a/src/doc/unstable-book/src/library-features/core-str-ext.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `core_str_ext`
-
-The tracking issue for this feature is: [#32110]
-
-[#32110]: https://github.com/rust-lang/rust/issues/32110
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/decode-utf8.md b/src/doc/unstable-book/src/library-features/decode-utf8.md
deleted file mode 100644
index b96854ebcd4..00000000000
--- a/src/doc/unstable-book/src/library-features/decode-utf8.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `decode_utf8`
-
-The tracking issue for this feature is: [#27783]
-
-[#27783]: https://github.com/rust-lang/rust/issues/27783
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/discriminant-value.md b/src/doc/unstable-book/src/library-features/discriminant-value.md
deleted file mode 100644
index 2f99f5ecab3..00000000000
--- a/src/doc/unstable-book/src/library-features/discriminant-value.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `discriminant_value`
-
-The tracking issue for this feature is: [#24263]
-
-[#24263]: https://github.com/rust-lang/rust/issues/24263
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/error-type-id.md b/src/doc/unstable-book/src/library-features/error-type-id.md
deleted file mode 100644
index be7a3ffd4dc..00000000000
--- a/src/doc/unstable-book/src/library-features/error-type-id.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `error_type_id`
-
-The tracking issue for this feature is: [#27745]
-
-[#27745]: https://github.com/rust-lang/rust/issues/27745
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/exact-size-is-empty.md b/src/doc/unstable-book/src/library-features/exact-size-is-empty.md
deleted file mode 100644
index 200ec387251..00000000000
--- a/src/doc/unstable-book/src/library-features/exact-size-is-empty.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `exact_size_is_empty`
-
-The tracking issue for this feature is: [#35428]
-
-[#35428]: https://github.com/rust-lang/rust/issues/35428
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/fixed-size-array.md b/src/doc/unstable-book/src/library-features/fixed-size-array.md
deleted file mode 100644
index 9e24e6a0850..00000000000
--- a/src/doc/unstable-book/src/library-features/fixed-size-array.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `fixed_size_array`
-
-The tracking issue for this feature is: [#27778]
-
-[#27778]: https://github.com/rust-lang/rust/issues/27778
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/float-bits-conv.md b/src/doc/unstable-book/src/library-features/float-bits-conv.md
deleted file mode 100644
index f519545ac78..00000000000
--- a/src/doc/unstable-book/src/library-features/float-bits-conv.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `float_bits_conv`
-
-The tracking issue for this feature is: [#40470]
-
-[#40470]: https://github.com/rust-lang/rust/issues/40470
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/fmt-flags-align.md b/src/doc/unstable-book/src/library-features/fmt-flags-align.md
deleted file mode 100644
index 755263bd9a6..00000000000
--- a/src/doc/unstable-book/src/library-features/fmt-flags-align.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `fmt_flags_align`
-
-The tracking issue for this feature is: [#27726]
-
-[#27726]: https://github.com/rust-lang/rust/issues/27726
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/fn-traits.md b/src/doc/unstable-book/src/library-features/fn-traits.md
deleted file mode 100644
index 3942cda5538..00000000000
--- a/src/doc/unstable-book/src/library-features/fn-traits.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `fn_traits`
-
-The tracking issue for this feature is: [#29625]
-
-[#29625]: https://github.com/rust-lang/rust/issues/29625
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/fnbox.md b/src/doc/unstable-book/src/library-features/fnbox.md
deleted file mode 100644
index a9b74d4f004..00000000000
--- a/src/doc/unstable-book/src/library-features/fnbox.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `fnbox`
-
-The tracking issue for this feature is: [#28796]
-
-[#28796]: https://github.com/rust-lang/rust/issues/28796
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/from_utf8_error_as_bytes.md b/src/doc/unstable-book/src/library-features/from_utf8_error_as_bytes.md
deleted file mode 100644
index 570f779417f..00000000000
--- a/src/doc/unstable-book/src/library-features/from_utf8_error_as_bytes.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `from_utf8_error_as_bytes`
-
-The tracking issue for this feature is: [#40895]
-
-[#40895]: https://github.com/rust-lang/rust/issues/40895
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/fused.md b/src/doc/unstable-book/src/library-features/fused.md
deleted file mode 100644
index 460555bf1b0..00000000000
--- a/src/doc/unstable-book/src/library-features/fused.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `fused`
-
-The tracking issue for this feature is: [#35602]
-
-[#35602]: https://github.com/rust-lang/rust/issues/35602
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/get-type-id.md b/src/doc/unstable-book/src/library-features/get-type-id.md
deleted file mode 100644
index afdb030c406..00000000000
--- a/src/doc/unstable-book/src/library-features/get-type-id.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `get_type_id`
-
-The tracking issue for this feature is: [#27745]
-
-[#27745]: https://github.com/rust-lang/rust/issues/27745
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/heap-api.md b/src/doc/unstable-book/src/library-features/heap-api.md
deleted file mode 100644
index 01404e49dbd..00000000000
--- a/src/doc/unstable-book/src/library-features/heap-api.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `heap_api`
-
-The tracking issue for this feature is: [#27700]
-
-[#27700]: https://github.com/rust-lang/rust/issues/27700
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/i128.md b/src/doc/unstable-book/src/library-features/i128.md
deleted file mode 100644
index a1a7ce8e63f..00000000000
--- a/src/doc/unstable-book/src/library-features/i128.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `i128`
-
-The tracking issue for this feature is: [#35118]
-
-[#35118]: https://github.com/rust-lang/rust/issues/35118
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/inclusive-range.md b/src/doc/unstable-book/src/library-features/inclusive-range.md
deleted file mode 100644
index 2e88e204786..00000000000
--- a/src/doc/unstable-book/src/library-features/inclusive-range.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `inclusive_range`
-
-The tracking issue for this feature is: [#28237]
-
-[#28237]: https://github.com/rust-lang/rust/issues/28237
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/integer-atomics.md b/src/doc/unstable-book/src/library-features/integer-atomics.md
deleted file mode 100644
index 50db9fd4ca4..00000000000
--- a/src/doc/unstable-book/src/library-features/integer-atomics.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `integer_atomics`
-
-The tracking issue for this feature is: [#32976]
-
-[#32976]: https://github.com/rust-lang/rust/issues/32976
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/into-boxed-c-str.md b/src/doc/unstable-book/src/library-features/into-boxed-c-str.md
deleted file mode 100644
index 0d94b4fc560..00000000000
--- a/src/doc/unstable-book/src/library-features/into-boxed-c-str.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `into_boxed_c_str`
-
-The tracking issue for this feature is: [#40380]
-
-[#40380]: https://github.com/rust-lang/rust/issues/40380
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/into-boxed-os-str.md b/src/doc/unstable-book/src/library-features/into-boxed-os-str.md
deleted file mode 100644
index 7636e20b14d..00000000000
--- a/src/doc/unstable-book/src/library-features/into-boxed-os-str.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `into_boxed_os_str`
-
-The tracking issue for this feature is: [#into_boxed_os_str]
-
-[#into_boxed_os_str]: https://github.com/rust-lang/rust/issues/40380
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/into-boxed-path.md b/src/doc/unstable-book/src/library-features/into-boxed-path.md
deleted file mode 100644
index 754c6042f07..00000000000
--- a/src/doc/unstable-book/src/library-features/into-boxed-path.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `into_boxed_path`
-
-The tracking issue for this feature is: [#40380]
-
-[#40380]: https://github.com/rust-lang/rust/issues/40380
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/io.md b/src/doc/unstable-book/src/library-features/io.md
deleted file mode 100644
index ed6cae24e32..00000000000
--- a/src/doc/unstable-book/src/library-features/io.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `io`
-
-The tracking issue for this feature is: [#27802]
-
-[#27802]: https://github.com/rust-lang/rust/issues/27802
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/ip.md b/src/doc/unstable-book/src/library-features/ip.md
deleted file mode 100644
index 7e7d52adbdb..00000000000
--- a/src/doc/unstable-book/src/library-features/ip.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `ip`
-
-The tracking issue for this feature is: [#27709]
-
-[#27709]: https://github.com/rust-lang/rust/issues/27709
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/iter-rfind.md b/src/doc/unstable-book/src/library-features/iter-rfind.md
deleted file mode 100644
index 44471449034..00000000000
--- a/src/doc/unstable-book/src/library-features/iter-rfind.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `iter_rfind`
-
-The tracking issue for this feature is: [#39480]
-
-[#39480]: https://github.com/rust-lang/rust/issues/39480
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/iterator-step-by.md b/src/doc/unstable-book/src/library-features/iterator-step-by.md
deleted file mode 100644
index 8467cb68862..00000000000
--- a/src/doc/unstable-book/src/library-features/iterator-step-by.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `iterator_step_by`
-
-The tracking issue for this feature is: [#27741]
-
-[#27741]: https://github.com/rust-lang/rust/issues/27741
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/linked-list-extras.md b/src/doc/unstable-book/src/library-features/linked-list-extras.md
deleted file mode 100644
index be3b96aea70..00000000000
--- a/src/doc/unstable-book/src/library-features/linked-list-extras.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `linked_list_extras`
-
-The tracking issue for this feature is: [#27794]
-
-[#27794]: https://github.com/rust-lang/rust/issues/27794
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/lookup-host.md b/src/doc/unstable-book/src/library-features/lookup-host.md
deleted file mode 100644
index b60e7a01094..00000000000
--- a/src/doc/unstable-book/src/library-features/lookup-host.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `lookup_host`
-
-The tracking issue for this feature is: [#27705]
-
-[#27705]: https://github.com/rust-lang/rust/issues/27705
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/manually-drop.md b/src/doc/unstable-book/src/library-features/manually-drop.md
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/src/doc/unstable-book/src/library-features/manually-drop.md
+++ /dev/null
diff --git a/src/doc/unstable-book/src/library-features/mpsc-select.md b/src/doc/unstable-book/src/library-features/mpsc-select.md
deleted file mode 100644
index 1405b6c5cb2..00000000000
--- a/src/doc/unstable-book/src/library-features/mpsc-select.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# `mpsc_select`
-
-The tracking issue for this feature is: [#27800]
-
-[#27800]: https://github.com/rust-lang/rust/issues/27800
diff --git a/src/doc/unstable-book/src/library-features/needs-drop.md b/src/doc/unstable-book/src/library-features/needs-drop.md
deleted file mode 100644
index 10ae95695a2..00000000000
--- a/src/doc/unstable-book/src/library-features/needs-drop.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `needs_drop`
-
-The tracking issue for this feature is: [#41890]
-
-[#41890]: https://github.com/rust-lang/rust/issues/41890
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/never-type-impls.md b/src/doc/unstable-book/src/library-features/never-type-impls.md
deleted file mode 100644
index 4063cd0db01..00000000000
--- a/src/doc/unstable-book/src/library-features/never-type-impls.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `never_type_impls`
-
-The tracking issue for this feature is: [#35121]
-
-[#35121]: https://github.com/rust-lang/rust/issues/35121
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/nonzero.md b/src/doc/unstable-book/src/library-features/nonzero.md
deleted file mode 100644
index f200f8e2786..00000000000
--- a/src/doc/unstable-book/src/library-features/nonzero.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `nonzero`
-
-The tracking issue for this feature is: [#27730]
-
-[#27730]: https://github.com/rust-lang/rust/issues/27730
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/offset-to.md b/src/doc/unstable-book/src/library-features/offset-to.md
deleted file mode 100644
index 03d990eb4ae..00000000000
--- a/src/doc/unstable-book/src/library-features/offset-to.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `offset_to`
-
-The tracking issue for this feature is: [#41079]
-
-[#41079]: https://github.com/rust-lang/rust/issues/41079
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/once-poison.md b/src/doc/unstable-book/src/library-features/once-poison.md
deleted file mode 100644
index 3c16cafae50..00000000000
--- a/src/doc/unstable-book/src/library-features/once-poison.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `once_poison`
-
-The tracking issue for this feature is: [#33577]
-
-[#33577]: https://github.com/rust-lang/rust/issues/33577
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/oom.md b/src/doc/unstable-book/src/library-features/oom.md
deleted file mode 100644
index 908caeb75c6..00000000000
--- a/src/doc/unstable-book/src/library-features/oom.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `oom`
-
-The tracking issue for this feature is: [#27700]
-
-[#27700]: https://github.com/rust-lang/rust/issues/27700
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/option-entry.md b/src/doc/unstable-book/src/library-features/option-entry.md
deleted file mode 100644
index edb4efc09e5..00000000000
--- a/src/doc/unstable-book/src/library-features/option-entry.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `option_entry`
-
-The tracking issue for this feature is: [#39288]
-
-[#39288]: https://github.com/rust-lang/rust/issues/39288
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/ord-max-min.md b/src/doc/unstable-book/src/library-features/ord-max-min.md
deleted file mode 100644
index 564cd1ac30b..00000000000
--- a/src/doc/unstable-book/src/library-features/ord-max-min.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `ord-max-min`
-
-The tracking issue for this feature is: [#25663]
-
-[#25663]: https://github.com/rust-lang/rust/issues/25663
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/osstring-shrink-to-fit.md b/src/doc/unstable-book/src/library-features/osstring-shrink-to-fit.md
deleted file mode 100644
index 21dc7d095c8..00000000000
--- a/src/doc/unstable-book/src/library-features/osstring-shrink-to-fit.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `osstring_shrink_to_fit`
-
-The tracking issue for this feature is: [#40421]
-
-[#40421]: https://github.com/rust-lang/rust/issues/40421
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/panic-abort.md b/src/doc/unstable-book/src/library-features/panic-abort.md
deleted file mode 100644
index 07a95762690..00000000000
--- a/src/doc/unstable-book/src/library-features/panic-abort.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `panic_abort`
-
-The tracking issue for this feature is: [#32837]
-
-[#32837]: https://github.com/rust-lang/rust/issues/32837
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/panic-unwind.md b/src/doc/unstable-book/src/library-features/panic-unwind.md
deleted file mode 100644
index 840e492597b..00000000000
--- a/src/doc/unstable-book/src/library-features/panic-unwind.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `panic_unwind`
-
-The tracking issue for this feature is: [#32837]
-
-[#32837]: https://github.com/rust-lang/rust/issues/32837
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/pattern.md b/src/doc/unstable-book/src/library-features/pattern.md
deleted file mode 100644
index e76ee6beb67..00000000000
--- a/src/doc/unstable-book/src/library-features/pattern.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `pattern`
-
-The tracking issue for this feature is: [#27721]
-
-[#27721]: https://github.com/rust-lang/rust/issues/27721
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/placement-in.md b/src/doc/unstable-book/src/library-features/placement-in.md
deleted file mode 100644
index 6ff010b7e38..00000000000
--- a/src/doc/unstable-book/src/library-features/placement-in.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `placement_in`
-
-The tracking issue for this feature is: [#27779]
-
-[#27779]: https://github.com/rust-lang/rust/issues/27779
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/placement-new-protocol.md b/src/doc/unstable-book/src/library-features/placement-new-protocol.md
deleted file mode 100644
index d53225f0a35..00000000000
--- a/src/doc/unstable-book/src/library-features/placement-new-protocol.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `placement_new_protocol`
-
-The tracking issue for this feature is: [#27779]
-
-[#27779]: https://github.com/rust-lang/rust/issues/27779
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/proc-macro-internals.md b/src/doc/unstable-book/src/library-features/proc-macro-internals.md
deleted file mode 100644
index ea087c0a4f7..00000000000
--- a/src/doc/unstable-book/src/library-features/proc-macro-internals.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `proc_macro_internals`
-
-The tracking issue for this feature is: [#27812]
-
-[#27812]: https://github.com/rust-lang/rust/issues/27812
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/range-contains.md b/src/doc/unstable-book/src/library-features/range-contains.md
deleted file mode 100644
index ac4581faf2a..00000000000
--- a/src/doc/unstable-book/src/library-features/range-contains.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `range_contains`
-
-The tracking issue for this feature is: [#32311]
-
-[#32311]: https://github.com/rust-lang/rust/issues/32311
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/raw.md b/src/doc/unstable-book/src/library-features/raw.md
deleted file mode 100644
index d7caf22813d..00000000000
--- a/src/doc/unstable-book/src/library-features/raw.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `raw`
-
-The tracking issue for this feature is: [#27751]
-
-[#27751]: https://github.com/rust-lang/rust/issues/27751
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/reverse-cmp-key.md b/src/doc/unstable-book/src/library-features/reverse-cmp-key.md
deleted file mode 100644
index a1a851d6ed6..00000000000
--- a/src/doc/unstable-book/src/library-features/reverse-cmp-key.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `reverse_cmp_key`
-
-The tracking issue for this feature is: [#40893]
-
-[#40893]: https://github.com/rust-lang/rust/issues/40893
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/rustc-private.md b/src/doc/unstable-book/src/library-features/rustc-private.md
deleted file mode 100644
index 2453475efe5..00000000000
--- a/src/doc/unstable-book/src/library-features/rustc-private.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `rustc_private`
-
-The tracking issue for this feature is: [#27812]
-
-[#27812]: https://github.com/rust-lang/rust/issues/27812
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/shared.md b/src/doc/unstable-book/src/library-features/shared.md
deleted file mode 100644
index b79d1212c62..00000000000
--- a/src/doc/unstable-book/src/library-features/shared.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `shared`
-
-The tracking issue for this feature is: [#27730]
-
-[#27730]: https://github.com/rust-lang/rust/issues/27730
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/sip-hash-13.md b/src/doc/unstable-book/src/library-features/sip-hash-13.md
deleted file mode 100644
index 8f69c3ab2de..00000000000
--- a/src/doc/unstable-book/src/library-features/sip-hash-13.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `sip_hash_13`
-
-The tracking issue for this feature is: [#34767]
-
-[#34767]: https://github.com/rust-lang/rust/issues/34767
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/slice-concat-ext.md b/src/doc/unstable-book/src/library-features/slice-concat-ext.md
deleted file mode 100644
index 9ba2de5adc7..00000000000
--- a/src/doc/unstable-book/src/library-features/slice-concat-ext.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `slice_concat_ext`
-
-The tracking issue for this feature is: [#27747]
-
-[#27747]: https://github.com/rust-lang/rust/issues/27747
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/slice-get-slice.md b/src/doc/unstable-book/src/library-features/slice-get-slice.md
deleted file mode 100644
index 57e2c148e79..00000000000
--- a/src/doc/unstable-book/src/library-features/slice-get-slice.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `slice_get_slice`
-
-The tracking issue for this feature is: [#35729]
-
-[#35729]: https://github.com/rust-lang/rust/issues/35729
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/slice-rotate.md b/src/doc/unstable-book/src/library-features/slice-rotate.md
deleted file mode 100644
index 77fd598f1ea..00000000000
--- a/src/doc/unstable-book/src/library-features/slice-rotate.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `slice_rotate`
-
-The tracking issue for this feature is: [#41891]
-
-[#41891]: https://github.com/rust-lang/rust/issues/41891
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/step-by.md b/src/doc/unstable-book/src/library-features/step-by.md
deleted file mode 100644
index b649496cdd8..00000000000
--- a/src/doc/unstable-book/src/library-features/step-by.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `step_by`
-
-The tracking issue for this feature is: [#27741]
-
-[#27741]: https://github.com/rust-lang/rust/issues/27741
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/step-trait.md b/src/doc/unstable-book/src/library-features/step-trait.md
deleted file mode 100644
index 56050c20c69..00000000000
--- a/src/doc/unstable-book/src/library-features/step-trait.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `step_trait`
-
-The tracking issue for this feature is: [#42168]
-
-[#42168]: https://github.com/rust-lang/rust/issues/42168
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/str-box-extras.md b/src/doc/unstable-book/src/library-features/str-box-extras.md
deleted file mode 100644
index d05dcafa84d..00000000000
--- a/src/doc/unstable-book/src/library-features/str-box-extras.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# `str_box_extras`
-
-The tracking issue for this feature is: [#str_box_extras]
-
-[#str_box_extras]: https://github.com/rust-lang/rust/issues/41119
-
-------------------------
-
-
diff --git a/src/doc/unstable-book/src/library-features/str-checked-slicing.md b/src/doc/unstable-book/src/library-features/str-checked-slicing.md
deleted file mode 100644
index d390139a6be..00000000000
--- a/src/doc/unstable-book/src/library-features/str-checked-slicing.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `str_checked_slicing`
-
-The tracking issue for this feature is: [#39932]
-
-[#39932]: https://github.com/rust-lang/rust/issues/39932
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/str-escape.md b/src/doc/unstable-book/src/library-features/str-escape.md
deleted file mode 100644
index 61e31c89443..00000000000
--- a/src/doc/unstable-book/src/library-features/str-escape.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `str_escape`
-
-The tracking issue for this feature is: [#27791]
-
-[#27791]: https://github.com/rust-lang/rust/issues/27791
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/str-mut-extras.md b/src/doc/unstable-book/src/library-features/str-mut-extras.md
deleted file mode 100644
index df4f35832cd..00000000000
--- a/src/doc/unstable-book/src/library-features/str-mut-extras.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# `str_mut_extras`
-
-The tracking issue for this feature is: [#str_mut_extras]
-
-[#str_mut_extras]: https://github.com/rust-lang/rust/issues/41119
-
-------------------------
-
diff --git a/src/doc/unstable-book/src/library-features/thread-id.md b/src/doc/unstable-book/src/library-features/thread-id.md
deleted file mode 100644
index af3ea991025..00000000000
--- a/src/doc/unstable-book/src/library-features/thread-id.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `thread_id`
-
-The tracking issue for this feature is: [#21507]
-
-[#21507]: https://github.com/rust-lang/rust/issues/21507
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/thread-local-state.md b/src/doc/unstable-book/src/library-features/thread-local-state.md
deleted file mode 100644
index 113c1e910dc..00000000000
--- a/src/doc/unstable-book/src/library-features/thread-local-state.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `thread_local_state`
-
-The tracking issue for this feature is: [#27716]
-
-[#27716]: https://github.com/rust-lang/rust/issues/27716
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/toowned-clone-into.md b/src/doc/unstable-book/src/library-features/toowned-clone-into.md
deleted file mode 100644
index eccc7e0e4dd..00000000000
--- a/src/doc/unstable-book/src/library-features/toowned-clone-into.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `toowned_clone_into`
-
-The tracking issue for this feature is: [#41263]
-
-[#41263]: https://github.com/rust-lang/rust/issues/41263
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/trusted-len.md b/src/doc/unstable-book/src/library-features/trusted-len.md
deleted file mode 100644
index 80213cf1fdb..00000000000
--- a/src/doc/unstable-book/src/library-features/trusted-len.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `trusted_len`
-
-The tracking issue for this feature is: [#37572]
-
-[#37572]: https://github.com/rust-lang/rust/issues/37572
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/try-from.md b/src/doc/unstable-book/src/library-features/try-from.md
deleted file mode 100644
index d763caff5aa..00000000000
--- a/src/doc/unstable-book/src/library-features/try-from.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `try_from`
-
-The tracking issue for this feature is: [#33417]
-
-[#33417]: https://github.com/rust-lang/rust/issues/33417
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/unicode.md b/src/doc/unstable-book/src/library-features/unicode.md
deleted file mode 100644
index 9fecec2ac36..00000000000
--- a/src/doc/unstable-book/src/library-features/unicode.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `unicode`
-
-The tracking issue for this feature is: [#27783]
-
-[#27783]: https://github.com/rust-lang/rust/issues/27783
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/unique.md b/src/doc/unstable-book/src/library-features/unique.md
deleted file mode 100644
index 99a3490d106..00000000000
--- a/src/doc/unstable-book/src/library-features/unique.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `unique`
-
-The tracking issue for this feature is: [#27730]
-
-[#27730]: https://github.com/rust-lang/rust/issues/27730
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/unsize.md b/src/doc/unstable-book/src/library-features/unsize.md
deleted file mode 100644
index 92807e2858f..00000000000
--- a/src/doc/unstable-book/src/library-features/unsize.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `unsize`
-
-The tracking issue for this feature is: [#27732]
-
-[#27732]: https://github.com/rust-lang/rust/issues/27732
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/utf8-error-error-len.md b/src/doc/unstable-book/src/library-features/utf8-error-error-len.md
deleted file mode 100644
index 1c14a5a9fa0..00000000000
--- a/src/doc/unstable-book/src/library-features/utf8-error-error-len.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `utf8_error_error_len`
-
-The tracking issue for this feature is: [#40494]
-
-[#40494]: https://github.com/rust-lang/rust/issues/40494
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/vec-remove-item.md b/src/doc/unstable-book/src/library-features/vec-remove-item.md
deleted file mode 100644
index 2b8c9f046ee..00000000000
--- a/src/doc/unstable-book/src/library-features/vec-remove-item.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `vec_remove_item`
-
-The tracking issue for this feature is: [#40062]
-
-[#40062]: https://github.com/rust-lang/rust/issues/40062
-
-------------------------
diff --git a/src/doc/unstable-book/src/library-features/vec-resize-default.md b/src/doc/unstable-book/src/library-features/vec-resize-default.md
deleted file mode 100644
index 5803d3215a5..00000000000
--- a/src/doc/unstable-book/src/library-features/vec-resize-default.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# `vec_resize_default`
-
-The tracking issue for this feature is: [#41758]
-
-[#41758]: https://github.com/rust-lang/rust/issues/41758
-
-------------------------
diff --git a/src/tools/tidy/src/features.rs b/src/tools/tidy/src/features.rs
index e34821e3584..81db23ccceb 100644
--- a/src/tools/tidy/src/features.rs
+++ b/src/tools/tidy/src/features.rs
@@ -24,7 +24,7 @@ use std::fs::File;
 use std::io::prelude::*;
 use std::path::Path;
 
-#[derive(Debug, PartialEq)]
+#[derive(Debug, PartialEq, Clone)]
 pub enum Status {
     Stable,
     Removed,
@@ -42,13 +42,16 @@ impl fmt::Display for Status {
     }
 }
 
-#[derive(Debug)]
+#[derive(Debug, Clone)]
 pub struct Feature {
     pub level: Status,
     pub since: String,
     pub has_gate_test: bool,
+    pub tracking_issue: Option<u32>,
 }
 
+pub type Features = HashMap<String, Feature>;
+
 pub fn check(path: &Path, bad: &mut bool, quiet: bool) {
     let mut features = collect_lang_features(path);
     assert!(!features.is_empty());
@@ -168,8 +171,7 @@ fn find_attr_val<'a>(line: &'a str, attr: &str) -> Option<&'a str> {
         .map(|(i, j)| &line[i..j])
 }
 
-fn test_filen_gate(filen_underscore: &str,
-                   features: &mut HashMap<String, Feature>) -> bool {
+fn test_filen_gate(filen_underscore: &str, features: &mut Features) -> bool {
     if filen_underscore.starts_with("feature_gate") {
         for (n, f) in features.iter_mut() {
             if filen_underscore == format!("feature_gate_{}", n) {
@@ -181,7 +183,7 @@ fn test_filen_gate(filen_underscore: &str,
     return false;
 }
 
-pub fn collect_lang_features(base_src_path: &Path) -> HashMap<String, Feature> {
+pub fn collect_lang_features(base_src_path: &Path) -> Features {
     let mut contents = String::new();
     let path = base_src_path.join("libsyntax/feature_gate.rs");
     t!(t!(File::open(path)).read_to_string(&mut contents));
@@ -197,11 +199,19 @@ pub fn collect_lang_features(base_src_path: &Path) -> HashMap<String, Feature> {
             };
             let name = parts.next().unwrap().trim();
             let since = parts.next().unwrap().trim().trim_matches('"');
+            let issue_str = parts.next().unwrap().trim();
+            let tracking_issue = if issue_str.starts_with("None") {
+                None
+            } else {
+                let s = issue_str.split("(").nth(1).unwrap().split(")").nth(0).unwrap();
+                Some(s.parse().unwrap())
+            };
             Some((name.to_owned(),
                 Feature {
-                    level: level,
+                    level,
                     since: since.to_owned(),
                     has_gate_test: false,
+                    tracking_issue,
                 }))
         })
         .collect()
@@ -209,8 +219,8 @@ pub fn collect_lang_features(base_src_path: &Path) -> HashMap<String, Feature> {
 
 pub fn collect_lib_features(base_src_path: &Path,
                             bad: &mut bool,
-                            features: &HashMap<String, Feature>) -> HashMap<String, Feature> {
-    let mut lib_features = HashMap::<String, Feature>::new();
+                            features: &Features) -> Features {
+    let mut lib_features = Features::new();
     let mut contents = String::new();
     super::walk(base_src_path,
                 &mut |path| super::filter_dirs(path) || path.ends_with("src/test"),
@@ -224,10 +234,32 @@ pub fn collect_lib_features(base_src_path: &Path,
         contents.truncate(0);
         t!(t!(File::open(&file), &file).read_to_string(&mut contents));
 
+        let mut becoming_feature: Option<(String, Feature)> = None;
         for (i, line) in contents.lines().enumerate() {
             let mut err = |msg: &str| {
                 tidy_error!(bad, "{}:{}: {}", file.display(), i + 1, msg);
             };
+            if let Some((ref name, ref mut f)) = becoming_feature {
+                if f.tracking_issue.is_none() {
+                    f.tracking_issue = find_attr_val(line, "issue")
+                    .map(|s| s.parse().unwrap());
+                }
+                if line.ends_with("]") {
+                    lib_features.insert(name.to_owned(), f.clone());
+                } else if !line.ends_with(",") && !line.ends_with("\\") {
+                    // We need to bail here because we might have missed the
+                    // end of a stability attribute above because the "]"
+                    // might not have been at the end of the line.
+                    // We could then get into the very unfortunate situation that
+                    // we continue parsing the file assuming the current stability
+                    // attribute has not ended, and ignoring possible feature
+                    // attributes in the process.
+                    err("malformed stability attribute");
+                } else {
+                    continue;
+                }
+            }
+            becoming_feature = None;
             let level = if line.contains("[unstable(") {
                 Status::Unstable
             } else if line.contains("[stable(") {
@@ -250,6 +282,7 @@ pub fn collect_lib_features(base_src_path: &Path,
                 }
                 None => "None",
             };
+            let tracking_issue = find_attr_val(line, "issue").map(|s| s.parse().unwrap());
 
             if features.contains_key(feature_name) {
                 err("duplicating a lang feature");
@@ -263,12 +296,17 @@ pub fn collect_lib_features(base_src_path: &Path,
                 }
                 continue;
             }
-            lib_features.insert(feature_name.to_owned(),
-                                Feature {
-                                    level: level,
-                                    since: since.to_owned(),
-                                    has_gate_test: false,
-                                });
+            let feature = Feature {
+                level,
+                since: since.to_owned(),
+                has_gate_test: false,
+                tracking_issue,
+            };
+            if line.contains("]") {
+                lib_features.insert(feature_name.to_owned(), feature);
+            } else {
+                becoming_feature = Some((feature_name.to_owned(), feature));
+            }
         }
     });
     lib_features
diff --git a/src/tools/tidy/src/lib.rs b/src/tools/tidy/src/lib.rs
new file mode 100644
index 00000000000..bcf86e4489b
--- /dev/null
+++ b/src/tools/tidy/src/lib.rs
@@ -0,0 +1,88 @@
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Library used by tidy and other tools
+//!
+//! This library contains the tidy lints and exposes it
+//! to be used by tools.
+
+#![deny(warnings)]
+
+use std::fs;
+
+use std::path::Path;
+
+macro_rules! t {
+    ($e:expr, $p:expr) => (match $e {
+        Ok(e) => e,
+        Err(e) => panic!("{} failed on {} with {}", stringify!($e), ($p).display(), e),
+    });
+
+    ($e:expr) => (match $e {
+        Ok(e) => e,
+        Err(e) => panic!("{} failed with {}", stringify!($e), e),
+    })
+}
+
+macro_rules! tidy_error {
+    ($bad:expr, $fmt:expr, $($arg:tt)*) => ({
+        use std::io::Write;
+        *$bad = true;
+        write!(::std::io::stderr(), "tidy error: ").expect("could not write to stderr");
+        writeln!(::std::io::stderr(), $fmt, $($arg)*).expect("could not write to stderr");
+    });
+}
+
+pub mod bins;
+pub mod style;
+pub mod errors;
+pub mod features;
+pub mod cargo;
+pub mod pal;
+pub mod deps;
+pub mod unstable_book;
+
+fn filter_dirs(path: &Path) -> bool {
+    let skip = [
+        "src/jemalloc",
+        "src/llvm",
+        "src/libbacktrace",
+        "src/compiler-rt",
+        "src/rustllvm",
+        "src/liblibc",
+        "src/vendor",
+        "src/rt/hoedown",
+        "src/tools/cargo",
+        "src/tools/rls",
+        "src/tools/rust-installer",
+    ];
+    skip.iter().any(|p| path.ends_with(p))
+}
+
+fn walk_many(paths: &[&Path], skip: &mut FnMut(&Path) -> bool, f: &mut FnMut(&Path)) {
+    for path in paths {
+        walk(path, skip, f);
+    }
+}
+
+fn walk(path: &Path, skip: &mut FnMut(&Path) -> bool, f: &mut FnMut(&Path)) {
+    for entry in t!(fs::read_dir(path), path) {
+        let entry = t!(entry);
+        let kind = t!(entry.file_type());
+        let path = entry.path();
+        if kind.is_dir() {
+            if !skip(&path) {
+                walk(&path, skip, f);
+            }
+        } else {
+            f(&path);
+        }
+    }
+}
diff --git a/src/tools/tidy/src/main.rs b/src/tools/tidy/src/main.rs
index 23a31131f7a..433192a21ec 100644
--- a/src/tools/tidy/src/main.rs
+++ b/src/tools/tidy/src/main.rs
@@ -8,47 +8,21 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-//! Tidy checks for source code in this repository
+//! Tidy checks source code in this repository
 //!
 //! This program runs all of the various tidy checks for style, cleanliness,
 //! etc. This is run by default on `make check` and as part of the auto
 //! builders.
 
-use std::env;
-use std::fs;
-use std::io::{self, Write};
-use std::path::{PathBuf, Path};
-use std::process;
+#![deny(warnings)]
 
-macro_rules! t {
-    ($e:expr, $p:expr) => (match $e {
-        Ok(e) => e,
-        Err(e) => panic!("{} failed on {} with {}", stringify!($e), ($p).display(), e),
-    });
-
-    ($e:expr) => (match $e {
-        Ok(e) => e,
-        Err(e) => panic!("{} failed with {}", stringify!($e), e),
-    })
-}
+extern crate tidy;
+use tidy::*;
 
-macro_rules! tidy_error {
-    ($bad:expr, $fmt:expr, $($arg:tt)*) => ({
-        use std::io::Write;
-        *$bad = true;
-        write!(::std::io::stderr(), "tidy error: ").expect("could not write to stderr");
-        writeln!(::std::io::stderr(), $fmt, $($arg)*).expect("could not write to stderr");
-    });
-}
-
-mod bins;
-mod style;
-mod errors;
-mod features;
-mod cargo;
-mod pal;
-mod deps;
-mod unstable_book;
+use std::process;
+use std::path::PathBuf;
+use std::env;
+use std::io::{self, Write};
 
 fn main() {
     let path = env::args_os().skip(1).next().expect("need an argument");
@@ -74,41 +48,3 @@ fn main() {
         process::exit(1);
     }
 }
-
-fn filter_dirs(path: &Path) -> bool {
-    let skip = [
-        "src/jemalloc",
-        "src/llvm",
-        "src/libbacktrace",
-        "src/compiler-rt",
-        "src/rustllvm",
-        "src/liblibc",
-        "src/vendor",
-        "src/rt/hoedown",
-        "src/tools/cargo",
-        "src/tools/rls",
-        "src/tools/rust-installer",
-    ];
-    skip.iter().any(|p| path.ends_with(p))
-}
-
-fn walk_many(paths: &[&Path], skip: &mut FnMut(&Path) -> bool, f: &mut FnMut(&Path)) {
-    for path in paths {
-        walk(path, skip, f);
-    }
-}
-
-fn walk(path: &Path, skip: &mut FnMut(&Path) -> bool, f: &mut FnMut(&Path)) {
-    for entry in t!(fs::read_dir(path), path) {
-        let entry = t!(entry);
-        let kind = t!(entry.file_type());
-        let path = entry.path();
-        if kind.is_dir() {
-            if !skip(&path) {
-                walk(&path, skip, f);
-            }
-        } else {
-            f(&path);
-        }
-    }
-}
diff --git a/src/tools/tidy/src/unstable_book.rs b/src/tools/tidy/src/unstable_book.rs
index 5a6524b3e88..fd3ffc685d9 100644
--- a/src/tools/tidy/src/unstable_book.rs
+++ b/src/tools/tidy/src/unstable_book.rs
@@ -11,26 +11,28 @@
 use std::collections::HashSet;
 use std::fs;
 use std::path;
-use features::{collect_lang_features, collect_lib_features, Status};
+use features::{collect_lang_features, collect_lib_features, Features, Status};
 
-const PATH_STR: &'static str = "doc/unstable-book/src";
+pub const PATH_STR: &str = "doc/unstable-book/src";
 
-const LANG_FEATURES_DIR: &'static str = "language-features";
+pub const COMPILER_FLAGS_DIR: &str = "compiler-flags";
 
-const LIB_FEATURES_DIR: &'static str = "library-features";
+pub const LANG_FEATURES_DIR: &str = "language-features";
+
+pub const LIB_FEATURES_DIR: &str = "library-features";
 
 /// Build the path to the Unstable Book source directory from the Rust 'src' directory
-fn unstable_book_path(base_src_path: &path::Path) -> path::PathBuf {
+pub fn unstable_book_path(base_src_path: &path::Path) -> path::PathBuf {
     base_src_path.join(PATH_STR)
 }
 
 /// Directory where the features are documented within the Unstable Book source directory
-fn unstable_book_lang_features_path(base_src_path: &path::Path) -> path::PathBuf {
+pub fn unstable_book_lang_features_path(base_src_path: &path::Path) -> path::PathBuf {
     unstable_book_path(base_src_path).join(LANG_FEATURES_DIR)
 }
 
 /// Directory where the features are documented within the Unstable Book source directory
-fn unstable_book_lib_features_path(base_src_path: &path::Path) -> path::PathBuf {
+pub fn unstable_book_lib_features_path(base_src_path: &path::Path) -> path::PathBuf {
     unstable_book_path(base_src_path).join(LIB_FEATURES_DIR)
 }
 
@@ -42,27 +44,16 @@ fn dir_entry_is_file(dir_entry: &fs::DirEntry) -> bool {
         .is_file()
 }
 
-/// Retrieve names of all lang-related unstable features
-fn collect_unstable_lang_feature_names(base_src_path: &path::Path) -> HashSet<String> {
-    collect_lang_features(base_src_path)
-        .into_iter()
-        .filter(|&(_, ref f)| f.level == Status::Unstable)
-        .map(|(ref name, _)| name.to_owned())
-        .collect()
-}
-
-/// Retrieve names of all lib-related unstable features
-fn collect_unstable_lib_feature_names(base_src_path: &path::Path) -> HashSet<String> {
-    let mut bad = true;
-    let lang_features = collect_lang_features(base_src_path);
-    collect_lib_features(base_src_path, &mut bad, &lang_features)
-        .into_iter()
+/// Retrieve names of all unstable features
+pub fn collect_unstable_feature_names(features: &Features) -> HashSet<String> {
+    features
+        .iter()
         .filter(|&(_, ref f)| f.level == Status::Unstable)
-        .map(|(ref name, _)| name.to_owned())
+        .map(|(name, _)| name.to_owned())
         .collect()
 }
 
-fn collect_unstable_book_section_file_names(dir: &path::Path) -> HashSet<String> {
+pub fn collect_unstable_book_section_file_names(dir: &path::Path) -> HashSet<String> {
     fs::read_dir(dir)
         .expect("could not read directory")
         .into_iter()
@@ -95,19 +86,13 @@ pub fn check(path: &path::Path, bad: &mut bool) {
 
     // Library features
 
-    let unstable_lib_feature_names = collect_unstable_lib_feature_names(path);
+    let lang_features = collect_lang_features(path);
+    let lib_features = collect_lib_features(path, bad, &lang_features);
+
+    let unstable_lib_feature_names = collect_unstable_feature_names(&lib_features);
     let unstable_book_lib_features_section_file_names =
         collect_unstable_book_lib_features_section_file_names(path);
 
-    // Check for unstable features that don't have Unstable Book sections
-    for feature_name in &unstable_lib_feature_names -
-                        &unstable_book_lib_features_section_file_names {
-        tidy_error!(bad,
-                    "Unstable library feature '{}' needs to have a section within the \
-                     'library features' section of The Unstable Book",
-                    feature_name);
-    }
-
     // Check for Unstable Book sections that don't have a corresponding unstable feature
     for feature_name in &unstable_book_lib_features_section_file_names -
                         &unstable_lib_feature_names {
@@ -119,18 +104,10 @@ pub fn check(path: &path::Path, bad: &mut bool) {
 
     // Language features
 
-    let unstable_lang_feature_names = collect_unstable_lang_feature_names(path);
+    let unstable_lang_feature_names = collect_unstable_feature_names(&lang_features);
     let unstable_book_lang_features_section_file_names =
         collect_unstable_book_lang_features_section_file_names(path);
 
-    for feature_name in &unstable_lang_feature_names -
-                        &unstable_book_lang_features_section_file_names {
-        tidy_error!(bad,
-                    "Unstable language feature '{}' needs to have a section within the \
-                     'language features' section of The Unstable Book",
-                    feature_name);
-    }
-
     // Check for Unstable Book sections that don't have a corresponding unstable feature
     for feature_name in &unstable_book_lang_features_section_file_names -
                         &unstable_lang_feature_names {
@@ -139,4 +116,20 @@ pub fn check(path: &path::Path, bad: &mut bool) {
                      correspond to an unstable language feature",
                     feature_name)
     }
+
+    // List unstable features that don't have Unstable Book sections
+    // Remove the comment marker if you want the list printed
+    /*
+    println!("Lib features without unstable book sections:");
+    for feature_name in &unstable_lang_feature_names -
+                        &unstable_book_lang_features_section_file_names {
+        println!("    * {} {:?}", feature_name, lib_features[&feature_name].tracking_issue);
+    }
+
+    println!("Lang features without unstable book sections:");
+    for feature_name in &unstable_lib_feature_names-
+                        &unstable_book_lib_features_section_file_names {
+        println!("    * {} {:?}", feature_name, lang_features[&feature_name].tracking_issue);
+    }
+    // */
 }
diff --git a/src/tools/unstable-book-gen/Cargo.toml b/src/tools/unstable-book-gen/Cargo.toml
new file mode 100644
index 00000000000..4751a5e4151
--- /dev/null
+++ b/src/tools/unstable-book-gen/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+authors = ["est31 <MTest31@outlook.com>",
+           "The Rust Project Developers"]
+name = "unstable-book-gen"
+version = "0.1.0"
+license = "MIT/Apache-2.0"
+
+[dependencies]
+tidy = { path = "../tidy" }
diff --git a/src/tools/unstable-book-gen/src/SUMMARY.md b/src/tools/unstable-book-gen/src/SUMMARY.md
new file mode 100644
index 00000000000..933c928e2f0
--- /dev/null
+++ b/src/tools/unstable-book-gen/src/SUMMARY.md
@@ -0,0 +1,8 @@
+[The Unstable Book](the-unstable-book.md)
+
+- [Compiler flags](compiler-flags.md)
+{compiler_flags}
+- [Language features](language-features.md)
+{language_features}
+- [Library Features](library-features.md)
+{library_features}
diff --git a/src/tools/unstable-book-gen/src/main.rs b/src/tools/unstable-book-gen/src/main.rs
new file mode 100644
index 00000000000..adec73d4a69
--- /dev/null
+++ b/src/tools/unstable-book-gen/src/main.rs
@@ -0,0 +1,149 @@
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Auto-generate stub docs for the unstable book
+
+#![deny(warnings)]
+
+extern crate tidy;
+
+use tidy::features::{Feature, Features, collect_lib_features, collect_lang_features};
+use tidy::unstable_book::{collect_unstable_feature_names, collect_unstable_book_section_file_names,
+                          PATH_STR, LANG_FEATURES_DIR, LIB_FEATURES_DIR};
+use std::collections::HashSet;
+use std::io::Write;
+use std::fs::{self, File};
+use std::env;
+use std::path::Path;
+
+/// A helper macro to `unwrap` a result except also print out details like:
+///
+/// * The file/line of the panic
+/// * The expression that failed
+/// * The error itself
+macro_rules! t {
+    ($e:expr) => (match $e {
+        Ok(e) => e,
+        Err(e) => panic!("{} failed with {}", stringify!($e), e),
+    })
+}
+
+fn generate_stub_issue(path: &Path, name: &str, issue: u32) {
+    let mut file = t!(File::create(path));
+    t!(file.write_fmt(format_args!(include_str!("stub-issue.md"),
+                                   name = name,
+                                   issue = issue)));
+}
+
+fn generate_stub_no_issue(path: &Path, name: &str) {
+    let mut file = t!(File::create(path));
+    t!(file.write_fmt(format_args!(include_str!("stub-no-issue.md"),
+                                   name = name)));
+}
+
+fn hset_to_summary_str(hset: HashSet<String>, dir: &str
+) -> String {
+    hset
+        .iter()
+        .map(|ref n| format!("    - [{}]({}/{}.md)",
+                                      n,
+                                      dir,
+                                      n.replace('_', "-")))
+        .fold("".to_owned(), |s, a| s + &a + "\n")
+}
+
+fn generate_summary(path: &Path, lang_features: &Features, lib_features: &Features) {
+    let compiler_flags = collect_unstable_book_section_file_names(
+        &path.join("compiler-flags"));
+
+    let compiler_flags_str = hset_to_summary_str(compiler_flags,
+                                                 "compiler-flags");
+
+    let unstable_lang_features = collect_unstable_feature_names(&lang_features);
+    let unstable_lib_features = collect_unstable_feature_names(&lib_features);
+
+    let lang_features_str = hset_to_summary_str(unstable_lang_features,
+                                                LANG_FEATURES_DIR);
+    let lib_features_str = hset_to_summary_str(unstable_lib_features,
+                                               LIB_FEATURES_DIR);
+
+    let mut file = t!(File::create(&path.join("SUMMARY.md")));
+    t!(file.write_fmt(format_args!(include_str!("SUMMARY.md"),
+                                   compiler_flags = compiler_flags_str,
+                                   language_features = lang_features_str,
+                                   library_features = lib_features_str)));
+
+}
+
+fn has_valid_tracking_issue(f: &Feature) -> bool {
+    if let Some(n) = f.tracking_issue {
+        if n > 0 {
+            return true;
+        }
+    }
+    false
+}
+
+fn generate_unstable_book_files(src :&Path, out: &Path, features :&Features) {
+    let unstable_features = collect_unstable_feature_names(features);
+    let unstable_section_file_names = collect_unstable_book_section_file_names(src);
+    t!(fs::create_dir_all(&out));
+    for feature_name in &unstable_features - &unstable_section_file_names {
+        let file_name = format!("{}.md", feature_name.replace('_', "-"));
+        let out_file_path = out.join(&file_name);
+        let feature = &features[&feature_name];
+
+        if has_valid_tracking_issue(&feature) {
+            generate_stub_issue(&out_file_path, &feature_name, feature.tracking_issue.unwrap());
+        } else {
+            generate_stub_no_issue(&out_file_path, &feature_name);
+        }
+    }
+}
+
+fn copy_recursive(path: &Path, to: &Path) {
+    for entry in t!(fs::read_dir(path)) {
+        let e = t!(entry);
+        let t = t!(e.metadata());
+        let dest = &to.join(e.file_name());
+        if t.is_file() {
+            t!(fs::copy(&e.path(), dest));
+        } else if t.is_dir() {
+            t!(fs::create_dir_all(dest));
+            copy_recursive(&e.path(), dest);
+        }
+    }
+}
+
+fn main() {
+    let src_path_str = env::args_os().skip(1).next().expect("source path required");
+    let dest_path_str = env::args_os().skip(2).next().expect("destination path required");
+    let src_path = Path::new(&src_path_str);
+    let dest_path = Path::new(&dest_path_str).join("src");
+
+    let lang_features = collect_lang_features(src_path);
+    let mut bad = false;
+    let lib_features = collect_lib_features(src_path, &mut bad, &lang_features);
+
+    let doc_src_path = src_path.join(PATH_STR);
+
+    t!(fs::create_dir_all(&dest_path));
+
+    generate_unstable_book_files(&doc_src_path.join(LANG_FEATURES_DIR),
+                                 &dest_path.join(LANG_FEATURES_DIR),
+                                 &lang_features);
+    generate_unstable_book_files(&doc_src_path.join(LIB_FEATURES_DIR),
+                                 &dest_path.join(LIB_FEATURES_DIR),
+                                 &lib_features);
+
+    copy_recursive(&doc_src_path, &dest_path);
+
+    generate_summary(&dest_path, &lang_features, &lib_features);
+}
diff --git a/src/tools/unstable-book-gen/src/stub-issue.md b/src/tools/unstable-book-gen/src/stub-issue.md
new file mode 100644
index 00000000000..8698fb7278f
--- /dev/null
+++ b/src/tools/unstable-book-gen/src/stub-issue.md
@@ -0,0 +1,7 @@
+# `{name}`
+
+The tracking issue for this feature is: [#{issue}]
+
+[#{issue}]: https://github.com/rust-lang/rust/issues/{issue}
+
+------------------------
diff --git a/src/tools/unstable-book-gen/src/stub-no-issue.md b/src/tools/unstable-book-gen/src/stub-no-issue.md
new file mode 100644
index 00000000000..3da140633d0
--- /dev/null
+++ b/src/tools/unstable-book-gen/src/stub-no-issue.md
@@ -0,0 +1,5 @@
+# `{name}`
+
+This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
+
+------------------------