about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2024-05-31 08:50:23 +0200
committerGitHub <noreply@github.com>2024-05-31 08:50:23 +0200
commit4aafc1175e11a1a8d90def51d7e7d19aa3b5c9bc (patch)
tree91b8077e4bdfe38a1a71a4a46c69c034fbc6cf52
parent379233242b755af755c06a3807306f69b2e7b781 (diff)
parented5205fe66ccd49116e99e4244483caaa8cf933e (diff)
downloadrust-4aafc1175e11a1a8d90def51d7e7d19aa3b5c9bc.tar.gz
rust-4aafc1175e11a1a8d90def51d7e7d19aa3b5c9bc.zip
Rollup merge of #125774 - mu001999-contrib:fix/125757, r=compiler-errors
Avoid unwrap diag.code directly in note_and_explain_type_err

<!--
If this PR is related to an unstable feature or an otherwise tracked effort,
please link to the relevant tracking issue here. If you don't know of a related
tracking issue or there are none, feel free to ignore this.

This PR will get automatically assigned to a reviewer. In case you would like
a specific user to review your work, you can assign it to them by using

    r​? <reviewer name>
-->

Fixes #125757
-rw-r--r--compiler/rustc_infer/src/infer/error_reporting/note_and_explain.rs4
-rw-r--r--tests/ui/specialization/default-proj-ty-as-type-of-const-issue-125757.rs19
-rw-r--r--tests/ui/specialization/default-proj-ty-as-type-of-const-issue-125757.stderr36
3 files changed, 57 insertions, 2 deletions
diff --git a/compiler/rustc_infer/src/infer/error_reporting/note_and_explain.rs b/compiler/rustc_infer/src/infer/error_reporting/note_and_explain.rs
index f4514c23508..19ef2d61fca 100644
--- a/compiler/rustc_infer/src/infer/error_reporting/note_and_explain.rs
+++ b/compiler/rustc_infer/src/infer/error_reporting/note_and_explain.rs
@@ -182,7 +182,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
                             diag.span_label(p_span, format!("{expected}this type parameter"));
                         }
                         diag.help("type parameters must be constrained to match other types");
-                        if tcx.sess.teach(diag.code.unwrap()) {
+                        if diag.code.is_some_and(|code| tcx.sess.teach(code)) {
                             diag.help(
                                 "given a type parameter `T` and a method `foo`:
 ```
@@ -663,7 +663,7 @@ impl<T> Trait<T> for X {
                  https://doc.rust-lang.org/book/ch19-03-advanced-traits.html",
             );
         }
-        if tcx.sess.teach(diag.code.unwrap()) {
+        if diag.code.is_some_and(|code| tcx.sess.teach(code)) {
             diag.help(
                 "given an associated type `T` and a method `foo`:
 ```
diff --git a/tests/ui/specialization/default-proj-ty-as-type-of-const-issue-125757.rs b/tests/ui/specialization/default-proj-ty-as-type-of-const-issue-125757.rs
new file mode 100644
index 00000000000..59a015da84e
--- /dev/null
+++ b/tests/ui/specialization/default-proj-ty-as-type-of-const-issue-125757.rs
@@ -0,0 +1,19 @@
+#![feature(specialization)]
+#![allow(incomplete_features)]
+
+trait Trait {
+    type Type;
+}
+
+impl Trait for i32 {
+    default type Type = i32;
+}
+
+struct Wrapper<const C: <i32 as Trait>::Type> {}
+//~^ ERROR `<i32 as Trait>::Type` is forbidden as the type of a const generic parameter
+
+impl<const C: usize> Wrapper<C> {}
+//~^ ERROR the constant `C` is not of type `<i32 as Trait>::Type`
+//~^^ ERROR mismatched types
+
+fn main() {}
diff --git a/tests/ui/specialization/default-proj-ty-as-type-of-const-issue-125757.stderr b/tests/ui/specialization/default-proj-ty-as-type-of-const-issue-125757.stderr
new file mode 100644
index 00000000000..b4c14c2294e
--- /dev/null
+++ b/tests/ui/specialization/default-proj-ty-as-type-of-const-issue-125757.stderr
@@ -0,0 +1,36 @@
+error: `<i32 as Trait>::Type` is forbidden as the type of a const generic parameter
+  --> $DIR/default-proj-ty-as-type-of-const-issue-125757.rs:12:25
+   |
+LL | struct Wrapper<const C: <i32 as Trait>::Type> {}
+   |                         ^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: the only supported types are integers, `bool` and `char`
+
+error: the constant `C` is not of type `<i32 as Trait>::Type`
+  --> $DIR/default-proj-ty-as-type-of-const-issue-125757.rs:15:22
+   |
+LL | impl<const C: usize> Wrapper<C> {}
+   |                      ^^^^^^^^^^ expected associated type, found `usize`
+   |
+   = help: consider constraining the associated type `<i32 as Trait>::Type` to `usize`
+   = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
+note: required by a bound in `Wrapper`
+  --> $DIR/default-proj-ty-as-type-of-const-issue-125757.rs:12:16
+   |
+LL | struct Wrapper<const C: <i32 as Trait>::Type> {}
+   |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `Wrapper`
+
+error[E0308]: mismatched types
+  --> $DIR/default-proj-ty-as-type-of-const-issue-125757.rs:15:30
+   |
+LL | impl<const C: usize> Wrapper<C> {}
+   |                              ^ expected associated type, found `usize`
+   |
+   = note: expected associated type `<i32 as Trait>::Type`
+                         found type `usize`
+   = help: consider constraining the associated type `<i32 as Trait>::Type` to `usize`
+   = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0308`.