about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJonas Schievink <jonasschievink@gmail.com>2020-10-02 20:27:03 +0200
committerGitHub <noreply@github.com>2020-10-02 20:27:03 +0200
commitc7c2418227e103de4544c08706975dca8551110d (patch)
treefdfc2f4475655d5c718fc393e6a5733dd3c70296
parentc8eb2059dae70b99576352ded93592e6462daafc (diff)
parent4427b2d52c42d3eb7a7aecddcbbeff59ce613ab1 (diff)
downloadrust-c7c2418227e103de4544c08706975dca8551110d.tar.gz
rust-c7c2418227e103de4544c08706975dca8551110d.zip
Rollup merge of #76811 - GuillaumeGomez:doc-alias-name-restriction, r=oli-obk,ollie27
Doc alias name restriction

Fixes #76705.
-rw-r--r--compiler/rustc_passes/src/check_attr.rs34
-rw-r--r--src/doc/rustdoc/src/advanced-features.md2
-rw-r--r--src/librustdoc/clean/types.rs2
-rw-r--r--src/test/rustdoc-ui/check-doc-alias-attr.rs6
-rw-r--r--src/test/rustdoc-ui/check-doc-alias-attr.stderr34
-rw-r--r--src/test/ui/check-doc-alias-attr.rs6
-rw-r--r--src/test/ui/check-doc-alias-attr.stderr34
7 files changed, 108 insertions, 10 deletions
diff --git a/compiler/rustc_passes/src/check_attr.rs b/compiler/rustc_passes/src/check_attr.rs
index 1ec251326a8..b52216c45ce 100644
--- a/compiler/rustc_passes/src/check_attr.rs
+++ b/compiler/rustc_passes/src/check_attr.rs
@@ -260,23 +260,42 @@ impl CheckAttrVisitor<'tcx> {
         }
     }
 
+    fn doc_alias_str_error(&self, meta: &NestedMetaItem) {
+        self.tcx
+            .sess
+            .struct_span_err(
+                meta.span(),
+                "doc alias attribute expects a string: #[doc(alias = \"0\")]",
+            )
+            .emit();
+    }
+
     fn check_doc_alias(&self, attr: &Attribute, hir_id: HirId, target: Target) -> bool {
         if let Some(mi) = attr.meta() {
             if let Some(list) = mi.meta_item_list() {
                 for meta in list {
                     if meta.has_name(sym::alias) {
-                        if !meta.is_value_str()
-                            || meta
-                                .value_str()
-                                .map(|s| s.to_string())
-                                .unwrap_or_else(String::new)
-                                .is_empty()
+                        if !meta.is_value_str() {
+                            self.doc_alias_str_error(meta);
+                            return false;
+                        }
+                        let doc_alias =
+                            meta.value_str().map(|s| s.to_string()).unwrap_or_else(String::new);
+                        if doc_alias.is_empty() {
+                            self.doc_alias_str_error(meta);
+                            return false;
+                        }
+                        if let Some(c) =
+                            doc_alias.chars().find(|&c| c == '"' || c == '\'' || c.is_whitespace())
                         {
                             self.tcx
                                 .sess
                                 .struct_span_err(
                                     meta.span(),
-                                    "doc alias attribute expects a string: #[doc(alias = \"0\")]",
+                                    &format!(
+                                        "{:?} character isn't allowed in `#[doc(alias = \"...\")]`",
+                                        c,
+                                    ),
                                 )
                                 .emit();
                             return false;
@@ -312,6 +331,7 @@ impl CheckAttrVisitor<'tcx> {
                                     &format!("`#[doc(alias = \"...\")]` isn't allowed on {}", err),
                                 )
                                 .emit();
+                            return false;
                         }
                     }
                 }
diff --git a/src/doc/rustdoc/src/advanced-features.md b/src/doc/rustdoc/src/advanced-features.md
index c9a0dff5ab3..8c7926f116b 100644
--- a/src/doc/rustdoc/src/advanced-features.md
+++ b/src/doc/rustdoc/src/advanced-features.md
@@ -46,3 +46,5 @@ pub struct BigX;
 
 Then, when looking for it through the `rustdoc` search, if you enter "x" or
 "big", search will show the `BigX` struct first.
+
+There are some limitations on the doc alias names though: you can't use `"` or whitespace.
diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs
index 223fda84871..8fbfb04bac3 100644
--- a/src/librustdoc/clean/types.rs
+++ b/src/librustdoc/clean/types.rs
@@ -695,7 +695,7 @@ impl Attributes {
         self.other_attrs
             .lists(sym::doc)
             .filter(|a| a.has_name(sym::alias))
-            .filter_map(|a| a.value_str().map(|s| s.to_string().replace("\"", "")))
+            .filter_map(|a| a.value_str().map(|s| s.to_string()))
             .filter(|v| !v.is_empty())
             .collect::<FxHashSet<_>>()
     }
diff --git a/src/test/rustdoc-ui/check-doc-alias-attr.rs b/src/test/rustdoc-ui/check-doc-alias-attr.rs
index b02cc1a4545..c8bec39fad6 100644
--- a/src/test/rustdoc-ui/check-doc-alias-attr.rs
+++ b/src/test/rustdoc-ui/check-doc-alias-attr.rs
@@ -7,4 +7,10 @@ pub struct Bar;
 #[doc(alias)] //~ ERROR
 #[doc(alias = 0)] //~ ERROR
 #[doc(alias("bar"))] //~ ERROR
+#[doc(alias = "\"")] //~ ERROR
+#[doc(alias = "\n")] //~ ERROR
+#[doc(alias = "
+")] //~^ ERROR
+#[doc(alias = " ")] //~ ERROR
+#[doc(alias = "\t")] //~ ERROR
 pub struct Foo;
diff --git a/src/test/rustdoc-ui/check-doc-alias-attr.stderr b/src/test/rustdoc-ui/check-doc-alias-attr.stderr
index 268230ab44a..be7d7b3dbea 100644
--- a/src/test/rustdoc-ui/check-doc-alias-attr.stderr
+++ b/src/test/rustdoc-ui/check-doc-alias-attr.stderr
@@ -16,5 +16,37 @@ error: doc alias attribute expects a string: #[doc(alias = "0")]
 LL | #[doc(alias("bar"))]
    |       ^^^^^^^^^^^^
 
-error: aborting due to 3 previous errors
+error: '\"' character isn't allowed in `#[doc(alias = "...")]`
+  --> $DIR/check-doc-alias-attr.rs:10:7
+   |
+LL | #[doc(alias = "\"")]
+   |       ^^^^^^^^^^^^
+
+error: '\n' character isn't allowed in `#[doc(alias = "...")]`
+  --> $DIR/check-doc-alias-attr.rs:11:7
+   |
+LL | #[doc(alias = "\n")]
+   |       ^^^^^^^^^^^^
+
+error: '\n' character isn't allowed in `#[doc(alias = "...")]`
+  --> $DIR/check-doc-alias-attr.rs:12:7
+   |
+LL |   #[doc(alias = "
+   |  _______^
+LL | | ")]
+   | |_^
+
+error: ' ' character isn't allowed in `#[doc(alias = "...")]`
+  --> $DIR/check-doc-alias-attr.rs:14:7
+   |
+LL | #[doc(alias = " ")]
+   |       ^^^^^^^^^^^
+
+error: '\t' character isn't allowed in `#[doc(alias = "...")]`
+  --> $DIR/check-doc-alias-attr.rs:15:7
+   |
+LL | #[doc(alias = "\t")]
+   |       ^^^^^^^^^^^^
+
+error: aborting due to 8 previous errors
 
diff --git a/src/test/ui/check-doc-alias-attr.rs b/src/test/ui/check-doc-alias-attr.rs
index b02cc1a4545..c8bec39fad6 100644
--- a/src/test/ui/check-doc-alias-attr.rs
+++ b/src/test/ui/check-doc-alias-attr.rs
@@ -7,4 +7,10 @@ pub struct Bar;
 #[doc(alias)] //~ ERROR
 #[doc(alias = 0)] //~ ERROR
 #[doc(alias("bar"))] //~ ERROR
+#[doc(alias = "\"")] //~ ERROR
+#[doc(alias = "\n")] //~ ERROR
+#[doc(alias = "
+")] //~^ ERROR
+#[doc(alias = " ")] //~ ERROR
+#[doc(alias = "\t")] //~ ERROR
 pub struct Foo;
diff --git a/src/test/ui/check-doc-alias-attr.stderr b/src/test/ui/check-doc-alias-attr.stderr
index 268230ab44a..be7d7b3dbea 100644
--- a/src/test/ui/check-doc-alias-attr.stderr
+++ b/src/test/ui/check-doc-alias-attr.stderr
@@ -16,5 +16,37 @@ error: doc alias attribute expects a string: #[doc(alias = "0")]
 LL | #[doc(alias("bar"))]
    |       ^^^^^^^^^^^^
 
-error: aborting due to 3 previous errors
+error: '\"' character isn't allowed in `#[doc(alias = "...")]`
+  --> $DIR/check-doc-alias-attr.rs:10:7
+   |
+LL | #[doc(alias = "\"")]
+   |       ^^^^^^^^^^^^
+
+error: '\n' character isn't allowed in `#[doc(alias = "...")]`
+  --> $DIR/check-doc-alias-attr.rs:11:7
+   |
+LL | #[doc(alias = "\n")]
+   |       ^^^^^^^^^^^^
+
+error: '\n' character isn't allowed in `#[doc(alias = "...")]`
+  --> $DIR/check-doc-alias-attr.rs:12:7
+   |
+LL |   #[doc(alias = "
+   |  _______^
+LL | | ")]
+   | |_^
+
+error: ' ' character isn't allowed in `#[doc(alias = "...")]`
+  --> $DIR/check-doc-alias-attr.rs:14:7
+   |
+LL | #[doc(alias = " ")]
+   |       ^^^^^^^^^^^
+
+error: '\t' character isn't allowed in `#[doc(alias = "...")]`
+  --> $DIR/check-doc-alias-attr.rs:15:7
+   |
+LL | #[doc(alias = "\t")]
+   |       ^^^^^^^^^^^^
+
+error: aborting due to 8 previous errors