about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_trait_selection/src/traits/error_reporting/type_err_ctxt_ext.rs3
-rw-r--r--src/tools/compiletest/src/header.rs5
-rw-r--r--src/tools/compiletest/src/runtest.rs4
-rw-r--r--tests/ui/const-generics/kind_mismatch.rs24
-rw-r--r--tests/ui/const-generics/kind_mismatch.stderr39
5 files changed, 72 insertions, 3 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/type_err_ctxt_ext.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/type_err_ctxt_ext.rs
index 925fe98d293..96596de32aa 100644
--- a/compiler/rustc_trait_selection/src/traits/error_reporting/type_err_ctxt_ext.rs
+++ b/compiler/rustc_trait_selection/src/traits/error_reporting/type_err_ctxt_ext.rs
@@ -1977,6 +1977,9 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
                     for (obligation_arg, impl_arg) in
                         std::iter::zip(obligation_trait_ref.args, impl_trait_ref.args)
                     {
+                        if (obligation_arg, impl_arg).references_error() {
+                            return false;
+                        }
                         if let Err(terr) =
                             ocx.eq(&ObligationCause::dummy(), param_env, impl_arg, obligation_arg)
                         {
diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs
index f78e0363f55..daa605f6d03 100644
--- a/src/tools/compiletest/src/header.rs
+++ b/src/tools/compiletest/src/header.rs
@@ -265,7 +265,10 @@ impl TestProps {
             aux_bins: vec![],
             aux_crates: vec![],
             revisions: vec![],
-            rustc_env: vec![("RUSTC_ICE".to_string(), "0".to_string())],
+            rustc_env: vec![
+                ("RUSTC_ICE".to_string(), "0".to_string()),
+                ("RUST_BACKTRACE".to_string(), "short".to_string()),
+            ],
             unset_rustc_env: vec![("RUSTC_LOG_COLOR".to_string())],
             exec_env: vec![],
             unset_exec_env: vec![],
diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs
index 38d22fef113..1dd639a8918 100644
--- a/src/tools/compiletest/src/runtest.rs
+++ b/src/tools/compiletest/src/runtest.rs
@@ -2173,8 +2173,8 @@ impl<'test> TestCx<'test> {
         let aux_dir = self.aux_output_dir();
         self.build_all_auxiliary(&self.testpaths, &aux_dir, &mut rustc);
 
-        self.props.unset_rustc_env.iter().fold(&mut rustc, Command::env_remove);
         rustc.envs(self.props.rustc_env.clone());
+        self.props.unset_rustc_env.iter().fold(&mut rustc, Command::env_remove);
         self.compose_and_run(
             rustc,
             self.config.compile_lib_path.to_str().unwrap(),
@@ -2220,10 +2220,10 @@ impl<'test> TestCx<'test> {
         );
         aux_cx.build_all_auxiliary(of, &aux_dir, &mut aux_rustc);
 
+        aux_rustc.envs(aux_props.rustc_env.clone());
         for key in &aux_props.unset_rustc_env {
             aux_rustc.env_remove(key);
         }
-        aux_rustc.envs(aux_props.rustc_env.clone());
 
         let (aux_type, crate_type) = if is_bin {
             (AuxType::Bin, Some("bin"))
diff --git a/tests/ui/const-generics/kind_mismatch.rs b/tests/ui/const-generics/kind_mismatch.rs
new file mode 100644
index 00000000000..bab58d5952a
--- /dev/null
+++ b/tests/ui/const-generics/kind_mismatch.rs
@@ -0,0 +1,24 @@
+//! This test used to ICE in typeck because of the type/const mismatch,
+//! even though wfcheck already errored.
+//! issue: rust-lang/rust#123457
+
+pub struct KeyHolder<const K: u8> {}
+
+pub trait ContainsKey<const K: u8> {}
+
+pub trait SubsetExcept<P> {}
+
+impl<K> ContainsKey<K> for KeyHolder<K> {}
+//~^ ERROR: type provided when a constant was expected
+//~| ERROR: type provided when a constant was expected
+
+impl<P, T: ContainsKey<0>> SubsetExcept<P> for T {}
+
+pub fn remove_key<K, S: SubsetExcept<K>>() -> S {
+    loop {}
+}
+
+fn main() {
+    let map: KeyHolder<0> = remove_key::<_, _>();
+    //~^ ERROR: the trait bound `KeyHolder<0>: SubsetExcept<_>` is not satisfied
+}
diff --git a/tests/ui/const-generics/kind_mismatch.stderr b/tests/ui/const-generics/kind_mismatch.stderr
new file mode 100644
index 00000000000..80968ebea68
--- /dev/null
+++ b/tests/ui/const-generics/kind_mismatch.stderr
@@ -0,0 +1,39 @@
+error[E0747]: type provided when a constant was expected
+  --> $DIR/kind_mismatch.rs:11:38
+   |
+LL | impl<K> ContainsKey<K> for KeyHolder<K> {}
+   |      -                               ^
+   |      |
+   |      help: consider changing this type parameter to a const parameter: `const K: u8`
+
+error[E0747]: type provided when a constant was expected
+  --> $DIR/kind_mismatch.rs:11:21
+   |
+LL | impl<K> ContainsKey<K> for KeyHolder<K> {}
+   |      -              ^
+   |      |
+   |      help: consider changing this type parameter to a const parameter: `const K: u8`
+
+error[E0277]: the trait bound `KeyHolder<0>: SubsetExcept<_>` is not satisfied
+  --> $DIR/kind_mismatch.rs:22:45
+   |
+LL |     let map: KeyHolder<0> = remove_key::<_, _>();
+   |                                             ^ the trait `ContainsKey<0>` is not implemented for `KeyHolder<0>`, which is required by `KeyHolder<0>: SubsetExcept<_>`
+   |
+note: required for `KeyHolder<0>` to implement `SubsetExcept<_>`
+  --> $DIR/kind_mismatch.rs:15:28
+   |
+LL | impl<P, T: ContainsKey<0>> SubsetExcept<P> for T {}
+   |            --------------  ^^^^^^^^^^^^^^^     ^
+   |            |
+   |            unsatisfied trait bound introduced here
+note: required by a bound in `remove_key`
+  --> $DIR/kind_mismatch.rs:17:25
+   |
+LL | pub fn remove_key<K, S: SubsetExcept<K>>() -> S {
+   |                         ^^^^^^^^^^^^^^^ required by this bound in `remove_key`
+
+error: aborting due to 3 previous errors
+
+Some errors have detailed explanations: E0277, E0747.
+For more information about an error, try `rustc --explain E0277`.