]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc/traits/error_reporting.rs
Account for `rustc_on_unimplemented`
[rust.git] / src / librustc / traits / error_reporting.rs
index ffd4560d32d8e348ca41543952b3d7a33b12948c..1321d5348a29962b4f45fb7fbbfd528343eda379 100644 (file)
@@ -776,6 +776,7 @@ pub fn report_selection_error(
                             &mut err,
                             &trait_ref,
                             points_at_arg,
+                            have_alt_message,
                         ) {
                             self.note_obligation_cause(&mut err, obligation);
                             err.emit();
@@ -1318,6 +1319,7 @@ fn suggest_add_reference_to_arg(
         err: &mut DiagnosticBuilder<'tcx>,
         trait_ref: &ty::Binder<ty::TraitRef<'tcx>>,
         points_at_arg: bool,
+        has_custom_message: bool,
     ) -> bool {
         if !points_at_arg {
             return false;
@@ -1346,14 +1348,16 @@ fn suggest_add_reference_to_arg(
                     // original type obligation, not the last one that failed, which is arbitrary.
                     // Because of this, we modify the error to refer to the original obligation and
                     // return early in the caller.
-                    err.message = vec![(
-                        format!(
-                            "the trait bound `{}: {}` is not satisfied",
-                            found,
-                            obligation.parent_trait_ref.skip_binder(),
-                        ),
-                        Style::NoStyle,
-                    )];
+                    let msg = format!(
+                        "the trait bound `{}: {}` is not satisfied",
+                        found,
+                        obligation.parent_trait_ref.skip_binder(),
+                    );
+                    if has_custom_message {
+                        err.note(&msg);
+                    } else {
+                        err.message = vec![(msg, Style::NoStyle)];
+                    }
                     if snippet.starts_with('&') {
                         // This is already a literal borrow and the obligation is failing
                         // somewhere else in the obligation chain. Do not suggest non-sense.