Snap for 7256110 from 5712c4b25f9e6ef3efae3e48212317ec27e4caf8 to sc-v2-release

Change-Id: Ic2d0d740e724526a55134f0ede3147f7a77be815
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
index edbabaa..b70187f 100644
--- a/.cargo_vcs_info.json
+++ b/.cargo_vcs_info.json
@@ -1,5 +1,5 @@
 {
   "git": {
-    "sha1": "2f26ac696b796968db370bea505095abc17ecfa4"
+    "sha1": "fd389a13f5bb6d625b71e2e4694b26e127f393f9"
   }
 }
diff --git a/Android.bp b/Android.bp
index f5f87a1..8f99540 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,4 +1,5 @@
 // This file is generated by cargo2android.py --run --device --dependencies.
+// Do not modify this file as changes will be overridden on upgrade.
 
 package {
     default_applicable_licenses: [
diff --git a/CHANGELOG.md b/CHANGELOG.md
index da91f22..68109e0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,22 @@
 
 ## [Unreleased]
 
+## [0.11.1] - 2021-01-18
+
+### Added
+
+-   Add `Chars::{box_drawing, ascii}` functions, the latter supporting a rustc-style of
+    output that only uses ASCII characters (not above U+007F) for use cases that do not allow
+    for box drawing characters, e.g. terminals that do not support them.
+
+### Changed
+
+-   `Diagnostic::with_labels` and `Diagnostic::with_notes` now append additional
+    labels rather tan overwriting them, meaning that the documentation and behaviour match
+    more closely. The behaviour will only differ if you call the same builder methods
+    multiple times. If you call every builder method once only, nothing should change.
+-   `config::Chars::snippet_start` is now a String instead of a single `char`.
+
 ## [0.11.0] - 2020-11-30
 
 There is now a [code of conduct](https://github.com/brendanzab/codespan/blob/master/CODE_OF_CONDUCT.md)
@@ -47,9 +63,15 @@
 -   Tab stops are now rendered properly.
 
     We used to just render `\t` characters in source snippets with the same
-    number of spaces. For example, when rendering with a tab width of `3` we
+    number of spaces.
+
+    <details>
+    <summary>Example</summary>
+
+    For example, when rendering with a tab width of `3` we
     would print:
-    ```
+
+    ```text
     warning: tab test
       ┌─ tab_columns:1:2

@@ -68,8 +90,10 @@
     7 │ ∙∙∙∙∙∙   hello
       │          ^^^^^
     ```
+
     Now we properly take into account the column of the tab character:
-    ```
+
+    ```text
     warning: tab test
       ┌─ tab_columns:1:2

@@ -89,14 +113,22 @@
       │          ^^^^^
     ```
 
+    </details>
+
 ## [0.9.4] - 2020-05-18
 
 ### Changed
 
 -   We have made the caret rendering easier to read when there are multiple
     labels on the same line. We also avoid printing trailing borders on the
-    final source source snippet if no notes are present. Instead of this:
-    ```
+    final source source snippet if no notes are present.
+
+    <details>
+    <summary>Example</summary>
+
+    Instead of this:
+
+    ```text
        ┌─ one_line.rs:3:5

      3 │     v.push(v.pop().unwrap());
@@ -105,8 +137,10 @@
        │            ^ second mutable borrow occurs here

     ```
+
     …we now render the following:
-    ```
+
+    ```text
        ┌─ one_line.rs:3:5

      3 │     v.push(v.pop().unwrap());
@@ -116,6 +150,8 @@
        │     first borrow later used by call
     ```
 
+    </details>
+
 ### Fixed
 
 -   Diagnostic rendering no longer panics if label ranges are between UTF-8
@@ -129,8 +165,12 @@
 -   Labels that marked the same span were originally rendered in reverse order.
     This was a mistake! We've now fixed this.
 
+    <details>
+    <summary>Example</summary>
+
     For example, this diagnostic:
-    ```
+
+    ```text
        ┌─ same_range:1:7

      1 │ ::S { }
@@ -138,8 +178,10 @@
        │     ^ Unexpected '{'

     ```
+
     …will now be rendered as:
-    ```
+
+    ```text
        ┌─ same_range:1:7

      1 │ ::S { }
@@ -148,13 +190,19 @@

     ```
 
+    </details>
+
 -   We've reduced the prominence of the 'locus' on source snippets by
     simplifying the border and reducing the spacing around it. This is to help
     focus attention on the underlined source snippet and error messages, rather
     than the location, which should be a secondary focus.
 
+    <details>
+    <summary>Example</summary>
+
     For example we originally rendered this:
-    ```
+
+    ```text
     error: unknown builtin: `NATRAL`
 
        ┌── Data/Nat.fun:7:13 ───
@@ -165,8 +213,10 @@
        = there is a builtin with a similar name: `NATURAL`
 
     ```
+
     …and now we render this:
-    ```
+
+    ```text
     error: unknown builtin: `NATRAL`
       ┌─ Data/Nat.fun:7:13

@@ -177,14 +227,20 @@
 
     ```
 
+    </details>
+
 ## [0.9.2] - 2020-03-29
 
 ### Changed
 
 -   Render overlapping multiline marks on the same lines of source code.
 
+    <details>
+    <summary>Example</summary>
+
     For example:
-    ```
+
+    ```text
     error[E0308]: match arms have incompatible types
 
        ┌── codespan/src/file.rs:1:9 ───
@@ -213,8 +269,10 @@
        = expected type `Result<ByteIndex, LineIndexOutOfBoundsError>`
             found type `LineIndexOutOfBoundsError`
     ```
+
     …is now rendered as:
-    ```
+
+    ```text
     error[E0308]: match arms have incompatible types
 
        ┌── codespan/src/file.rs:1:9 ───
@@ -237,6 +295,8 @@
             found type `LineIndexOutOfBoundsError`
     ```
 
+    </details>
+
 ## [0.9.1] - 2020-03-23
 
 ### Added
@@ -247,8 +307,12 @@
 
 -   Single-line labels are now rendered together, under the same source line.
 
+    <details>
+    <summary>Example</summary>
+
     For example:
-    ```
+
+    ```text
        ┌── one_line.rs:3:5 ───

      3 │     v.push(v.pop().unwrap());
@@ -261,8 +325,10 @@
        │            ^ second mutable borrow occurs here

     ```
+
     …is now rendered as:
-    ```
+
+    ```text
        ┌── one_line.rs:3:5 ───

      3 │     v.push(v.pop().unwrap());
@@ -272,6 +338,8 @@

     ```
 
+    </details>
+
 ## [0.9.0] - 2020-03-11
 
 ### Added
@@ -320,7 +388,8 @@
 ## [0.2.1] - 2019-02-26
 ## [0.2.0] - 2018-10-11
 
-[Unreleased]: https://github.com/brendanzab/codespan/compare/v0.11.0...HEAD
+[Unreleased]: https://github.com/brendanzab/codespan/compare/v0.11.1...HEAD
+[0.11.1]: https://github.com/brendanzab/codespan/compare/v0.11.0..v0.11.1
 [0.11.0]: https://github.com/brendanzab/codespan/compare/v0.9.5...v0.11.0
 [0.9.5]: https://github.com/brendanzab/codespan/compare/v0.9.4...v0.9.5
 [0.9.4]: https://github.com/brendanzab/codespan/compare/v0.9.3...v0.9.4
diff --git a/Cargo.lock b/Cargo.lock
index c43523a..ff92d96 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -11,9 +11,9 @@
 
 [[package]]
 name = "anyhow"
-version = "1.0.34"
+version = "1.0.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf8dcb5b4bbaa28653b647d8c77bd4ed40183b48882e130c1f1ffb73de069fd7"
+checksum = "afddf7f520a80dbf76e6f50a35bca42a2331ef227a28b3b6dc5c2e2338d114b1"
 
 [[package]]
 name = "atty"
@@ -34,9 +34,9 @@
 
 [[package]]
 name = "cc"
-version = "1.0.65"
+version = "1.0.67"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95752358c8f7552394baf48cd82695b345628ad3f170d607de3ca03b8dacca15"
+checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd"
 
 [[package]]
 name = "cfg-if"
@@ -67,7 +67,7 @@
 
 [[package]]
 name = "codespan-reporting"
-version = "0.11.0"
+version = "0.11.1"
 dependencies = [
  "anyhow",
  "insta",
@@ -83,25 +83,18 @@
 
 [[package]]
 name = "console"
-version = "0.12.0"
+version = "0.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0b1aacfaffdbff75be81c15a399b4bedf78aaefe840e8af1d299ac2ade885d2"
+checksum = "7cc80946b3480f421c2f17ed1cb841753a371c7c5104f51d507e13f532c856aa"
 dependencies = [
  "encode_unicode",
  "lazy_static",
  "libc",
  "terminal_size",
- "termios",
  "winapi",
 ]
 
 [[package]]
-name = "difference"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
-
-[[package]]
 name = "dirs-next"
 version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -113,9 +106,9 @@
 
 [[package]]
 name = "dirs-sys-next"
-version = "0.1.1"
+version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99de365f605554ae33f115102a02057d4fc18b01f3284d6870be0938743cfe7d"
+checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
 dependencies = [
  "libc",
  "redox_users",
@@ -124,9 +117,9 @@
 
 [[package]]
 name = "dtoa"
-version = "0.4.6"
+version = "0.4.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "134951f4028bdadb9b84baf4232681efbf277da25144b9b0ad65df75946c422b"
+checksum = "88d7ed2934d741c6b37e33e3832298e8850b53fd2d2bea03873375596c7cea4e"
 
 [[package]]
 name = "encode_unicode"
@@ -136,52 +129,53 @@
 
 [[package]]
 name = "getrandom"
-version = "0.1.15"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
+checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8"
 dependencies = [
- "cfg-if 0.1.10",
+ "cfg-if 1.0.0",
  "libc",
  "wasi",
 ]
 
 [[package]]
 name = "heck"
-version = "0.3.1"
+version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
+checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac"
 dependencies = [
  "unicode-segmentation",
 ]
 
 [[package]]
 name = "hermit-abi"
-version = "0.1.17"
+version = "0.1.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8"
+checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c"
 dependencies = [
  "libc",
 ]
 
 [[package]]
 name = "insta"
-version = "1.3.0"
+version = "1.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "863bf97e7130bf788f29a99bc4073735af6b8ecc3da6a39c23b3a688d2d3109a"
+checksum = "fd354a2c8c8083d58414597a4ecada1984f9b82ea7e87eeabddc869eaf120992"
 dependencies = [
  "console",
- "difference",
  "lazy_static",
  "serde",
  "serde_json",
  "serde_yaml",
+ "similar",
+ "uuid",
 ]
 
 [[package]]
 name = "itoa"
-version = "0.4.6"
+version = "0.4.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"
+checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
 
 [[package]]
 name = "lazy_static"
@@ -191,23 +185,23 @@
 
 [[package]]
 name = "libc"
-version = "0.2.80"
+version = "0.2.86"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614"
+checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c"
 
 [[package]]
 name = "linked-hash-map"
-version = "0.5.3"
+version = "0.5.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a"
+checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
 
 [[package]]
 name = "log"
-version = "0.4.11"
+version = "0.4.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
+checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
 dependencies = [
- "cfg-if 0.1.10",
+ "cfg-if 1.0.0",
 ]
 
 [[package]]
@@ -290,24 +284,27 @@
 
 [[package]]
 name = "quote"
-version = "1.0.7"
+version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
+checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
 dependencies = [
  "proc-macro2",
 ]
 
 [[package]]
 name = "redox_syscall"
-version = "0.1.57"
+version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
+checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9"
+dependencies = [
+ "bitflags",
+]
 
 [[package]]
 name = "redox_users"
-version = "0.3.5"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d"
+checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64"
 dependencies = [
  "getrandom",
  "redox_syscall",
@@ -346,18 +343,18 @@
 
 [[package]]
 name = "serde"
-version = "1.0.117"
+version = "1.0.123"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a"
+checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.117"
+version = "1.0.123"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cbd1ae72adb44aab48f325a02444a5fc079349a8d804c1fc922aed3f7454c74e"
+checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -366,9 +363,9 @@
 
 [[package]]
 name = "serde_json"
-version = "1.0.59"
+version = "1.0.62"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcac07dbffa1c65e7f816ab9eba78eb142c6d44410f4eeba1e26e4f5dfa56b95"
+checksum = "ea1c6153794552ea7cf7cf63b1231a25de00ec90db326ba6264440fa08e31486"
 dependencies = [
  "itoa",
  "ryu",
@@ -377,9 +374,9 @@
 
 [[package]]
 name = "serde_yaml"
-version = "0.8.14"
+version = "0.8.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7baae0a99f1a324984bcdc5f0718384c1f69775f1c7eec8b859b71b443e3fd7"
+checksum = "15654ed4ab61726bf918a39cb8d98a2e2995b002387807fa6ba58fdf7f59bb23"
 dependencies = [
  "dtoa",
  "linked-hash-map",
@@ -388,6 +385,12 @@
 ]
 
 [[package]]
+name = "similar"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a04629d2e8ecdcf30e0188e3699ed6d50d5750d0219db146a790065fe92a897"
+
+[[package]]
 name = "strsim"
 version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -395,9 +398,9 @@
 
 [[package]]
 name = "structopt"
-version = "0.3.20"
+version = "0.3.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "126d630294ec449fae0b16f964e35bf3c74f940da9dca17ee9b905f7b3112eb8"
+checksum = "5277acd7ee46e63e5168a80734c9f6ee81b1367a7d8772a2d765df2a3705d28c"
 dependencies = [
  "clap",
  "lazy_static",
@@ -406,9 +409,9 @@
 
 [[package]]
 name = "structopt-derive"
-version = "0.4.13"
+version = "0.4.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "65e51c492f9e23a220534971ff5afc14037289de430e3c83f9daf6a1b6ae91e8"
+checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90"
 dependencies = [
  "heck",
  "proc-macro-error",
@@ -419,9 +422,9 @@
 
 [[package]]
 name = "syn"
-version = "1.0.52"
+version = "1.0.60"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c1e438504729046a5cfae47f97c30d6d083c7d91d94603efdae3477fc070d4c"
+checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -439,24 +442,15 @@
 
 [[package]]
 name = "terminal_size"
-version = "0.1.15"
+version = "0.1.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bd2d183bd3fac5f5fe38ddbeb4dc9aec4a39a9d7d59e7491d900302da01cbe1"
+checksum = "86ca8ced750734db02076f44132d802af0b33b09942331f4459dde8636fd2406"
 dependencies = [
  "libc",
  "winapi",
 ]
 
 [[package]]
-name = "termios"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b"
-dependencies = [
- "libc",
-]
-
-[[package]]
 name = "textwrap"
 version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -496,6 +490,12 @@
 checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372"
 
 [[package]]
+name = "uuid"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
+
+[[package]]
 name = "vec_map"
 version = "0.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -509,9 +509,9 @@
 
 [[package]]
 name = "wasi"
-version = "0.9.0+wasi-snapshot-preview1"
+version = "0.10.2+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
 
 [[package]]
 name = "winapi"
@@ -546,9 +546,9 @@
 
 [[package]]
 name = "yaml-rust"
-version = "0.4.4"
+version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39f0c922f1a334134dc2f7a8b67dc5d25f0735263feec974345ff706bcf20b0d"
+checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
 dependencies = [
  "linked-hash-map",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index 9a7fcd1..5a3d588 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -13,7 +13,7 @@
 [package]
 edition = "2018"
 name = "codespan-reporting"
-version = "0.11.0"
+version = "0.11.1"
 authors = ["Brendan Zabarauskas <bjzaba@yahoo.com.au>"]
 exclude = ["assets/**"]
 description = "Beautiful diagnostic reporting for text-based programming languages"
@@ -36,7 +36,7 @@
 version = "1"
 
 [dev-dependencies.insta]
-version = "1.0"
+version = "1.6.3"
 
 [dev-dependencies.lazy_static]
 version = "1.4"
@@ -54,4 +54,5 @@
 version = "0.1"
 
 [features]
+ascii-only = []
 serialization = ["serde", "serde/rc"]
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
index 0a6f79e..50ad3d8 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "codespan-reporting"
-version = "0.11.0"
+version = "0.11.1"
 readme = "../README.md"
 license = "Apache-2.0"
 authors = ["Brendan Zabarauskas <bjzaba@yahoo.com.au>"]
@@ -18,7 +18,7 @@
 
 [dev-dependencies]
 anyhow = "1"
-insta = "1.0"
+insta = "1.6.3"
 lazy_static = "1.4"
 peg = "0.6"
 rustyline = "6"
@@ -27,3 +27,4 @@
 
 [features]
 serialization = ["serde", "serde/rc"]
+ascii-only = []
diff --git a/METADATA b/METADATA
index 612e190..f0da58b 100644
--- a/METADATA
+++ b/METADATA
@@ -7,13 +7,13 @@
   }
   url {
     type: ARCHIVE
-    value: "https://static.crates.io/crates/codespan-reporting/codespan-reporting-0.11.0.crate"
+    value: "https://static.crates.io/crates/codespan-reporting/codespan-reporting-0.11.1.crate"
   }
-  version: "0.11.0"
+  version: "0.11.1"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2020
-    month: 11
-    day: 30
+    year: 2021
+    month: 4
+    day: 1
   }
 }
diff --git a/src/diagnostic.rs b/src/diagnostic.rs
index 7dddcec..c1f98bd 100644
--- a/src/diagnostic.rs
+++ b/src/diagnostic.rs
@@ -183,27 +183,27 @@
         Diagnostic::new(Severity::Help)
     }
 
-    /// Add an error code to the diagnostic.
+    /// Set the error code of the diagnostic.
     pub fn with_code(mut self, code: impl Into<String>) -> Diagnostic<FileId> {
         self.code = Some(code.into());
         self
     }
 
-    /// Add a message to the diagnostic.
+    /// Set the message of the diagnostic.
     pub fn with_message(mut self, message: impl Into<String>) -> Diagnostic<FileId> {
         self.message = message.into();
         self
     }
 
     /// Add some labels to the diagnostic.
-    pub fn with_labels(mut self, labels: Vec<Label<FileId>>) -> Diagnostic<FileId> {
-        self.labels = labels;
+    pub fn with_labels(mut self, mut labels: Vec<Label<FileId>>) -> Diagnostic<FileId> {
+        self.labels.append(&mut labels);
         self
     }
 
     /// Add some notes to the diagnostic.
-    pub fn with_notes(mut self, notes: Vec<String>) -> Diagnostic<FileId> {
-        self.notes = notes;
+    pub fn with_notes(mut self, mut notes: Vec<String>) -> Diagnostic<FileId> {
+        self.notes.append(&mut notes);
         self
     }
 }
diff --git a/src/lib.rs b/src/lib.rs
index 145a4f3..28d7f24 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,5 +1,7 @@
 //! Diagnostic reporting support for the codespan crate.
 
+#![forbid(unsafe_code)]
+
 pub mod diagnostic;
 pub mod files;
 pub mod term;
diff --git a/src/term/config.rs b/src/term/config.rs
index 18cbd44..c92a6b6 100644
--- a/src/term/config.rs
+++ b/src/term/config.rs
@@ -20,10 +20,14 @@
     /// The minimum number of lines to be shown after the line on which a multiline [`Label`] begins.
     ///
     /// Defaults to: `3`.
+    ///
+    /// [`Label`]: crate::diagnostic::Label
     pub start_context_lines: usize,
     /// The minimum number of lines to be shown before the line on which a multiline [`Label`] ends.
     ///
     /// Defaults to: `1`.
+    ///
+    /// [`Label`]: crate::diagnostic::Label
     pub end_context_lines: usize,
 }
 
@@ -193,19 +197,19 @@
 }
 
 /// Characters to use when rendering the diagnostic.
+///
+/// By using [`Chars::ascii()`] you can switch to an ASCII-only format suitable
+/// for rendering on terminals that do not support box drawing characters.
 #[derive(Clone, Debug)]
 pub struct Chars {
-    /// The character to use for the top-left border of the source.
-    /// Defaults to: `'┌'`.
-    pub source_border_top_left: char,
-    /// The character to use for the top border of the source.
-    /// Defaults to: `'─'`.
-    pub source_border_top: char,
+    /// The characters to use for the top-left border of the snippet.
+    /// Defaults to: `"┌─"` or `"-->"` with [`Chars::ascii()`].
+    pub snippet_start: String,
     /// The character to use for the left border of the source.
-    /// Defaults to: `'│'`.
+    /// Defaults to: `'│'` or `'|'` with [`Chars::ascii()`].
     pub source_border_left: char,
     /// The character to use for the left border break of the source.
-    /// Defaults to: `'·'`.
+    /// Defaults to: `'·'` or `'.'` with [`Chars::ascii()`].
     pub source_border_left_break: char,
 
     /// The character to use for the note bullet.
@@ -232,31 +236,37 @@
     /// Defaults to: `'\''`.
     pub multi_secondary_caret_end: char,
     /// The character to use for the top-left corner of a multi-line label.
-    /// Defaults to: `'╭'`.
+    /// Defaults to: `'╭'` or `'/'` with [`Chars::ascii()`].
     pub multi_top_left: char,
     /// The character to use for the top of a multi-line label.
-    /// Defaults to: `'─'`.
+    /// Defaults to: `'─'` or `'-'` with [`Chars::ascii()`].
     pub multi_top: char,
     /// The character to use for the bottom-left corner of a multi-line label.
-    /// Defaults to: `'╰'`.
+    /// Defaults to: `'╰'` or `'\'` with [`Chars::ascii()`].
     pub multi_bottom_left: char,
     /// The character to use when marking the bottom of a multi-line label.
-    /// Defaults to: `'─'`.
+    /// Defaults to: `'─'` or `'-'` with [`Chars::ascii()`].
     pub multi_bottom: char,
     /// The character to use for the left of a multi-line label.
-    /// Defaults to: `'│'`.
+    /// Defaults to: `'│'` or `'|'` with [`Chars::ascii()`].
     pub multi_left: char,
 
     /// The character to use for the left of a pointer underneath a caret.
-    /// Defaults to: `'│'`.
+    /// Defaults to: `'│'` or `'|'` with [`Chars::ascii()`].
     pub pointer_left: char,
 }
 
 impl Default for Chars {
     fn default() -> Chars {
+        Chars::box_drawing()
+    }
+}
+
+impl Chars {
+    /// A character set that uses Unicode box drawing characters.
+    pub fn box_drawing() -> Chars {
         Chars {
-            source_border_top_left: '┌',
-            source_border_top: '─',
+            snippet_start: "┌─".into(),
             source_border_left: '│',
             source_border_left_break: '·',
 
@@ -278,4 +288,34 @@
             pointer_left: '│',
         }
     }
+
+    /// A character set that only uses ASCII characters.
+    ///
+    /// This is useful if your terminal's font does not support box drawing
+    /// characters well and results in output that looks similar to rustc's
+    /// diagnostic output.
+    pub fn ascii() -> Chars {
+        Chars {
+            snippet_start: "-->".into(),
+            source_border_left: '|',
+            source_border_left_break: '.',
+
+            note_bullet: '=',
+
+            single_primary_caret: '^',
+            single_secondary_caret: '-',
+
+            multi_primary_caret_start: '^',
+            multi_primary_caret_end: '^',
+            multi_secondary_caret_start: '\'',
+            multi_secondary_caret_end: '\'',
+            multi_top_left: '/',
+            multi_top: '-',
+            multi_bottom_left: '\\',
+            multi_bottom: '-',
+            multi_left: '|',
+
+            pointer_left: '|',
+        }
+    }
 }
diff --git a/src/term/renderer.rs b/src/term/renderer.rs
index cd82e88..eeb8965 100644
--- a/src/term/renderer.rs
+++ b/src/term/renderer.rs
@@ -208,8 +208,7 @@
         self.outer_gutter(outer_padding)?;
 
         self.set_color(&self.styles().source_border)?;
-        write!(self, "{}", self.chars().source_border_top_left)?;
-        write!(self, "{0}", self.chars().source_border_top)?;
+        write!(self, "{}", self.chars().snippet_start)?;
         self.reset()?;
 
         write!(self, " ")?;
diff --git a/tests/snapshots/term__empty__rich_ascii_no_color.snap b/tests/snapshots/term__empty__rich_ascii_no_color.snap
new file mode 100644
index 0000000..1ec1a94
--- /dev/null
+++ b/tests/snapshots/term__empty__rich_ascii_no_color.snap
@@ -0,0 +1,17 @@
+---
+source: codespan-reporting/tests/term.rs
+expression: TEST_DATA.emit_no_color(&config)
+---
+bug: 
+
+error: 
+
+warning: 
+
+note: 
+
+help: 
+
+bug: 
+
+
diff --git a/tests/snapshots/term__empty_ranges__rich_ascii_no_color.snap b/tests/snapshots/term__empty_ranges__rich_ascii_no_color.snap
new file mode 100644
index 0000000..bbf44fb
--- /dev/null
+++ b/tests/snapshots/term__empty_ranges__rich_ascii_no_color.snap
@@ -0,0 +1,29 @@
+---
+source: codespan-reporting/tests/term.rs
+expression: TEST_DATA.emit_no_color(&config)
+---
+note: middle
+  --> hello:1:7
+  |
+1 | Hello world!
+  |       ^ middle
+
+note: end of line
+  --> hello:1:13
+  |
+1 | Hello world!
+  |             ^ end of line
+
+note: end of line
+  --> hello:2:11
+  |
+2 | Bye world!
+  |           ^ end of line
+
+note: end of file
+  --> hello:3:4
+  |
+3 |    
+  |    ^ end of file
+
+
diff --git a/tests/snapshots/term__fizz_buzz__rich_ascii_no_color.snap b/tests/snapshots/term__fizz_buzz__rich_ascii_no_color.snap
new file mode 100644
index 0000000..55cb453
--- /dev/null
+++ b/tests/snapshots/term__fizz_buzz__rich_ascii_no_color.snap
@@ -0,0 +1,42 @@
+---
+source: codespan-reporting/tests/term.rs
+expression: TEST_DATA.emit_no_color(&config)
+---
+error[E0308]: `case` clauses have incompatible types
+  --> FizzBuzz.fun:8:12
+  |  
+3 |   fizz₁ : Nat → String
+  |                 ------ expected type `String` found here
+4 |   fizz₁ num = case (mod num 5) (mod num 3) of
+  | /-------------'
+5 | |     0 0 => "FizzBuzz"
+6 | |     0 _ => "Fizz"
+7 | |     _ 0 => "Buzz"
+8 | |     _ _ => num
+  | |            ^^^ expected `String`, found `Nat`
+  | \--------------' `case` clauses have incompatible types
+  |  
+  = expected type `String`
+       found type `Nat`
+
+error[E0308]: `case` clauses have incompatible types
+   --> FizzBuzz.fun:16:16
+   |  
+10 |   fizz₂ : Nat → String
+   |                 ------ expected type `String` found here
+11 |   fizz₂ num =
+12 | /     case (mod num 5) (mod num 3) of
+13 | |         0 0 => "FizzBuzz"
+   | |                ---------- this is found to be of type `String`
+14 | |         0 _ => "Fizz"
+   | |                ------ this is found to be of type `String`
+15 | |         _ 0 => "Buzz"
+   | |                ------ this is found to be of type `String`
+16 | |         _ _ => num
+   | |                ^^^ expected `String`, found `Nat`
+   | \------------------' `case` clauses have incompatible types
+   |  
+   = expected type `String`
+        found type `Nat`
+
+
diff --git a/tests/snapshots/term__message__rich_ascii_no_color.snap b/tests/snapshots/term__message__rich_ascii_no_color.snap
new file mode 100644
index 0000000..d3abe84
--- /dev/null
+++ b/tests/snapshots/term__message__rich_ascii_no_color.snap
@@ -0,0 +1,13 @@
+---
+source: codespan-reporting/tests/term.rs
+expression: TEST_DATA.emit_no_color(&config)
+---
+error: a message
+
+warning: a message
+
+note: a message
+
+help: a message
+
+
diff --git a/tests/snapshots/term__message_and_notes__rich_ascii_no_color.snap b/tests/snapshots/term__message_and_notes__rich_ascii_no_color.snap
new file mode 100644
index 0000000..d4e209b
--- /dev/null
+++ b/tests/snapshots/term__message_and_notes__rich_ascii_no_color.snap
@@ -0,0 +1,17 @@
+---
+source: codespan-reporting/tests/term.rs
+expression: TEST_DATA.emit_no_color(&config)
+---
+error: a message
+ = a note
+
+warning: a message
+ = a note
+
+note: a message
+ = a note
+
+help: a message
+ = a note
+
+
diff --git a/tests/snapshots/term__message_errorcode__rich_ascii_no_color.snap b/tests/snapshots/term__message_errorcode__rich_ascii_no_color.snap
new file mode 100644
index 0000000..e82fb7c
--- /dev/null
+++ b/tests/snapshots/term__message_errorcode__rich_ascii_no_color.snap
@@ -0,0 +1,21 @@
+---
+source: codespan-reporting/tests/term.rs
+expression: TEST_DATA.emit_no_color(&config)
+---
+error[E0001]: a message
+
+warning[W001]: a message
+
+note[N0815]: a message
+
+help[H4711]: a message
+
+error: where did my errorcode go?
+
+warning: where did my errorcode go?
+
+note: where did my errorcode go?
+
+help: where did my errorcode go?
+
+
diff --git a/tests/snapshots/term__multifile__rich_ascii_no_color.snap b/tests/snapshots/term__multifile__rich_ascii_no_color.snap
new file mode 100644
index 0000000..e162ed2
--- /dev/null
+++ b/tests/snapshots/term__multifile__rich_ascii_no_color.snap
@@ -0,0 +1,35 @@
+---
+source: codespan-reporting/tests/term.rs
+expression: TEST_DATA.emit_no_color(&config)
+---
+error: unknown builtin: `NATRAL`
+  --> Data/Nat.fun:7:13
+  |
+7 | {-# BUILTIN NATRAL Nat #-}
+  |             ^^^^^^ unknown builtin
+  |
+  = there is a builtin with a similar name: `NATURAL`
+
+warning: unused parameter pattern: `n₂`
+   --> Data/Nat.fun:17:16
+   |
+17 | zero    - succ n₂ = zero
+   |                ^^ unused parameter
+   |
+   = consider using a wildcard pattern: `_`
+
+error[E0001]: unexpected type in application of `_+_`
+   --> Test.fun:4:11
+   |
+ 4 | _ = 123 + "hello"
+   |           ^^^^^^^ expected `Nat`, found `String`
+   |
+   --> Data/Nat.fun:11:1
+   |
+11 | _+_ : Nat → Nat → Nat
+   | --------------------- based on the definition of `_+_`
+   |
+   = expected type `Nat`
+        found type `String`
+
+
diff --git a/tests/snapshots/term__multiline_overlapping__rich_ascii_no_color.snap b/tests/snapshots/term__multiline_overlapping__rich_ascii_no_color.snap
new file mode 100644
index 0000000..3623d4d
--- /dev/null
+++ b/tests/snapshots/term__multiline_overlapping__rich_ascii_no_color.snap
@@ -0,0 +1,25 @@
+---
+source: codespan-reporting/tests/term.rs
+expression: TEST_DATA.emit_no_color(&config)
+---
+error[E0308]: match arms have incompatible types
+  --> codespan/src/file.rs:4:34
+  |    
+1 |   /         match line_index.compare(self.last_line_index()) {
+2 |   |             Ordering::Less => Ok(self.line_starts()[line_index.to_usize()]),
+  |   |                               --------------------------------------------- this is found to be of type `Result<ByteIndex, LineIndexOutOfBoundsError>`
+3 |   |             Ordering::Equal => Ok(self.source_span().end()),
+  |   |                                ---------------------------- this is found to be of type `Result<ByteIndex, LineIndexOutOfBoundsError>`
+4 |   |             Ordering::Greater => LineIndexOutOfBoundsError {
+  | /-|----------------------------------^
+5 | | |                 given: line_index,
+6 | | |                 max: self.last_line_index(),
+7 | | |             },
+  | \-|-------------^ expected enum `Result`, found struct `LineIndexOutOfBoundsError`
+8 |   |         }
+  |   \---------' `match` arms have incompatible types
+  |    
+  = expected type `Result<ByteIndex, LineIndexOutOfBoundsError>`
+       found type `LineIndexOutOfBoundsError`
+
+
diff --git a/tests/snapshots/term__overlapping__rich_ascii_no_color.snap b/tests/snapshots/term__overlapping__rich_ascii_no_color.snap
new file mode 100644
index 0000000..b6002fc
--- /dev/null
+++ b/tests/snapshots/term__overlapping__rich_ascii_no_color.snap
@@ -0,0 +1,58 @@
+---
+source: codespan-reporting/tests/term.rs
+expression: TEST_DATA.emit_no_color(&config)
+---
+error[E0666]: nested `impl Trait` is not allowed
+  --> nested_impl_trait.rs:5:56
+  |
+5 | fn bad_in_ret_position(x: impl Into<u32>) -> impl Into<impl Debug> { x }
+  |                                              ----------^^^^^^^^^^-
+  |                                              |         |
+  |                                              |         nested `impl Trait` here
+  |                                              outer `impl Trait`
+
+error[E0121]: the type placeholder `_` is not allowed within types on item signatures
+  --> typeck_type_placeholder_item.rs:1:18
+  |
+1 | fn fn_test1() -> _ { 5 }
+  |                  ^
+  |                  |
+  |                  not allowed in type signatures
+  |                  help: replace with the correct return type: `i32`
+
+error[E0121]: the type placeholder `_` is not allowed within types on item signatures
+  --> typeck_type_placeholder_item.rs:2:25
+  |
+2 | fn fn_test2(x: i32) -> (_, _) { (x, x) }
+  |                        -^--^-
+  |                        ||  |
+  |                        ||  not allowed in type signatures
+  |                        |not allowed in type signatures
+  |                        help: replace with the correct return type: `(i32, i32)`
+
+error[E0277]: `std::rc::Rc<()>` cannot be sent between threads safely
+   --> no_send_res_ports.rs:25:5
+   |  
+25 |       thread::spawn(move|| {
+   |       ^^^^^^^^^^^^^ `std::rc::Rc<()>` cannot be sent between threads safely
+   | /-------------------'
+26 | |         let y = x;
+27 | |         println!("{:?}", y);
+28 | |     });
+   | \------' within this `[closure@no_send_res_ports.rs:29:19: 33:6 x:main::Foo]`
+   |  
+   --> libstd/thread/mod.rs:5:8
+   |
+ 5 |     F: Send + 'static,
+   |        ---- required by this bound in `std::thread::spawn`
+   |
+   = help: within `[closure@no_send_res_ports.rs:29:19: 33:6 x:main::Foo]`, the trait `std::marker::Send` is not implemented for `std::rc::Rc<()>`
+   = note: required because it appears within the type `Port<()>`
+   = note: required because it appears within the type `main::Foo`
+   = note: required because it appears within the type `[closure@no_send_res_ports.rs:29:19: 33:6 x:main::Foo]`
+
+error: aborting due 5 previous errors
+ = Some errors have detailed explanations: E0121, E0277, E0666.
+ = For more information about an error, try `rustc --explain E0121`.
+
+
diff --git a/tests/snapshots/term__position_indicator__rich_ascii_no_color.snap b/tests/snapshots/term__position_indicator__rich_ascii_no_color.snap
new file mode 100644
index 0000000..d99ad14
--- /dev/null
+++ b/tests/snapshots/term__position_indicator__rich_ascii_no_color.snap
@@ -0,0 +1,14 @@
+---
+source: codespan-reporting/tests/term.rs
+expression: TEST_DATA.emit_no_color(&config)
+---
+warning[ParserWarning]: The strict mode declaration in the body of function `foo` is redundant, as the outer scope is already in strict mode
+  --> tests/main.js:4:3
+  |
+1 | "use strict";
+  | ------------ Strict mode is first declared here
+  .
+4 |   "use strict";
+  |   ^^^^^^^^^^^^ This strict mode declaration is redundant
+
+
diff --git a/tests/snapshots/term__same_line__rich_ascii_no_color.snap b/tests/snapshots/term__same_line__rich_ascii_no_color.snap
new file mode 100644
index 0000000..60e7afb
--- /dev/null
+++ b/tests/snapshots/term__same_line__rich_ascii_no_color.snap
@@ -0,0 +1,17 @@
+---
+source: codespan-reporting/tests/term.rs
+expression: TEST_DATA.emit_no_color(&config)
+---
+error[E0499]: cannot borrow `v` as mutable more than once at a time
+  --> one_line.rs:3:12
+  |
+3 |     v.push(v.pop().unwrap());
+  |     - ---- ^ second mutable borrow occurs here
+  |     | |     
+  |     | first mutable borrow occurs here
+  |     first borrow later used by call
+
+error: aborting due to previous error
+ = For more information about this error, try `rustc --explain E0499`.
+
+
diff --git a/tests/snapshots/term__same_ranges__rich_ascii_no_color.snap b/tests/snapshots/term__same_ranges__rich_ascii_no_color.snap
new file mode 100644
index 0000000..d64f099
--- /dev/null
+++ b/tests/snapshots/term__same_ranges__rich_ascii_no_color.snap
@@ -0,0 +1,14 @@
+---
+source: codespan-reporting/tests/term.rs
+expression: TEST_DATA.emit_no_color(&config)
+---
+error: Unexpected token
+  --> same_range:1:5
+  |
+1 | ::S { }
+  |     ^
+  |     |
+  |     Unexpected '{'
+  |     Expected '('
+
+
diff --git a/tests/term.rs b/tests/term.rs
index 15c9566..035db9b 100644
--- a/tests/term.rs
+++ b/tests/term.rs
@@ -1,6 +1,6 @@
 use codespan_reporting::diagnostic::{Diagnostic, Label};
 use codespan_reporting::files::{SimpleFile, SimpleFiles};
-use codespan_reporting::term::{termcolor::Color, Config, DisplayStyle, Styles};
+use codespan_reporting::term::{termcolor::Color, Chars, Config, DisplayStyle, Styles};
 
 mod support;
 
@@ -81,6 +81,18 @@
             insta::assert_snapshot!(TEST_DATA.emit_no_color(&config));
         }
     };
+    (rich_ascii_no_color) => {
+        #[test]
+        fn rich_ascii_no_color() {
+            let config = Config {
+                display_style: DisplayStyle::Rich,
+                chars: Chars::ascii(),
+                ..TEST_CONFIG.clone()
+            };
+
+            insta::assert_snapshot!(TEST_DATA.emit_no_color(&config));
+        }
+    };
 }
 
 mod empty {
@@ -109,6 +121,7 @@
     test_emit!(rich_no_color);
     test_emit!(medium_no_color);
     test_emit!(short_no_color);
+    test_emit!(rich_ascii_no_color);
 }
 
 /// Based on:
@@ -159,6 +172,7 @@
     test_emit!(rich_no_color);
     test_emit!(medium_no_color);
     test_emit!(short_no_color);
+    test_emit!(rich_ascii_no_color);
 }
 
 /// Based on:
@@ -303,6 +317,7 @@
     test_emit!(rich_no_color);
     test_emit!(medium_no_color);
     test_emit!(short_no_color);
+    test_emit!(rich_ascii_no_color);
 }
 
 mod message {
@@ -329,6 +344,7 @@
     test_emit!(rich_no_color);
     test_emit!(medium_no_color);
     test_emit!(short_no_color);
+    test_emit!(rich_ascii_no_color);
 }
 
 mod message_and_notes {
@@ -355,6 +371,7 @@
     test_emit!(rich_no_color);
     test_emit!(medium_no_color);
     test_emit!(short_no_color);
+    test_emit!(rich_ascii_no_color);
 }
 
 mod message_errorcode {
@@ -381,6 +398,7 @@
 
     test_emit!(rich_no_color);
     test_emit!(short_no_color);
+    test_emit!(rich_ascii_no_color);
 }
 
 mod empty_ranges {
@@ -416,6 +434,7 @@
     test_emit!(rich_no_color);
     test_emit!(medium_no_color);
     test_emit!(short_no_color);
+    test_emit!(rich_ascii_no_color);
 }
 
 mod same_ranges {
@@ -444,6 +463,7 @@
     test_emit!(rich_no_color);
     test_emit!(medium_no_color);
     test_emit!(short_no_color);
+    test_emit!(rich_ascii_no_color);
 }
 
 mod multifile {
@@ -530,6 +550,7 @@
     test_emit!(rich_no_color);
     test_emit!(medium_no_color);
     test_emit!(short_no_color);
+    test_emit!(rich_ascii_no_color);
 }
 
 mod fizz_buzz {
@@ -609,6 +630,7 @@
     test_emit!(rich_no_color);
     test_emit!(medium_no_color);
     test_emit!(short_no_color);
+    test_emit!(rich_ascii_no_color);
 }
 
 mod multiline_overlapping {
@@ -659,6 +681,7 @@
     test_emit!(rich_no_color);
     test_emit!(medium_no_color);
     test_emit!(short_no_color);
+    test_emit!(rich_ascii_no_color);
 }
 
 mod tabbed {
@@ -950,6 +973,7 @@
     test_emit!(rich_no_color);
     test_emit!(medium_no_color);
     test_emit!(short_no_color);
+    test_emit!(rich_ascii_no_color);
 }
 
 mod multiline_omit {