From d51b4462ec2d4a7d8d647afcf86353ca4e971b70 Mon Sep 17 00:00:00 2001
From: ardi <ardis@ardi.dev>
Date: Fri, 7 Jun 2024 16:25:43 +0200
Subject: [PATCH 1/2] Improve conflict marker recovery

---
 .../rustc_parse/src/parser/diagnostics.rs     | 51 ++++++++++++++-----
 tests/ui/parser/diff-markers/enum-2.stderr    | 19 ++++---
 tests/ui/parser/diff-markers/enum.stderr      | 17 ++++---
 tests/ui/parser/diff-markers/fn-arg.stderr    | 17 ++++---
 .../parser/diff-markers/item-with-attr.stderr | 17 ++++---
 tests/ui/parser/diff-markers/item.stderr      | 17 ++++---
 tests/ui/parser/diff-markers/statement.stderr | 17 ++++---
 .../ui/parser/diff-markers/struct-expr.stderr | 17 ++++---
 tests/ui/parser/diff-markers/struct.stderr    | 17 ++++---
 .../ui/parser/diff-markers/trait-item.stderr  | 17 ++++---
 .../parser/diff-markers/tuple-struct.stderr   | 17 ++++---
 .../unclosed-delims-in-macro.stderr           | 17 ++++---
 .../ui/parser/diff-markers/unclosed-delims.rs | 10 ++--
 .../diff-markers/unclosed-delims.stderr       | 17 ++++---
 .../parser/diff-markers/use-statement.stderr  | 17 ++++---
 15 files changed, 189 insertions(+), 95 deletions(-)

diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs
index c1aac84bcaec7..e4630bbceb9bb 100644
--- a/compiler/rustc_parse/src/parser/diagnostics.rs
+++ b/compiler/rustc_parse/src/parser/diagnostics.rs
@@ -2990,14 +2990,18 @@ impl<'a> Parser<'a> {
     }
 
     pub(crate) fn err_vcs_conflict_marker(&mut self) -> PResult<'a, ()> {
+        // <<<<<<<
         let Some(start) = self.conflict_marker(&TokenKind::BinOp(token::Shl), &TokenKind::Lt)
         else {
             return Ok(());
         };
         let mut spans = Vec::with_capacity(3);
         spans.push(start);
+        // |||||||
         let mut middlediff3 = None;
+        // =======
         let mut middle = None;
+        // >>>>>>>
         let mut end = None;
         loop {
             if self.token.kind == TokenKind::Eof {
@@ -3018,29 +3022,50 @@ impl<'a> Parser<'a> {
             }
             self.bump();
         }
+
         let mut err = self.dcx().struct_span_err(spans, "encountered diff marker");
-        err.span_label(start, "after this is the code before the merge");
-        if let Some(middle) = middlediff3 {
-            err.span_label(middle, "");
-        }
+        match middlediff3 {
+            // We're using diff3
+            Some(middlediff3) => {
+                err.span_label(
+                    start,
+                    "between this marker and `|||||||` is the code that we're merging into",
+                );
+                err.span_label(middlediff3, "between this marker and `=======` is the base code (what the two refs diverged from)");
+            }
+            None => {
+                err.span_label(
+                    start,
+                    "between this marker and `=======` is the code that we're merging into",
+                );
+            }
+        };
+
         if let Some(middle) = middle {
-            err.span_label(middle, "");
+            err.span_label(middle, "between this marker and `>>>>>>>` is the incoming code");
         }
         if let Some(end) = end {
-            err.span_label(end, "above this are the incoming code changes");
+            err.span_label(end, "this marker concludes the conflict region");
         }
-        err.help(
-            "if you're having merge conflicts after pulling new code, the top section is the code \
-             you already had and the bottom section is the remote code",
+        err.note(
+            "conflict markers indicate that a merge was started but could not be completed due \
+             to merge conflicts\n\
+             to resolve a conflict, keep only the code you want and then delete the lines \
+             containing conflict markers",
         );
         err.help(
-            "if you're in the middle of a rebase, the top section is the code being rebased onto \
-             and the bottom section is the code coming from the current commit being rebased",
+            "if you're having merge conflicts after pulling new code:\n\
+             the top section is the code you already had and the bottom section is the remote code\n\
+             if you're in the middle of a rebase:\n\
+             the top section is the code being rebased onto and the bottom section is the code \
+             coming from the current commit being rebased",
         );
+
         err.note(
-            "for an explanation on these markers from the `git` documentation, visit \
-             <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>",
+            "for an explanation on these markers from the `git` documentation:\n\
+             visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>",
         );
+
         Err(err)
     }
 
diff --git a/tests/ui/parser/diff-markers/enum-2.stderr b/tests/ui/parser/diff-markers/enum-2.stderr
index 20e551c2f959a..b76cf5d5a01ee 100644
--- a/tests/ui/parser/diff-markers/enum-2.stderr
+++ b/tests/ui/parser/diff-markers/enum-2.stderr
@@ -2,20 +2,25 @@ error: encountered diff marker
   --> $DIR/enum-2.rs:3:1
    |
 LL | <<<<<<< HEAD
-   | ^^^^^^^ after this is the code before the merge
+   | ^^^^^^^ between this marker and `|||||||` is the code that we're merging into
 LL |         x: u8,
 LL | |||||||
-   | -------
+   | ------- between this marker and `=======` is the base code (what the two refs diverged from)
 LL |         z: (),
 LL | =======
-   | -------
+   | ------- between this marker and `>>>>>>>` is the incoming code
 LL |         y: i8,
 LL | >>>>>>> branch
-   | ^^^^^^^ above this are the incoming code changes
+   | ^^^^^^^ this marker concludes the conflict region
    |
-   = help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
-   = help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
-   = note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
+   = note: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
+           to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
+   = help: if you're having merge conflicts after pulling new code:
+           the top section is the code you already had and the bottom section is the remote code
+           if you're in the middle of a rebase:
+           the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
+   = note: for an explanation on these markers from the `git` documentation:
+           visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/parser/diff-markers/enum.stderr b/tests/ui/parser/diff-markers/enum.stderr
index be94331dce528..0ce473bc70232 100644
--- a/tests/ui/parser/diff-markers/enum.stderr
+++ b/tests/ui/parser/diff-markers/enum.stderr
@@ -2,17 +2,22 @@ error: encountered diff marker
   --> $DIR/enum.rs:2:1
    |
 LL | <<<<<<< HEAD
-   | ^^^^^^^ after this is the code before the merge
+   | ^^^^^^^ between this marker and `=======` is the code that we're merging into
 LL |     Foo(u8),
 LL | =======
-   | -------
+   | ------- between this marker and `>>>>>>>` is the incoming code
 LL |     Bar(i8),
 LL | >>>>>>> branch
-   | ^^^^^^^ above this are the incoming code changes
+   | ^^^^^^^ this marker concludes the conflict region
    |
-   = help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
-   = help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
-   = note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
+   = note: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
+           to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
+   = help: if you're having merge conflicts after pulling new code:
+           the top section is the code you already had and the bottom section is the remote code
+           if you're in the middle of a rebase:
+           the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
+   = note: for an explanation on these markers from the `git` documentation:
+           visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/parser/diff-markers/fn-arg.stderr b/tests/ui/parser/diff-markers/fn-arg.stderr
index aabcb826c1283..24521ffa62623 100644
--- a/tests/ui/parser/diff-markers/fn-arg.stderr
+++ b/tests/ui/parser/diff-markers/fn-arg.stderr
@@ -2,17 +2,22 @@ error: encountered diff marker
   --> $DIR/fn-arg.rs:3:1
    |
 LL | <<<<<<< HEAD
-   | ^^^^^^^ after this is the code before the merge
+   | ^^^^^^^ between this marker and `=======` is the code that we're merging into
 LL |         x: u8,
 LL | =======
-   | -------
+   | ------- between this marker and `>>>>>>>` is the incoming code
 LL |         x: i8,
 LL | >>>>>>> branch
-   | ^^^^^^^ above this are the incoming code changes
+   | ^^^^^^^ this marker concludes the conflict region
    |
-   = help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
-   = help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
-   = note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
+   = note: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
+           to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
+   = help: if you're having merge conflicts after pulling new code:
+           the top section is the code you already had and the bottom section is the remote code
+           if you're in the middle of a rebase:
+           the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
+   = note: for an explanation on these markers from the `git` documentation:
+           visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/parser/diff-markers/item-with-attr.stderr b/tests/ui/parser/diff-markers/item-with-attr.stderr
index eefb2792e90bc..432673cd5518b 100644
--- a/tests/ui/parser/diff-markers/item-with-attr.stderr
+++ b/tests/ui/parser/diff-markers/item-with-attr.stderr
@@ -2,17 +2,22 @@ error: encountered diff marker
   --> $DIR/item-with-attr.rs:2:1
    |
 LL | <<<<<<< HEAD
-   | ^^^^^^^ after this is the code before the merge
+   | ^^^^^^^ between this marker and `=======` is the code that we're merging into
 LL | fn foo() {}
 LL | =======
-   | -------
+   | ------- between this marker and `>>>>>>>` is the incoming code
 LL | fn bar() {}
 LL | >>>>>>> branch
-   | ^^^^^^^ above this are the incoming code changes
+   | ^^^^^^^ this marker concludes the conflict region
    |
-   = help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
-   = help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
-   = note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
+   = note: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
+           to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
+   = help: if you're having merge conflicts after pulling new code:
+           the top section is the code you already had and the bottom section is the remote code
+           if you're in the middle of a rebase:
+           the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
+   = note: for an explanation on these markers from the `git` documentation:
+           visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/parser/diff-markers/item.stderr b/tests/ui/parser/diff-markers/item.stderr
index a3092ebfcfd36..180c74e5d6967 100644
--- a/tests/ui/parser/diff-markers/item.stderr
+++ b/tests/ui/parser/diff-markers/item.stderr
@@ -2,17 +2,22 @@ error: encountered diff marker
   --> $DIR/item.rs:1:1
    |
 LL | <<<<<<< HEAD
-   | ^^^^^^^ after this is the code before the merge
+   | ^^^^^^^ between this marker and `=======` is the code that we're merging into
 LL | fn foo() {}
 LL | =======
-   | -------
+   | ------- between this marker and `>>>>>>>` is the incoming code
 LL | fn bar() {}
 LL | >>>>>>> branch
-   | ^^^^^^^ above this are the incoming code changes
+   | ^^^^^^^ this marker concludes the conflict region
    |
-   = help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
-   = help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
-   = note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
+   = note: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
+           to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
+   = help: if you're having merge conflicts after pulling new code:
+           the top section is the code you already had and the bottom section is the remote code
+           if you're in the middle of a rebase:
+           the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
+   = note: for an explanation on these markers from the `git` documentation:
+           visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/parser/diff-markers/statement.stderr b/tests/ui/parser/diff-markers/statement.stderr
index c6c6cae876594..6dccce4a48eee 100644
--- a/tests/ui/parser/diff-markers/statement.stderr
+++ b/tests/ui/parser/diff-markers/statement.stderr
@@ -2,17 +2,22 @@ error: encountered diff marker
   --> $DIR/statement.rs:10:1
    |
 LL | <<<<<<< HEAD
-   | ^^^^^^^ after this is the code before the merge
+   | ^^^^^^^ between this marker and `=======` is the code that we're merging into
 LL |     S::foo();
 LL | =======
-   | -------
+   | ------- between this marker and `>>>>>>>` is the incoming code
 LL |     S::bar();
 LL | >>>>>>> branch
-   | ^^^^^^^ above this are the incoming code changes
+   | ^^^^^^^ this marker concludes the conflict region
    |
-   = help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
-   = help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
-   = note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
+   = note: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
+           to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
+   = help: if you're having merge conflicts after pulling new code:
+           the top section is the code you already had and the bottom section is the remote code
+           if you're in the middle of a rebase:
+           the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
+   = note: for an explanation on these markers from the `git` documentation:
+           visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/parser/diff-markers/struct-expr.stderr b/tests/ui/parser/diff-markers/struct-expr.stderr
index bdea8c841c638..3733cdd349644 100644
--- a/tests/ui/parser/diff-markers/struct-expr.stderr
+++ b/tests/ui/parser/diff-markers/struct-expr.stderr
@@ -2,17 +2,22 @@ error: encountered diff marker
   --> $DIR/struct-expr.rs:6:1
    |
 LL | <<<<<<< HEAD
-   | ^^^^^^^ after this is the code before the merge
+   | ^^^^^^^ between this marker and `=======` is the code that we're merging into
 LL |         x: 42,
 LL | =======
-   | -------
+   | ------- between this marker and `>>>>>>>` is the incoming code
 LL |         x: 0,
 LL | >>>>>>> branch
-   | ^^^^^^^ above this are the incoming code changes
+   | ^^^^^^^ this marker concludes the conflict region
    |
-   = help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
-   = help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
-   = note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
+   = note: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
+           to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
+   = help: if you're having merge conflicts after pulling new code:
+           the top section is the code you already had and the bottom section is the remote code
+           if you're in the middle of a rebase:
+           the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
+   = note: for an explanation on these markers from the `git` documentation:
+           visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/parser/diff-markers/struct.stderr b/tests/ui/parser/diff-markers/struct.stderr
index 749941290cb82..44f8346613e68 100644
--- a/tests/ui/parser/diff-markers/struct.stderr
+++ b/tests/ui/parser/diff-markers/struct.stderr
@@ -2,17 +2,22 @@ error: encountered diff marker
   --> $DIR/struct.rs:2:1
    |
 LL | <<<<<<< HEAD
-   | ^^^^^^^ after this is the code before the merge
+   | ^^^^^^^ between this marker and `=======` is the code that we're merging into
 LL |     x: u8,
 LL | =======
-   | -------
+   | ------- between this marker and `>>>>>>>` is the incoming code
 LL |     x: i8,
 LL | >>>>>>> branch
-   | ^^^^^^^ above this are the incoming code changes
+   | ^^^^^^^ this marker concludes the conflict region
    |
-   = help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
-   = help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
-   = note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
+   = note: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
+           to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
+   = help: if you're having merge conflicts after pulling new code:
+           the top section is the code you already had and the bottom section is the remote code
+           if you're in the middle of a rebase:
+           the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
+   = note: for an explanation on these markers from the `git` documentation:
+           visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/parser/diff-markers/trait-item.stderr b/tests/ui/parser/diff-markers/trait-item.stderr
index f01bbe8ba0340..4361542c7743b 100644
--- a/tests/ui/parser/diff-markers/trait-item.stderr
+++ b/tests/ui/parser/diff-markers/trait-item.stderr
@@ -2,17 +2,22 @@ error: encountered diff marker
   --> $DIR/trait-item.rs:2:1
    |
 LL | <<<<<<< HEAD
-   | ^^^^^^^ after this is the code before the merge
+   | ^^^^^^^ between this marker and `=======` is the code that we're merging into
 LL |     fn foo() {}
 LL | =======
-   | -------
+   | ------- between this marker and `>>>>>>>` is the incoming code
 LL |     fn bar() {}
 LL | >>>>>>> branch
-   | ^^^^^^^ above this are the incoming code changes
+   | ^^^^^^^ this marker concludes the conflict region
    |
-   = help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
-   = help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
-   = note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
+   = note: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
+           to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
+   = help: if you're having merge conflicts after pulling new code:
+           the top section is the code you already had and the bottom section is the remote code
+           if you're in the middle of a rebase:
+           the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
+   = note: for an explanation on these markers from the `git` documentation:
+           visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/parser/diff-markers/tuple-struct.stderr b/tests/ui/parser/diff-markers/tuple-struct.stderr
index 8dae123c96dca..7fda24ba48532 100644
--- a/tests/ui/parser/diff-markers/tuple-struct.stderr
+++ b/tests/ui/parser/diff-markers/tuple-struct.stderr
@@ -2,17 +2,22 @@ error: encountered diff marker
   --> $DIR/tuple-struct.rs:2:1
    |
 LL | <<<<<<< HEAD
-   | ^^^^^^^ after this is the code before the merge
+   | ^^^^^^^ between this marker and `=======` is the code that we're merging into
 LL |     u8,
 LL | =======
-   | -------
+   | ------- between this marker and `>>>>>>>` is the incoming code
 LL |     i8,
 LL | >>>>>>> branch
-   | ^^^^^^^ above this are the incoming code changes
+   | ^^^^^^^ this marker concludes the conflict region
    |
-   = help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
-   = help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
-   = note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
+   = note: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
+           to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
+   = help: if you're having merge conflicts after pulling new code:
+           the top section is the code you already had and the bottom section is the remote code
+           if you're in the middle of a rebase:
+           the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
+   = note: for an explanation on these markers from the `git` documentation:
+           visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/parser/diff-markers/unclosed-delims-in-macro.stderr b/tests/ui/parser/diff-markers/unclosed-delims-in-macro.stderr
index 6995b8e6f2370..927821ddfaedb 100644
--- a/tests/ui/parser/diff-markers/unclosed-delims-in-macro.stderr
+++ b/tests/ui/parser/diff-markers/unclosed-delims-in-macro.stderr
@@ -2,17 +2,22 @@ error: encountered diff marker
   --> $DIR/unclosed-delims-in-macro.rs:2:1
    |
 LL | <<<<<<< HEAD
-   | ^^^^^^^ after this is the code before the merge
+   | ^^^^^^^ between this marker and `=======` is the code that we're merging into
 ...
 LL | =======
-   | -------
+   | ------- between this marker and `>>>>>>>` is the incoming code
 LL |     () { //
 LL | >>>>>>> 7a4f13c blah blah blah
-   | ^^^^^^^ above this are the incoming code changes
+   | ^^^^^^^ this marker concludes the conflict region
    |
-   = help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
-   = help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
-   = note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
+   = note: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
+           to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
+   = help: if you're having merge conflicts after pulling new code:
+           the top section is the code you already had and the bottom section is the remote code
+           if you're in the middle of a rebase:
+           the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
+   = note: for an explanation on these markers from the `git` documentation:
+           visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/parser/diff-markers/unclosed-delims.rs b/tests/ui/parser/diff-markers/unclosed-delims.rs
index 653a605c28c60..7d400c3827bb6 100644
--- a/tests/ui/parser/diff-markers/unclosed-delims.rs
+++ b/tests/ui/parser/diff-markers/unclosed-delims.rs
@@ -2,13 +2,17 @@ mod tests {
     #[test]
 <<<<<<< HEAD
 //~^ ERROR encountered diff marker
-//~| NOTE after this is the code before the merge
+//~| NOTE between this marker and `=======`
+
+//~| NOTE conflict markers indicate that
+//~| HELP if you're having merge conflicts
 //~| NOTE for an explanation on these markers
+
     fn test1() {
 =======
-//~^ NOTE
+//~^ NOTE between this marker and `>>>>>>>`
     fn test2() {
 >>>>>>> 7a4f13c blah blah blah
-//~^ NOTE above this are the incoming code changes
+//~^ NOTE this marker concludes the conflict region
     }
 }
diff --git a/tests/ui/parser/diff-markers/unclosed-delims.stderr b/tests/ui/parser/diff-markers/unclosed-delims.stderr
index d4636150e66b7..1eab96442b4f2 100644
--- a/tests/ui/parser/diff-markers/unclosed-delims.stderr
+++ b/tests/ui/parser/diff-markers/unclosed-delims.stderr
@@ -2,17 +2,22 @@ error: encountered diff marker
   --> $DIR/unclosed-delims.rs:3:1
    |
 LL | <<<<<<< HEAD
-   | ^^^^^^^ after this is the code before the merge
+   | ^^^^^^^ between this marker and `=======` is the code that we're merging into
 ...
 LL | =======
-   | -------
+   | ------- between this marker and `>>>>>>>` is the incoming code
 ...
 LL | >>>>>>> 7a4f13c blah blah blah
-   | ^^^^^^^ above this are the incoming code changes
+   | ^^^^^^^ this marker concludes the conflict region
    |
-   = help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
-   = help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
-   = note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
+   = note: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
+           to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
+   = help: if you're having merge conflicts after pulling new code:
+           the top section is the code you already had and the bottom section is the remote code
+           if you're in the middle of a rebase:
+           the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
+   = note: for an explanation on these markers from the `git` documentation:
+           visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/parser/diff-markers/use-statement.stderr b/tests/ui/parser/diff-markers/use-statement.stderr
index 6d376166a7f7a..3eac7bebb5af1 100644
--- a/tests/ui/parser/diff-markers/use-statement.stderr
+++ b/tests/ui/parser/diff-markers/use-statement.stderr
@@ -2,17 +2,22 @@ error: encountered diff marker
   --> $DIR/use-statement.rs:2:1
    |
 LL | <<<<<<< HEAD
-   | ^^^^^^^ after this is the code before the merge
+   | ^^^^^^^ between this marker and `=======` is the code that we're merging into
 LL |     bar,
 LL | =======
-   | -------
+   | ------- between this marker and `>>>>>>>` is the incoming code
 LL |     baz,
 LL | >>>>>>> branch
-   | ^^^^^^^ above this are the incoming code changes
+   | ^^^^^^^ this marker concludes the conflict region
    |
-   = help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
-   = help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
-   = note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
+   = note: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
+           to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
+   = help: if you're having merge conflicts after pulling new code:
+           the top section is the code you already had and the bottom section is the remote code
+           if you're in the middle of a rebase:
+           the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
+   = note: for an explanation on these markers from the `git` documentation:
+           visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>
 
 error: aborting due to 1 previous error
 

From 9f6371236f516ac2a883eb8707839ab80fc7f9f7 Mon Sep 17 00:00:00 2001
From: ardi <ardis@ardi.dev>
Date: Mon, 10 Jun 2024 10:16:51 +0200
Subject: [PATCH 2/2] make this comment correct

---
 compiler/rustc_parse/src/parser/diagnostics.rs | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs
index e4630bbceb9bb..db23ce6fb7b39 100644
--- a/compiler/rustc_parse/src/parser/diagnostics.rs
+++ b/compiler/rustc_parse/src/parser/diagnostics.rs
@@ -2958,9 +2958,10 @@ impl<'a> Parser<'a> {
 
     /// This checks if this is a conflict marker, depending of the parameter passed.
     ///
-    /// * `>>>>>`
-    /// * `=====`
-    /// * `<<<<<`
+    /// * `<<<<<<<`
+    /// * `|||||||`
+    /// * `=======`
+    /// * `>>>>>>>`
     ///
     pub(super) fn is_vcs_conflict_marker(
         &mut self,