),
) {
- if let Some(pos) = tags.iter().position(|(t, _)| *t == tag_name) {
- for _ in pos + 1..tags.len() {
- if ALLOWED_UNCLOSED.iter().find(|&at| at == &tags[pos + 1].0).is_some() {
+ if let Some(pos) = tags.iter().rev().position(|(t, _)| *t == tag_name) {
+ // Because this is from a `rev` iterator, the position is reversed as well!
+ let pos = tags.len() - 1 - pos;
+ for (last_tag_name, last_tag_span) in tags.drain(pos + 1..) {
+ if ALLOWED_UNCLOSED.iter().any(|&at| at == &last_tag_name) {
continue;
}
// `tags` is used as a queue, meaning that everything after `pos` is included inside it.
// So `
` will look like `["h2", "h3"]`. So when closing `h2`, we will still
// have `h3`, meaning the tag wasn't closed as it should have.
- f(&format!("unclosed HTML tag `{}`", tags[pos + 1].0), &tags[pos + 1].1);
- tags.remove(pos + 1);
+ f(&format!("unclosed HTML tag `{}`", last_tag_name), &last_tag_span);
}
- tags.remove(pos);
+ // Remove the `tag_name` that was originally closed
+ tags.pop();
} else {
// It can happen for example in this case: `` (the `h2` tag isn't required
// but it helps for the visualization).
@@ -84,7 +86,13 @@ fn extract_tag(
tag_name.push(*c);
} else {
if !tag_name.is_empty() {
- let r = Range { start: range.start + start_pos, end: range.start + pos };
+ let mut r =
+ Range { start: range.start + start_pos, end: range.start + pos };
+ if *c == '>' {
+ // In case we have a tag without attribute, we can consider the span to
+ // refer to it fully.
+ r.end += 1;
+ }
if is_closing {
drop_tag(tags, tag_name, r, f);
} else {
diff --git a/src/test/rustdoc-ui/invalid-html-tags.rs b/src/test/rustdoc-ui/invalid-html-tags.rs
index b188e16f6051..51bbae2a0b64 100644
--- a/src/test/rustdoc-ui/invalid-html-tags.rs
+++ b/src/test/rustdoc-ui/invalid-html-tags.rs
@@ -20,3 +20,22 @@ pub fn foo() {}
///
//~^ ERROR unopened HTML tag `hello`
pub fn f() {}
+
+///
+///
+//~^ ERROR unclosed HTML tag `p`
+///
+pub fn a() {}
+
+///
+pub fn b() {}
+
+///
+//~^ ERROR unclosed HTML tag `div`
+///
+//~^ ERROR unclosed HTML tag `h3`
+pub fn c() {}
diff --git a/src/test/rustdoc-ui/invalid-html-tags.stderr b/src/test/rustdoc-ui/invalid-html-tags.stderr
index f8e67732f63a..d2e9704a2279 100644
--- a/src/test/rustdoc-ui/invalid-html-tags.stderr
+++ b/src/test/rustdoc-ui/invalid-html-tags.stderr
@@ -2,7 +2,7 @@ error: unclosed HTML tag `unknown`
--> $DIR/invalid-html-tags.rs:7:5
|
LL | ///
- | ^^^^^^^^
+ | ^^^^^^^^^
|
note: the lint level is defined here
--> $DIR/invalid-html-tags.rs:1:9
@@ -14,25 +14,43 @@ error: unclosed HTML tag `script`
--> $DIR/invalid-html-tags.rs:10:5
|
LL | ///