summaryrefslogtreecommitdiffstats
path: root/src/doc/book/listings/ch19-advanced-features
diff options
context:
space:
mode:
Diffstat (limited to 'src/doc/book/listings/ch19-advanced-features')
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-01/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-01/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-01/src/main.rs8
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-02/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-02/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-02/src/main.rs6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-03/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-03/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-03/src/main.rs13
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-04/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-04/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-04/src/main.rs12
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-05/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-05/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-05/output.txt17
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-05/src/main.rs14
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-06/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-06/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-06/src/main.rs22
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-07/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-07/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-07/src/main.rs10
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-08/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-08/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-08/src/main.rs9
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-09/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-09/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-09/src/main.rs5
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-10/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-10/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-10/src/main.rs15
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-11/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-11/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-11/src/main.rs9
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-12/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-12/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-12/src/lib.rs5
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-13/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-13/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-13/src/lib.rs3
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-14/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-14/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-14/src/main.rs25
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-15/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-15/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-15/src/lib.rs12
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-16/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-16/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-16/src/main.rs31
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-17/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-17/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-17/src/main.rs34
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-18/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-18/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-18/output.txt7
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-18/src/main.rs36
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-19/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-19/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-19/output.txt5
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-19/src/main.rs21
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-20/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-20/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-20/output.txt12
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-20/src/main.rs23
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-21/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-21/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-21/output.txt5
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-21/src/main.rs23
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-22/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-22/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-22/src/main.rs17
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-23/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-23/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-23/src/main.rs14
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-24/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-24/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-24/src/main.rs16
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-25/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-25/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-25/src/main.rs18
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-27/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-27/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-27/src/main.rs13
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-28/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-28/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-28/src/lib.rs12
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-30/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-30/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-30/src/main.rs9
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/hello_macro_derive/Cargo.lock46
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/hello_macro_derive/Cargo.toml11
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/hello_macro_derive/src/lib.rs13
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/src/lib.rs3
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/src/main.rs13
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/hello_macro_derive/Cargo.lock46
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/hello_macro_derive/Cargo.toml11
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/hello_macro_derive/src/lib.rs27
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/src/lib.rs3
-rw-r--r--src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/src/main.rs13
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-01-unsafe-fn/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-01-unsafe-fn/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-01-unsafe-fn/src/main.rs9
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/output.txt18
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/src/main.rs27
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-03-impl-display-for-point/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-03-impl-display-for-point/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-03-impl-display-for-point/src/main.rs33
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-04-kilometers-alias/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-04-kilometers-alias/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-04-kilometers-alias/src/main.rs12
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-05-write-trait/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-05-write-trait/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-05-write-trait/src/lib.rs10
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-06-result-alias/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-06-result-alias/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-06-result-alias/src/lib.rs15
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-07-never-type/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-07-never-type/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-07-never-type/src/lib.rs8
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-08-match-arms-different-types/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-08-match-arms-different-types/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-08-match-arms-different-types/src/main.rs9
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-09-unwrap-definition/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-09-unwrap-definition/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-09-unwrap-definition/src/lib.rs17
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-10-loop-returns-never/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-10-loop-returns-never/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-10-loop-returns-never/src/main.rs9
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-11-cant-create-str/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-11-cant-create-str/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-11-cant-create-str/src/main.rs6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-12-generic-fn-definition/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-12-generic-fn-definition/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-12-generic-fn-definition/src/lib.rs3
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-13-generic-implicit-sized-bound/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-13-generic-implicit-sized-bound/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-13-generic-implicit-sized-bound/src/lib.rs3
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-14-generic-maybe-sized/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-14-generic-maybe-sized/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-14-generic-maybe-sized/src/lib.rs3
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-15-map-closure/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-15-map-closure/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-15-map-closure/src/main.rs7
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-16-map-function/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-16-map-function/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-16-map-function/src/main.rs7
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-17-map-initializer/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-17-map-initializer/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-17-map-initializer/src/main.rs10
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/output.txt16
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/src/lib.rs3
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-19-returns-closure-trait-object/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-19-returns-closure-trait-object/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-19-returns-closure-trait-object/src/lib.rs3
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/hello_macro/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/hello_macro/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/hello_macro/src/lib.rs3
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/pancakes/Cargo.lock13
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/pancakes/Cargo.toml7
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/pancakes/src/main.rs13
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/hello_macro_derive/Cargo.lock46
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/hello_macro_derive/Cargo.toml11
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/hello_macro_derive/src/lib.rs25
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/src/lib.rs3
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/src/main.rs13
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/pancakes/Cargo.lock58
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/pancakes/Cargo.toml8
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/pancakes/src/main.rs9
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-22-iterator-on-counter/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-22-iterator-on-counter/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/no-listing-22-iterator-on-counter/src/lib.rs25
-rw-r--r--src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/Cargo.lock6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/Cargo.toml6
-rw-r--r--src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/output.txt12
-rw-r--r--src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/src/main.rs7
185 files changed, 1784 insertions, 0 deletions
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-01/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-01/Cargo.lock
new file mode 100644
index 000000000..497817bf2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-01/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "unsafe-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-01/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-01/Cargo.toml
new file mode 100644
index 000000000..3e8a29201
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-01/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "unsafe-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-01/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-01/src/main.rs
new file mode 100644
index 000000000..893f57890
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-01/src/main.rs
@@ -0,0 +1,8 @@
+fn main() {
+ // ANCHOR: here
+ let mut num = 5;
+
+ let r1 = &num as *const i32;
+ let r2 = &mut num as *mut i32;
+ // ANCHOR_END: here
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-02/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-02/Cargo.lock
new file mode 100644
index 000000000..497817bf2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-02/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "unsafe-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-02/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-02/Cargo.toml
new file mode 100644
index 000000000..3e8a29201
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-02/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "unsafe-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-02/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-02/src/main.rs
new file mode 100644
index 000000000..849629a7c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-02/src/main.rs
@@ -0,0 +1,6 @@
+fn main() {
+ // ANCHOR: here
+ let address = 0x012345usize;
+ let r = address as *const i32;
+ // ANCHOR_END: here
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-03/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-03/Cargo.lock
new file mode 100644
index 000000000..497817bf2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-03/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "unsafe-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-03/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-03/Cargo.toml
new file mode 100644
index 000000000..3e8a29201
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-03/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "unsafe-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-03/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-03/src/main.rs
new file mode 100644
index 000000000..02a0be6b0
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-03/src/main.rs
@@ -0,0 +1,13 @@
+fn main() {
+ // ANCHOR: here
+ let mut num = 5;
+
+ let r1 = &num as *const i32;
+ let r2 = &mut num as *mut i32;
+
+ unsafe {
+ println!("r1 is: {}", *r1);
+ println!("r2 is: {}", *r2);
+ }
+ // ANCHOR_END: here
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-04/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-04/Cargo.lock
new file mode 100644
index 000000000..497817bf2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-04/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "unsafe-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-04/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-04/Cargo.toml
new file mode 100644
index 000000000..3e8a29201
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-04/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "unsafe-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-04/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-04/src/main.rs
new file mode 100644
index 000000000..6ac58442d
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-04/src/main.rs
@@ -0,0 +1,12 @@
+fn main() {
+ // ANCHOR: here
+ let mut v = vec![1, 2, 3, 4, 5, 6];
+
+ let r = &mut v[..];
+
+ let (a, b) = r.split_at_mut(3);
+
+ assert_eq!(a, &mut [1, 2, 3]);
+ assert_eq!(b, &mut [4, 5, 6]);
+ // ANCHOR_END: here
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-05/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-05/Cargo.lock
new file mode 100644
index 000000000..497817bf2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-05/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "unsafe-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-05/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-05/Cargo.toml
new file mode 100644
index 000000000..3e8a29201
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-05/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "unsafe-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-05/output.txt b/src/doc/book/listings/ch19-advanced-features/listing-19-05/output.txt
new file mode 100644
index 000000000..f4b7582ac
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-05/output.txt
@@ -0,0 +1,17 @@
+$ cargo run
+ Compiling unsafe-example v0.1.0 (file:///projects/unsafe-example)
+error[E0499]: cannot borrow `*values` as mutable more than once at a time
+ --> src/main.rs:6:31
+ |
+1 | fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) {
+ | - let's call the lifetime of this reference `'1`
+...
+6 | (&mut values[..mid], &mut values[mid..])
+ | --------------------------^^^^^^--------
+ | | | |
+ | | | second mutable borrow occurs here
+ | | first mutable borrow occurs here
+ | returning this value requires that `*values` is borrowed for `'1`
+
+For more information about this error, try `rustc --explain E0499`.
+error: could not compile `unsafe-example` due to previous error
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-05/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-05/src/main.rs
new file mode 100644
index 000000000..dabf63de1
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-05/src/main.rs
@@ -0,0 +1,14 @@
+// ANCHOR: here
+fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) {
+ let len = values.len();
+
+ assert!(mid <= len);
+
+ (&mut values[..mid], &mut values[mid..])
+}
+// ANCHOR_END: here
+
+fn main() {
+ let mut vector = vec![1, 2, 3, 4, 5, 6];
+ let (left, right) = split_at_mut(&mut vector, 3);
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-06/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-06/Cargo.lock
new file mode 100644
index 000000000..497817bf2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-06/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "unsafe-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-06/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-06/Cargo.toml
new file mode 100644
index 000000000..3e8a29201
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-06/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "unsafe-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-06/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-06/src/main.rs
new file mode 100644
index 000000000..3af21f761
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-06/src/main.rs
@@ -0,0 +1,22 @@
+// ANCHOR: here
+use std::slice;
+
+fn split_at_mut(values: &mut [i32], mid: usize) -> (&mut [i32], &mut [i32]) {
+ let len = values.len();
+ let ptr = values.as_mut_ptr();
+
+ assert!(mid <= len);
+
+ unsafe {
+ (
+ slice::from_raw_parts_mut(ptr, mid),
+ slice::from_raw_parts_mut(ptr.add(mid), len - mid),
+ )
+ }
+}
+// ANCHOR_END: here
+
+fn main() {
+ let mut vector = vec![1, 2, 3, 4, 5, 6];
+ let (left, right) = split_at_mut(&mut vector, 3);
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-07/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-07/Cargo.lock
new file mode 100644
index 000000000..497817bf2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-07/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "unsafe-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-07/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-07/Cargo.toml
new file mode 100644
index 000000000..3e8a29201
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-07/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "unsafe-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-07/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-07/src/main.rs
new file mode 100644
index 000000000..b4d6cdb7c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-07/src/main.rs
@@ -0,0 +1,10 @@
+fn main() {
+ // ANCHOR: here
+ use std::slice;
+
+ let address = 0x01234usize;
+ let r = address as *mut i32;
+
+ let values: &[i32] = unsafe { slice::from_raw_parts_mut(r, 10000) };
+ // ANCHOR_END: here
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-08/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-08/Cargo.lock
new file mode 100644
index 000000000..497817bf2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-08/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "unsafe-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-08/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-08/Cargo.toml
new file mode 100644
index 000000000..3e8a29201
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-08/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "unsafe-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-08/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-08/src/main.rs
new file mode 100644
index 000000000..8b56630c9
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-08/src/main.rs
@@ -0,0 +1,9 @@
+extern "C" {
+ fn abs(input: i32) -> i32;
+}
+
+fn main() {
+ unsafe {
+ println!("Absolute value of -3 according to C: {}", abs(-3));
+ }
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-09/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-09/Cargo.lock
new file mode 100644
index 000000000..497817bf2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-09/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "unsafe-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-09/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-09/Cargo.toml
new file mode 100644
index 000000000..3e8a29201
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-09/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "unsafe-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-09/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-09/src/main.rs
new file mode 100644
index 000000000..82a4b4219
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-09/src/main.rs
@@ -0,0 +1,5 @@
+static HELLO_WORLD: &str = "Hello, world!";
+
+fn main() {
+ println!("name is: {}", HELLO_WORLD);
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-10/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-10/Cargo.lock
new file mode 100644
index 000000000..497817bf2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-10/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "unsafe-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-10/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-10/Cargo.toml
new file mode 100644
index 000000000..3e8a29201
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-10/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "unsafe-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-10/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-10/src/main.rs
new file mode 100644
index 000000000..e8dab68e0
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-10/src/main.rs
@@ -0,0 +1,15 @@
+static mut COUNTER: u32 = 0;
+
+fn add_to_count(inc: u32) {
+ unsafe {
+ COUNTER += inc;
+ }
+}
+
+fn main() {
+ add_to_count(3);
+
+ unsafe {
+ println!("COUNTER: {}", COUNTER);
+ }
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-11/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-11/Cargo.lock
new file mode 100644
index 000000000..497817bf2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-11/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "unsafe-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-11/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-11/Cargo.toml
new file mode 100644
index 000000000..3e8a29201
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-11/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "unsafe-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-11/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-11/src/main.rs
new file mode 100644
index 000000000..885c1aa1d
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-11/src/main.rs
@@ -0,0 +1,9 @@
+unsafe trait Foo {
+ // methods go here
+}
+
+unsafe impl Foo for i32 {
+ // method implementations go here
+}
+
+fn main() {}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-12/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-12/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-12/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-12/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-12/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-12/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-12/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-12/src/lib.rs
new file mode 100644
index 000000000..dbe04620e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-12/src/lib.rs
@@ -0,0 +1,5 @@
+pub trait Iterator {
+ type Item;
+
+ fn next(&mut self) -> Option<Self::Item>;
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-13/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-13/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-13/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-13/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-13/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-13/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-13/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-13/src/lib.rs
new file mode 100644
index 000000000..7c9479c5b
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-13/src/lib.rs
@@ -0,0 +1,3 @@
+pub trait Iterator<T> {
+ fn next(&mut self) -> Option<T>;
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-14/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-14/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-14/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-14/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-14/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-14/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-14/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-14/src/main.rs
new file mode 100644
index 000000000..9111fbc55
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-14/src/main.rs
@@ -0,0 +1,25 @@
+use std::ops::Add;
+
+#[derive(Debug, Copy, Clone, PartialEq)]
+struct Point {
+ x: i32,
+ y: i32,
+}
+
+impl Add for Point {
+ type Output = Point;
+
+ fn add(self, other: Point) -> Point {
+ Point {
+ x: self.x + other.x,
+ y: self.y + other.y,
+ }
+ }
+}
+
+fn main() {
+ assert_eq!(
+ Point { x: 1, y: 0 } + Point { x: 2, y: 3 },
+ Point { x: 3, y: 3 }
+ );
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-15/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-15/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-15/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-15/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-15/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-15/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-15/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-15/src/lib.rs
new file mode 100644
index 000000000..f38bf475c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-15/src/lib.rs
@@ -0,0 +1,12 @@
+use std::ops::Add;
+
+struct Millimeters(u32);
+struct Meters(u32);
+
+impl Add<Meters> for Millimeters {
+ type Output = Millimeters;
+
+ fn add(self, other: Meters) -> Millimeters {
+ Millimeters(self.0 + (other.0 * 1000))
+ }
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-16/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-16/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-16/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-16/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-16/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-16/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-16/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-16/src/main.rs
new file mode 100644
index 000000000..d854e287d
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-16/src/main.rs
@@ -0,0 +1,31 @@
+// ANCHOR: here
+trait Pilot {
+ fn fly(&self);
+}
+
+trait Wizard {
+ fn fly(&self);
+}
+
+struct Human;
+
+impl Pilot for Human {
+ fn fly(&self) {
+ println!("This is your captain speaking.");
+ }
+}
+
+impl Wizard for Human {
+ fn fly(&self) {
+ println!("Up!");
+ }
+}
+
+impl Human {
+ fn fly(&self) {
+ println!("*waving arms furiously*");
+ }
+}
+// ANCHOR_END: here
+
+fn main() {}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-17/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-17/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-17/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-17/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-17/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-17/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-17/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-17/src/main.rs
new file mode 100644
index 000000000..3df65a7ce
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-17/src/main.rs
@@ -0,0 +1,34 @@
+trait Pilot {
+ fn fly(&self);
+}
+
+trait Wizard {
+ fn fly(&self);
+}
+
+struct Human;
+
+impl Pilot for Human {
+ fn fly(&self) {
+ println!("This is your captain speaking.");
+ }
+}
+
+impl Wizard for Human {
+ fn fly(&self) {
+ println!("Up!");
+ }
+}
+
+impl Human {
+ fn fly(&self) {
+ println!("*waving arms furiously*");
+ }
+}
+
+// ANCHOR: here
+fn main() {
+ let person = Human;
+ person.fly();
+}
+// ANCHOR_END: here
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-18/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-18/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-18/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-18/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-18/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-18/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-18/output.txt b/src/doc/book/listings/ch19-advanced-features/listing-19-18/output.txt
new file mode 100644
index 000000000..2e9da17d6
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-18/output.txt
@@ -0,0 +1,7 @@
+$ cargo run
+ Compiling traits-example v0.1.0 (file:///projects/traits-example)
+ Finished dev [unoptimized + debuginfo] target(s) in 0.46s
+ Running `target/debug/traits-example`
+This is your captain speaking.
+Up!
+*waving arms furiously*
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-18/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-18/src/main.rs
new file mode 100644
index 000000000..fa01c09cc
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-18/src/main.rs
@@ -0,0 +1,36 @@
+trait Pilot {
+ fn fly(&self);
+}
+
+trait Wizard {
+ fn fly(&self);
+}
+
+struct Human;
+
+impl Pilot for Human {
+ fn fly(&self) {
+ println!("This is your captain speaking.");
+ }
+}
+
+impl Wizard for Human {
+ fn fly(&self) {
+ println!("Up!");
+ }
+}
+
+impl Human {
+ fn fly(&self) {
+ println!("*waving arms furiously*");
+ }
+}
+
+// ANCHOR: here
+fn main() {
+ let person = Human;
+ Pilot::fly(&person);
+ Wizard::fly(&person);
+ person.fly();
+}
+// ANCHOR_END: here
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-19/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-19/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-19/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-19/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-19/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-19/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-19/output.txt b/src/doc/book/listings/ch19-advanced-features/listing-19-19/output.txt
new file mode 100644
index 000000000..087e802b1
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-19/output.txt
@@ -0,0 +1,5 @@
+$ cargo run
+ Compiling traits-example v0.1.0 (file:///projects/traits-example)
+ Finished dev [unoptimized + debuginfo] target(s) in 0.54s
+ Running `target/debug/traits-example`
+A baby dog is called a Spot
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-19/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-19/src/main.rs
new file mode 100644
index 000000000..44affe0ee
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-19/src/main.rs
@@ -0,0 +1,21 @@
+trait Animal {
+ fn baby_name() -> String;
+}
+
+struct Dog;
+
+impl Dog {
+ fn baby_name() -> String {
+ String::from("Spot")
+ }
+}
+
+impl Animal for Dog {
+ fn baby_name() -> String {
+ String::from("puppy")
+ }
+}
+
+fn main() {
+ println!("A baby dog is called a {}", Dog::baby_name());
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-20/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-20/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-20/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-20/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-20/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-20/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-20/output.txt b/src/doc/book/listings/ch19-advanced-features/listing-19-20/output.txt
new file mode 100644
index 000000000..684508245
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-20/output.txt
@@ -0,0 +1,12 @@
+$ cargo run
+ Compiling traits-example v0.1.0 (file:///projects/traits-example)
+error[E0283]: type annotations needed
+ --> src/main.rs:20:43
+ |
+20 | println!("A baby dog is called a {}", Animal::baby_name());
+ | ^^^^^^^^^^^^^^^^^ cannot infer type
+ |
+ = note: cannot satisfy `_: Animal`
+
+For more information about this error, try `rustc --explain E0283`.
+error: could not compile `traits-example` due to previous error
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-20/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-20/src/main.rs
new file mode 100644
index 000000000..8e295c9b6
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-20/src/main.rs
@@ -0,0 +1,23 @@
+trait Animal {
+ fn baby_name() -> String;
+}
+
+struct Dog;
+
+impl Dog {
+ fn baby_name() -> String {
+ String::from("Spot")
+ }
+}
+
+impl Animal for Dog {
+ fn baby_name() -> String {
+ String::from("puppy")
+ }
+}
+
+// ANCHOR: here
+fn main() {
+ println!("A baby dog is called a {}", Animal::baby_name());
+}
+// ANCHOR_END: here
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-21/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-21/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-21/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-21/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-21/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-21/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-21/output.txt b/src/doc/book/listings/ch19-advanced-features/listing-19-21/output.txt
new file mode 100644
index 000000000..4d1ee5ab4
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-21/output.txt
@@ -0,0 +1,5 @@
+$ cargo run
+ Compiling traits-example v0.1.0 (file:///projects/traits-example)
+ Finished dev [unoptimized + debuginfo] target(s) in 0.48s
+ Running `target/debug/traits-example`
+A baby dog is called a puppy
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-21/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-21/src/main.rs
new file mode 100644
index 000000000..b1df72895
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-21/src/main.rs
@@ -0,0 +1,23 @@
+trait Animal {
+ fn baby_name() -> String;
+}
+
+struct Dog;
+
+impl Dog {
+ fn baby_name() -> String {
+ String::from("Spot")
+ }
+}
+
+impl Animal for Dog {
+ fn baby_name() -> String {
+ String::from("puppy")
+ }
+}
+
+// ANCHOR: here
+fn main() {
+ println!("A baby dog is called a {}", <Dog as Animal>::baby_name());
+}
+// ANCHOR_END: here
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-22/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-22/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-22/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-22/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-22/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-22/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-22/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-22/src/main.rs
new file mode 100644
index 000000000..febe58b0c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-22/src/main.rs
@@ -0,0 +1,17 @@
+// ANCHOR: here
+use std::fmt;
+
+trait OutlinePrint: fmt::Display {
+ fn outline_print(&self) {
+ let output = self.to_string();
+ let len = output.len();
+ println!("{}", "*".repeat(len + 4));
+ println!("*{}*", " ".repeat(len + 2));
+ println!("* {} *", output);
+ println!("*{}*", " ".repeat(len + 2));
+ println!("{}", "*".repeat(len + 4));
+ }
+}
+// ANCHOR_END: here
+
+fn main() {}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-23/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-23/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-23/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-23/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-23/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-23/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-23/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-23/src/main.rs
new file mode 100644
index 000000000..eae46c92f
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-23/src/main.rs
@@ -0,0 +1,14 @@
+use std::fmt;
+
+struct Wrapper(Vec<String>);
+
+impl fmt::Display for Wrapper {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ write!(f, "[{}]", self.0.join(", "))
+ }
+}
+
+fn main() {
+ let w = Wrapper(vec![String::from("hello"), String::from("world")]);
+ println!("w = {}", w);
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-24/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-24/Cargo.lock
new file mode 100644
index 000000000..c0c98a79c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-24/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "types-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-24/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-24/Cargo.toml
new file mode 100644
index 000000000..a2ae20c77
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-24/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "types-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-24/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-24/src/main.rs
new file mode 100644
index 000000000..d604ae8d6
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-24/src/main.rs
@@ -0,0 +1,16 @@
+fn main() {
+ // ANCHOR: here
+ let f: Box<dyn Fn() + Send + 'static> = Box::new(|| println!("hi"));
+
+ fn takes_long_type(f: Box<dyn Fn() + Send + 'static>) {
+ // --snip--
+ }
+
+ fn returns_long_type() -> Box<dyn Fn() + Send + 'static> {
+ // --snip--
+ // ANCHOR_END: here
+ Box::new(|| ())
+ // ANCHOR: here
+ }
+ // ANCHOR_END: here
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-25/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-25/Cargo.lock
new file mode 100644
index 000000000..c0c98a79c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-25/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "types-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-25/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-25/Cargo.toml
new file mode 100644
index 000000000..a2ae20c77
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-25/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "types-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-25/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-25/src/main.rs
new file mode 100644
index 000000000..af35bed2c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-25/src/main.rs
@@ -0,0 +1,18 @@
+fn main() {
+ // ANCHOR: here
+ type Thunk = Box<dyn Fn() + Send + 'static>;
+
+ let f: Thunk = Box::new(|| println!("hi"));
+
+ fn takes_long_type(f: Thunk) {
+ // --snip--
+ }
+
+ fn returns_long_type() -> Thunk {
+ // --snip--
+ // ANCHOR_END: here
+ Box::new(|| ())
+ // ANCHOR: here
+ }
+ // ANCHOR_END: here
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-27/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-27/Cargo.lock
new file mode 100644
index 000000000..b2327c755
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-27/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "functions-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-27/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-27/Cargo.toml
new file mode 100644
index 000000000..b196f35b5
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-27/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "functions-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-27/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-27/src/main.rs
new file mode 100644
index 000000000..91b2cf04b
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-27/src/main.rs
@@ -0,0 +1,13 @@
+fn add_one(x: i32) -> i32 {
+ x + 1
+}
+
+fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 {
+ f(arg) + f(arg)
+}
+
+fn main() {
+ let answer = do_twice(add_one, 5);
+
+ println!("The answer is: {}", answer);
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-28/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-28/Cargo.lock
new file mode 100644
index 000000000..b2d925754
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-28/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "macros-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-28/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-28/Cargo.toml
new file mode 100644
index 000000000..9218091c8
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-28/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "macros-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-28/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-28/src/lib.rs
new file mode 100644
index 000000000..7c7c4756c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-28/src/lib.rs
@@ -0,0 +1,12 @@
+#[macro_export]
+macro_rules! vec {
+ ( $( $x:expr ),* ) => {
+ {
+ let mut temp_vec = Vec::new();
+ $(
+ temp_vec.push($x);
+ )*
+ temp_vec
+ }
+ };
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-30/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-30/Cargo.lock
new file mode 100644
index 000000000..39afcf282
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-30/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "hello_macro"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-30/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-30/Cargo.toml
new file mode 100644
index 000000000..c6fb92087
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-30/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "hello_macro"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-30/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-30/src/main.rs
new file mode 100644
index 000000000..468c30aa4
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-30/src/main.rs
@@ -0,0 +1,9 @@
+use hello_macro::HelloMacro;
+use hello_macro_derive::HelloMacro;
+
+#[derive(HelloMacro)]
+struct Pancakes;
+
+fn main() {
+ Pancakes::hello_macro();
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/Cargo.lock
new file mode 100644
index 000000000..39afcf282
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "hello_macro"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/Cargo.toml
new file mode 100644
index 000000000..c6fb92087
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "hello_macro"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/hello_macro_derive/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/hello_macro_derive/Cargo.lock
new file mode 100644
index 000000000..9a38c8ac2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/hello_macro_derive/Cargo.lock
@@ -0,0 +1,46 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "hello_macro_derive"
+version = "0.1.0"
+dependencies = [
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548"
+"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
+"checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5"
+"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/hello_macro_derive/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/hello_macro_derive/Cargo.toml
new file mode 100644
index 000000000..aa076ac48
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/hello_macro_derive/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "hello_macro_derive"
+version = "0.1.0"
+edition = "2021"
+
+[lib]
+proc-macro = true
+
+[dependencies]
+syn = "1.0"
+quote = "1.0"
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/hello_macro_derive/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/hello_macro_derive/src/lib.rs
new file mode 100644
index 000000000..11643a8d6
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/hello_macro_derive/src/lib.rs
@@ -0,0 +1,13 @@
+use proc_macro::TokenStream;
+use quote::quote;
+use syn;
+
+#[proc_macro_derive(HelloMacro)]
+pub fn hello_macro_derive(input: TokenStream) -> TokenStream {
+ // Construct a representation of Rust code as a syntax tree
+ // that we can manipulate
+ let ast = syn::parse(input).unwrap();
+
+ // Build the trait implementation
+ impl_hello_macro(&ast)
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/src/lib.rs
new file mode 100644
index 000000000..e74793184
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/src/lib.rs
@@ -0,0 +1,3 @@
+pub trait HelloMacro {
+ fn hello_macro();
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/src/main.rs
new file mode 100644
index 000000000..10b028b2d
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-31/hello_macro/src/main.rs
@@ -0,0 +1,13 @@
+use hello_macro::HelloMacro;
+
+struct Pancakes;
+
+impl HelloMacro for Pancakes {
+ fn hello_macro() {
+ println!("Hello, Macro! My name is Pancakes!");
+ }
+}
+
+fn main() {
+ Pancakes::hello_macro();
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/Cargo.lock
new file mode 100644
index 000000000..39afcf282
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "hello_macro"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/Cargo.toml
new file mode 100644
index 000000000..c6fb92087
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "hello_macro"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/hello_macro_derive/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/hello_macro_derive/Cargo.lock
new file mode 100644
index 000000000..9a38c8ac2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/hello_macro_derive/Cargo.lock
@@ -0,0 +1,46 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "hello_macro_derive"
+version = "0.1.0"
+dependencies = [
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548"
+"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
+"checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5"
+"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/hello_macro_derive/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/hello_macro_derive/Cargo.toml
new file mode 100644
index 000000000..aa076ac48
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/hello_macro_derive/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "hello_macro_derive"
+version = "0.1.0"
+edition = "2021"
+
+[lib]
+proc-macro = true
+
+[dependencies]
+syn = "1.0"
+quote = "1.0"
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/hello_macro_derive/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/hello_macro_derive/src/lib.rs
new file mode 100644
index 000000000..dac6c98f6
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/hello_macro_derive/src/lib.rs
@@ -0,0 +1,27 @@
+use proc_macro::TokenStream;
+use quote::quote;
+use syn;
+
+#[proc_macro_derive(HelloMacro)]
+pub fn hello_macro_derive(input: TokenStream) -> TokenStream {
+ // Construct a representation of Rust code as a syntax tree
+ // that we can manipulate
+ let ast = syn::parse(input).unwrap();
+
+ // Build the trait implementation
+ impl_hello_macro(&ast)
+}
+
+// ANCHOR: here
+fn impl_hello_macro(ast: &syn::DeriveInput) -> TokenStream {
+ let name = &ast.ident;
+ let gen = quote! {
+ impl HelloMacro for #name {
+ fn hello_macro() {
+ println!("Hello, Macro! My name is {}!", stringify!(#name));
+ }
+ }
+ };
+ gen.into()
+}
+// ANCHOR_END: here
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/src/lib.rs
new file mode 100644
index 000000000..e74793184
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/src/lib.rs
@@ -0,0 +1,3 @@
+pub trait HelloMacro {
+ fn hello_macro();
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/src/main.rs b/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/src/main.rs
new file mode 100644
index 000000000..10b028b2d
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/listing-19-33/hello_macro/src/main.rs
@@ -0,0 +1,13 @@
+use hello_macro::HelloMacro;
+
+struct Pancakes;
+
+impl HelloMacro for Pancakes {
+ fn hello_macro() {
+ println!("Hello, Macro! My name is Pancakes!");
+ }
+}
+
+fn main() {
+ Pancakes::hello_macro();
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-01-unsafe-fn/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-01-unsafe-fn/Cargo.lock
new file mode 100644
index 000000000..497817bf2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-01-unsafe-fn/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "unsafe-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-01-unsafe-fn/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-01-unsafe-fn/Cargo.toml
new file mode 100644
index 000000000..3e8a29201
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-01-unsafe-fn/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "unsafe-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-01-unsafe-fn/src/main.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-01-unsafe-fn/src/main.rs
new file mode 100644
index 000000000..21ecdbe5a
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-01-unsafe-fn/src/main.rs
@@ -0,0 +1,9 @@
+fn main() {
+ // ANCHOR: here
+ unsafe fn dangerous() {}
+
+ unsafe {
+ dangerous();
+ }
+ // ANCHOR_END: here
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/output.txt b/src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/output.txt
new file mode 100644
index 000000000..0991f10fa
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/output.txt
@@ -0,0 +1,18 @@
+$ cargo run
+ Compiling traits-example v0.1.0 (file:///projects/traits-example)
+error[E0277]: `Point` doesn't implement `std::fmt::Display`
+ --> src/main.rs:20:6
+ |
+20 | impl OutlinePrint for Point {}
+ | ^^^^^^^^^^^^ `Point` cannot be formatted with the default formatter
+ |
+ = help: the trait `std::fmt::Display` is not implemented for `Point`
+ = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
+note: required by a bound in `OutlinePrint`
+ --> src/main.rs:3:21
+ |
+3 | trait OutlinePrint: fmt::Display {
+ | ^^^^^^^^^^^^ required by this bound in `OutlinePrint`
+
+For more information about this error, try `rustc --explain E0277`.
+error: could not compile `traits-example` due to previous error
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/src/main.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/src/main.rs
new file mode 100644
index 000000000..a1e2fe4c4
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-02-impl-outlineprint-for-point/src/main.rs
@@ -0,0 +1,27 @@
+use std::fmt;
+
+trait OutlinePrint: fmt::Display {
+ fn outline_print(&self) {
+ let output = self.to_string();
+ let len = output.len();
+ println!("{}", "*".repeat(len + 4));
+ println!("*{}*", " ".repeat(len + 2));
+ println!("* {} *", output);
+ println!("*{}*", " ".repeat(len + 2));
+ println!("{}", "*".repeat(len + 4));
+ }
+}
+
+// ANCHOR: here
+struct Point {
+ x: i32,
+ y: i32,
+}
+
+impl OutlinePrint for Point {}
+// ANCHOR_END: here
+
+fn main() {
+ let p = Point { x: 1, y: 3 };
+ p.outline_print();
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-03-impl-display-for-point/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-03-impl-display-for-point/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-03-impl-display-for-point/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-03-impl-display-for-point/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-03-impl-display-for-point/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-03-impl-display-for-point/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-03-impl-display-for-point/src/main.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-03-impl-display-for-point/src/main.rs
new file mode 100644
index 000000000..c7bbb6a70
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-03-impl-display-for-point/src/main.rs
@@ -0,0 +1,33 @@
+trait OutlinePrint: fmt::Display {
+ fn outline_print(&self) {
+ let output = self.to_string();
+ let len = output.len();
+ println!("{}", "*".repeat(len + 4));
+ println!("*{}*", " ".repeat(len + 2));
+ println!("* {} *", output);
+ println!("*{}*", " ".repeat(len + 2));
+ println!("{}", "*".repeat(len + 4));
+ }
+}
+
+struct Point {
+ x: i32,
+ y: i32,
+}
+
+impl OutlinePrint for Point {}
+
+// ANCHOR: here
+use std::fmt;
+
+impl fmt::Display for Point {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ write!(f, "({}, {})", self.x, self.y)
+ }
+}
+// ANCHOR_END: here
+
+fn main() {
+ let p = Point { x: 1, y: 3 };
+ p.outline_print();
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-04-kilometers-alias/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-04-kilometers-alias/Cargo.lock
new file mode 100644
index 000000000..c0c98a79c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-04-kilometers-alias/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "types-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-04-kilometers-alias/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-04-kilometers-alias/Cargo.toml
new file mode 100644
index 000000000..a2ae20c77
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-04-kilometers-alias/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "types-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-04-kilometers-alias/src/main.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-04-kilometers-alias/src/main.rs
new file mode 100644
index 000000000..d3fe32e2f
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-04-kilometers-alias/src/main.rs
@@ -0,0 +1,12 @@
+fn main() {
+ // ANCHOR: there
+ // ANCHOR: here
+ type Kilometers = i32;
+ // ANCHOR_END: here
+
+ let x: i32 = 5;
+ let y: Kilometers = 5;
+
+ println!("x + y = {}", x + y);
+ // ANCHOR_END: there
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-05-write-trait/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-05-write-trait/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-05-write-trait/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-05-write-trait/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-05-write-trait/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-05-write-trait/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-05-write-trait/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-05-write-trait/src/lib.rs
new file mode 100644
index 000000000..8300dccee
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-05-write-trait/src/lib.rs
@@ -0,0 +1,10 @@
+use std::fmt;
+use std::io::Error;
+
+pub trait Write {
+ fn write(&mut self, buf: &[u8]) -> Result<usize, Error>;
+ fn flush(&mut self) -> Result<(), Error>;
+
+ fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>;
+ fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Error>;
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-06-result-alias/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-06-result-alias/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-06-result-alias/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-06-result-alias/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-06-result-alias/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-06-result-alias/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-06-result-alias/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-06-result-alias/src/lib.rs
new file mode 100644
index 000000000..573559934
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-06-result-alias/src/lib.rs
@@ -0,0 +1,15 @@
+use std::fmt;
+
+// ANCHOR: here
+type Result<T> = std::result::Result<T, std::io::Error>;
+// ANCHOR_END: here
+
+// ANCHOR: there
+pub trait Write {
+ fn write(&mut self, buf: &[u8]) -> Result<usize>;
+ fn flush(&mut self) -> Result<()>;
+
+ fn write_all(&mut self, buf: &[u8]) -> Result<()>;
+ fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<()>;
+}
+// ANCHOR_END: there
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-07-never-type/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-07-never-type/Cargo.lock
new file mode 100644
index 000000000..b1977d01e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-07-never-type/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "traits-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-07-never-type/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-07-never-type/Cargo.toml
new file mode 100644
index 000000000..52395a587
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-07-never-type/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "traits-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-07-never-type/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-07-never-type/src/lib.rs
new file mode 100644
index 000000000..f0f7acac2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-07-never-type/src/lib.rs
@@ -0,0 +1,8 @@
+// ANCHOR: here
+fn bar() -> ! {
+ // --snip--
+ // ANCHOR_END: here
+ panic!();
+ // ANCHOR: here
+}
+// ANCHOR_END: here
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-08-match-arms-different-types/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-08-match-arms-different-types/Cargo.lock
new file mode 100644
index 000000000..c0c98a79c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-08-match-arms-different-types/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "types-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-08-match-arms-different-types/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-08-match-arms-different-types/Cargo.toml
new file mode 100644
index 000000000..a2ae20c77
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-08-match-arms-different-types/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "types-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-08-match-arms-different-types/src/main.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-08-match-arms-different-types/src/main.rs
new file mode 100644
index 000000000..6d56008ad
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-08-match-arms-different-types/src/main.rs
@@ -0,0 +1,9 @@
+fn main() {
+ let guess = "3";
+ // ANCHOR: here
+ let guess = match guess.trim().parse() {
+ Ok(_) => 5,
+ Err(_) => "hello",
+ };
+ // ANCHOR_END: here
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-09-unwrap-definition/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-09-unwrap-definition/Cargo.lock
new file mode 100644
index 000000000..c0c98a79c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-09-unwrap-definition/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "types-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-09-unwrap-definition/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-09-unwrap-definition/Cargo.toml
new file mode 100644
index 000000000..a2ae20c77
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-09-unwrap-definition/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "types-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-09-unwrap-definition/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-09-unwrap-definition/src/lib.rs
new file mode 100644
index 000000000..aa4f937ff
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-09-unwrap-definition/src/lib.rs
@@ -0,0 +1,17 @@
+enum Option<T> {
+ Some(T),
+ None,
+}
+
+use crate::Option::*;
+
+// ANCHOR: here
+impl<T> Option<T> {
+ pub fn unwrap(self) -> T {
+ match self {
+ Some(val) => val,
+ None => panic!("called `Option::unwrap()` on a `None` value"),
+ }
+ }
+}
+// ANCHOR_END: here
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-10-loop-returns-never/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-10-loop-returns-never/Cargo.lock
new file mode 100644
index 000000000..c0c98a79c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-10-loop-returns-never/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "types-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-10-loop-returns-never/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-10-loop-returns-never/Cargo.toml
new file mode 100644
index 000000000..a2ae20c77
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-10-loop-returns-never/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "types-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-10-loop-returns-never/src/main.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-10-loop-returns-never/src/main.rs
new file mode 100644
index 000000000..e7768913b
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-10-loop-returns-never/src/main.rs
@@ -0,0 +1,9 @@
+fn main() {
+ // ANCHOR: here
+ print!("forever ");
+
+ loop {
+ print!("and ever ");
+ }
+ // ANCHOR_END: here
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-11-cant-create-str/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-11-cant-create-str/Cargo.lock
new file mode 100644
index 000000000..c0c98a79c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-11-cant-create-str/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "types-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-11-cant-create-str/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-11-cant-create-str/Cargo.toml
new file mode 100644
index 000000000..a2ae20c77
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-11-cant-create-str/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "types-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-11-cant-create-str/src/main.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-11-cant-create-str/src/main.rs
new file mode 100644
index 000000000..075d5110c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-11-cant-create-str/src/main.rs
@@ -0,0 +1,6 @@
+fn main() {
+ // ANCHOR: here
+ let s1: str = "Hello there!";
+ let s2: str = "How's it going?";
+ // ANCHOR_END: here
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-12-generic-fn-definition/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-12-generic-fn-definition/Cargo.lock
new file mode 100644
index 000000000..c0c98a79c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-12-generic-fn-definition/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "types-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-12-generic-fn-definition/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-12-generic-fn-definition/Cargo.toml
new file mode 100644
index 000000000..a2ae20c77
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-12-generic-fn-definition/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "types-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-12-generic-fn-definition/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-12-generic-fn-definition/src/lib.rs
new file mode 100644
index 000000000..69186ddfb
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-12-generic-fn-definition/src/lib.rs
@@ -0,0 +1,3 @@
+fn generic<T>(t: T) {
+ // --snip--
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-13-generic-implicit-sized-bound/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-13-generic-implicit-sized-bound/Cargo.lock
new file mode 100644
index 000000000..c0c98a79c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-13-generic-implicit-sized-bound/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "types-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-13-generic-implicit-sized-bound/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-13-generic-implicit-sized-bound/Cargo.toml
new file mode 100644
index 000000000..a2ae20c77
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-13-generic-implicit-sized-bound/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "types-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-13-generic-implicit-sized-bound/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-13-generic-implicit-sized-bound/src/lib.rs
new file mode 100644
index 000000000..c2d00e216
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-13-generic-implicit-sized-bound/src/lib.rs
@@ -0,0 +1,3 @@
+fn generic<T: Sized>(t: T) {
+ // --snip--
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-14-generic-maybe-sized/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-14-generic-maybe-sized/Cargo.lock
new file mode 100644
index 000000000..c0c98a79c
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-14-generic-maybe-sized/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "types-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-14-generic-maybe-sized/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-14-generic-maybe-sized/Cargo.toml
new file mode 100644
index 000000000..a2ae20c77
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-14-generic-maybe-sized/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "types-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-14-generic-maybe-sized/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-14-generic-maybe-sized/src/lib.rs
new file mode 100644
index 000000000..e4722267a
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-14-generic-maybe-sized/src/lib.rs
@@ -0,0 +1,3 @@
+fn generic<T: ?Sized>(t: &T) {
+ // --snip--
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-15-map-closure/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-15-map-closure/Cargo.lock
new file mode 100644
index 000000000..b2327c755
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-15-map-closure/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "functions-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-15-map-closure/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-15-map-closure/Cargo.toml
new file mode 100644
index 000000000..b196f35b5
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-15-map-closure/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "functions-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-15-map-closure/src/main.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-15-map-closure/src/main.rs
new file mode 100644
index 000000000..b4fcf7eb8
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-15-map-closure/src/main.rs
@@ -0,0 +1,7 @@
+fn main() {
+ // ANCHOR: here
+ let list_of_numbers = vec![1, 2, 3];
+ let list_of_strings: Vec<String> =
+ list_of_numbers.iter().map(|i| i.to_string()).collect();
+ // ANCHOR_END: here
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-16-map-function/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-16-map-function/Cargo.lock
new file mode 100644
index 000000000..b2327c755
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-16-map-function/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "functions-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-16-map-function/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-16-map-function/Cargo.toml
new file mode 100644
index 000000000..b196f35b5
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-16-map-function/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "functions-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-16-map-function/src/main.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-16-map-function/src/main.rs
new file mode 100644
index 000000000..dff20fe71
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-16-map-function/src/main.rs
@@ -0,0 +1,7 @@
+fn main() {
+ // ANCHOR: here
+ let list_of_numbers = vec![1, 2, 3];
+ let list_of_strings: Vec<String> =
+ list_of_numbers.iter().map(ToString::to_string).collect();
+ // ANCHOR_END: here
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-17-map-initializer/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-17-map-initializer/Cargo.lock
new file mode 100644
index 000000000..b2327c755
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-17-map-initializer/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "functions-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-17-map-initializer/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-17-map-initializer/Cargo.toml
new file mode 100644
index 000000000..b196f35b5
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-17-map-initializer/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "functions-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-17-map-initializer/src/main.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-17-map-initializer/src/main.rs
new file mode 100644
index 000000000..60fb73005
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-17-map-initializer/src/main.rs
@@ -0,0 +1,10 @@
+fn main() {
+ // ANCHOR: here
+ enum Status {
+ Value(u32),
+ Stop,
+ }
+
+ let list_of_statuses: Vec<Status> = (0u32..20).map(Status::Value).collect();
+ // ANCHOR_END: here
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/Cargo.lock
new file mode 100644
index 000000000..b2327c755
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "functions-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/Cargo.toml
new file mode 100644
index 000000000..b196f35b5
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "functions-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/output.txt b/src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/output.txt
new file mode 100644
index 000000000..d6fffc967
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/output.txt
@@ -0,0 +1,16 @@
+$ cargo build
+ Compiling functions-example v0.1.0 (file:///projects/functions-example)
+error[E0746]: return type cannot have an unboxed trait object
+ --> src/lib.rs:1:25
+ |
+1 | fn returns_closure() -> dyn Fn(i32) -> i32 {
+ | ^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
+ |
+ = note: for information on `impl Trait`, see <https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits>
+help: use `impl Fn(i32) -> i32` as the return type, as all return paths are of type `[closure@src/lib.rs:2:5: 2:14]`, which implements `Fn(i32) -> i32`
+ |
+1 | fn returns_closure() -> impl Fn(i32) -> i32 {
+ | ~~~~~~~~~~~~~~~~~~~
+
+For more information about this error, try `rustc --explain E0746`.
+error: could not compile `functions-example` due to previous error
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/src/lib.rs
new file mode 100644
index 000000000..d699ac34e
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-18-returns-closure/src/lib.rs
@@ -0,0 +1,3 @@
+fn returns_closure() -> dyn Fn(i32) -> i32 {
+ |x| x + 1
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-19-returns-closure-trait-object/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-19-returns-closure-trait-object/Cargo.lock
new file mode 100644
index 000000000..b2327c755
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-19-returns-closure-trait-object/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "functions-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-19-returns-closure-trait-object/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-19-returns-closure-trait-object/Cargo.toml
new file mode 100644
index 000000000..b196f35b5
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-19-returns-closure-trait-object/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "functions-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-19-returns-closure-trait-object/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-19-returns-closure-trait-object/src/lib.rs
new file mode 100644
index 000000000..b11407747
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-19-returns-closure-trait-object/src/lib.rs
@@ -0,0 +1,3 @@
+fn returns_closure() -> Box<dyn Fn(i32) -> i32> {
+ Box::new(|x| x + 1)
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/hello_macro/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/hello_macro/Cargo.lock
new file mode 100644
index 000000000..39afcf282
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/hello_macro/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "hello_macro"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/hello_macro/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/hello_macro/Cargo.toml
new file mode 100644
index 000000000..c6fb92087
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/hello_macro/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "hello_macro"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/hello_macro/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/hello_macro/src/lib.rs
new file mode 100644
index 000000000..e74793184
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/hello_macro/src/lib.rs
@@ -0,0 +1,3 @@
+pub trait HelloMacro {
+ fn hello_macro();
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/pancakes/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/pancakes/Cargo.lock
new file mode 100644
index 000000000..881cd3f6d
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/pancakes/Cargo.lock
@@ -0,0 +1,13 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "hello_macro"
+version = "0.1.0"
+
+[[package]]
+name = "pancakes"
+version = "0.1.0"
+dependencies = [
+ "hello_macro 0.1.0",
+]
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/pancakes/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/pancakes/Cargo.toml
new file mode 100644
index 000000000..3ad910862
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/pancakes/Cargo.toml
@@ -0,0 +1,7 @@
+[package]
+name = "pancakes"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+hello_macro = { path = "../hello_macro" } \ No newline at end of file
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/pancakes/src/main.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/pancakes/src/main.rs
new file mode 100644
index 000000000..10b028b2d
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-20-impl-hellomacro-for-pancakes/pancakes/src/main.rs
@@ -0,0 +1,13 @@
+use hello_macro::HelloMacro;
+
+struct Pancakes;
+
+impl HelloMacro for Pancakes {
+ fn hello_macro() {
+ println!("Hello, Macro! My name is Pancakes!");
+ }
+}
+
+fn main() {
+ Pancakes::hello_macro();
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/Cargo.lock
new file mode 100644
index 000000000..39afcf282
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "hello_macro"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/Cargo.toml
new file mode 100644
index 000000000..c6fb92087
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "hello_macro"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/hello_macro_derive/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/hello_macro_derive/Cargo.lock
new file mode 100644
index 000000000..9a38c8ac2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/hello_macro_derive/Cargo.lock
@@ -0,0 +1,46 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "hello_macro_derive"
+version = "0.1.0"
+dependencies = [
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548"
+"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
+"checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5"
+"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/hello_macro_derive/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/hello_macro_derive/Cargo.toml
new file mode 100644
index 000000000..aa076ac48
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/hello_macro_derive/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "hello_macro_derive"
+version = "0.1.0"
+edition = "2021"
+
+[lib]
+proc-macro = true
+
+[dependencies]
+syn = "1.0"
+quote = "1.0"
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/hello_macro_derive/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/hello_macro_derive/src/lib.rs
new file mode 100644
index 000000000..5e0b96c27
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/hello_macro_derive/src/lib.rs
@@ -0,0 +1,25 @@
+use proc_macro::TokenStream;
+use quote::quote;
+use syn;
+
+#[proc_macro_derive(HelloMacro)]
+pub fn hello_macro_derive(input: TokenStream) -> TokenStream {
+ // Construct a representation of Rust code as a syntax tree
+ // that we can manipulate
+ let ast = syn::parse(input).unwrap();
+
+ // Build the trait implementation
+ impl_hello_macro(&ast)
+}
+
+fn impl_hello_macro(ast: &syn::DeriveInput) -> TokenStream {
+ let name = &ast.ident;
+ let gen = quote! {
+ impl HelloMacro for #name {
+ fn hello_macro() {
+ println!("Hello, Macro! My name is {}!", stringify!(#name));
+ }
+ }
+ };
+ gen.into()
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/src/lib.rs
new file mode 100644
index 000000000..e74793184
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/src/lib.rs
@@ -0,0 +1,3 @@
+pub trait HelloMacro {
+ fn hello_macro();
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/src/main.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/src/main.rs
new file mode 100644
index 000000000..10b028b2d
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/hello_macro/src/main.rs
@@ -0,0 +1,13 @@
+use hello_macro::HelloMacro;
+
+struct Pancakes;
+
+impl HelloMacro for Pancakes {
+ fn hello_macro() {
+ println!("Hello, Macro! My name is Pancakes!");
+ }
+}
+
+fn main() {
+ Pancakes::hello_macro();
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/pancakes/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/pancakes/Cargo.lock
new file mode 100644
index 000000000..dee23ecf9
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/pancakes/Cargo.lock
@@ -0,0 +1,58 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "hello_macro"
+version = "0.1.0"
+
+[[package]]
+name = "hello_macro_derive"
+version = "0.1.0"
+dependencies = [
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "pancakes"
+version = "0.1.0"
+dependencies = [
+ "hello_macro 0.1.0",
+ "hello_macro_derive 0.1.0",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548"
+"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
+"checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5"
+"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/pancakes/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/pancakes/Cargo.toml
new file mode 100644
index 000000000..cb3a98c3a
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/pancakes/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "pancakes"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+hello_macro = { path = "../hello_macro" }
+hello_macro_derive = { path = "../hello_macro/hello_macro_derive" }
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/pancakes/src/main.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/pancakes/src/main.rs
new file mode 100644
index 000000000..468c30aa4
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-21-pancakes/pancakes/src/main.rs
@@ -0,0 +1,9 @@
+use hello_macro::HelloMacro;
+use hello_macro_derive::HelloMacro;
+
+#[derive(HelloMacro)]
+struct Pancakes;
+
+fn main() {
+ Pancakes::hello_macro();
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-22-iterator-on-counter/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/no-listing-22-iterator-on-counter/Cargo.lock
new file mode 100644
index 000000000..58b70c5b7
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-22-iterator-on-counter/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "counter"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-22-iterator-on-counter/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/no-listing-22-iterator-on-counter/Cargo.toml
new file mode 100644
index 000000000..9e103f3eb
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-22-iterator-on-counter/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "counter"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/no-listing-22-iterator-on-counter/src/lib.rs b/src/doc/book/listings/ch19-advanced-features/no-listing-22-iterator-on-counter/src/lib.rs
new file mode 100644
index 000000000..04c7f38f5
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/no-listing-22-iterator-on-counter/src/lib.rs
@@ -0,0 +1,25 @@
+struct Counter {
+ count: u32,
+}
+
+impl Counter {
+ fn new() -> Counter {
+ Counter { count: 0 }
+ }
+}
+
+// ANCHOR: ch19
+impl Iterator for Counter {
+ type Item = u32;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ // --snip--
+ // ANCHOR_END: ch19
+ if self.count < 5 {
+ self.count += 1;
+ Some(self.count)
+ } else {
+ None
+ }
+ }
+}
diff --git a/src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/Cargo.lock b/src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/Cargo.lock
new file mode 100644
index 000000000..497817bf2
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/Cargo.lock
@@ -0,0 +1,6 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "unsafe-example"
+version = "0.1.0"
+
diff --git a/src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/Cargo.toml b/src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/Cargo.toml
new file mode 100644
index 000000000..3e8a29201
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "unsafe-example"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/output.txt b/src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/output.txt
new file mode 100644
index 000000000..5886bc630
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/output.txt
@@ -0,0 +1,12 @@
+$ cargo run
+ Compiling unsafe-example v0.1.0 (file:///projects/unsafe-example)
+error[E0133]: call to unsafe function is unsafe and requires unsafe function or block
+ --> src/main.rs:4:5
+ |
+4 | dangerous();
+ | ^^^^^^^^^^^ call to unsafe function
+ |
+ = note: consult the function's documentation for information on how to avoid undefined behavior
+
+For more information about this error, try `rustc --explain E0133`.
+error: could not compile `unsafe-example` due to previous error
diff --git a/src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/src/main.rs b/src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/src/main.rs
new file mode 100644
index 000000000..01305be74
--- /dev/null
+++ b/src/doc/book/listings/ch19-advanced-features/output-only-01-missing-unsafe/src/main.rs
@@ -0,0 +1,7 @@
+fn main() {
+ // ANCHOR: here
+ unsafe fn dangerous() {}
+
+ dangerous();
+ // ANCHOR_END: here
+}