Change:
After , when a trait bound fails and the trait was implemented by fixed-size arrays, the compiler will display an error like: Which is pretty unhelpful. A solution would be to evaluate these and/or to show evaluated bounds preferably.
I can't reproduce triggering an error with these messages, do you have an example? I need it for a regression test, the fix was indeed as simple
It only appears if you explicitly disambiguate the trait, like . .
are you displaying these as ? I feel that'd be a reasonable output for this.
that would be a better fallback than , but I'm currently trying to get at the actual value (though that triggers cycle errors atm when building libcore's array impls ^^)
That's better in some ways, but kinda implies that

Discussion:
} else { 4 }; <ins> let normalize = |candidate| self.tcx.global_tcx().infer_ctxt().enter(|ref infcx| { let normalized = infcx .at(&ObligationCause::dummy(), ty::ParamEnv::empty()) .normalize(candidate) .ok(); match normalized { Some(normalized) => format!("n  {:?}", normalized.value), None => format!("n  {:?}", candidate), } }); </ins> err.help(&format!("the following implementations were found:{}{}", <del> &impl_candidates[0..end].iter().map(|candidate| { format!("n  {:?}", candidate) }).collect::<String>(), </del> <ins> &impl_candidates[0..end].iter().map(normalize).collect::<String>(), </ins> if impl_candidates.len() > 5 { format!("nand {} others", impl_candidates.len() - 4) } else {

pub struct Const<'tcx> { pub ty: Ty<'tcx>, <del> // FIXME(eddyb) Replace this with a miri value. </del> pub val: ConstVal<'tcx>, }

ConstVal::Value(Value::ByVal(PrimVal::Bytes(sz))) => { write!(f, "{}", sz)?; } <del> ConstVal::Unevaluated(_def_id, substs) => { write!(f, "<unevaluated{:?}>", &substs[..])?; </del> <ins> ConstVal::Unevaluated(_def_id, _substs) => { write!(f, "_")?; </ins> } _ => { write!(f, "{:?}", sz)?;

LL | type A = [u8; 4]::AssocTy; |          ^^^^^^^^^^^^^^^^ ambiguous associated type | <del> = note: specify the type using the syntax `<[u8; <unevaluated[]>] as Trait>::AssocTy` </del> <ins> = note: specify the type using the syntax `<[u8; _] as Trait>::AssocTy` </ins> error[E0223]: ambiguous associated type --> $DIR/bad-assoc-ty.rs:15:10

<ins> // Copyright 2018 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your // option. This file may not be copied, modified, or distributed // except according to those terms. // https://github.com/rust-lang/rust/issues/49208 trait Foo { fn foo(); } impl Foo for [(); 1] { fn foo() {} } fn main() { <[(); 0] as Foo>::foo() //~ ERROR E0277 } </ins>

<ins> error[E0277]: the trait bound `[(); 0]: Foo` is not satisfied --> $DIR/unevaluated_fixed_size_array_len.rs:22:5 | LL |     <[(); 0] as Foo>::foo() //~ ERROR E0277 |     ^^^^^^^^^^^^^^^^^^^^^ the trait `Foo` is not implemented for `[(); 0]` | = help: the following implementations were found: <[(); 1] as Foo> note: required by `Foo::foo` --> $DIR/unevaluated_fixed_size_array_len.rs:14:5 | LL |     fn foo(); |     ^^^^^^^^^ error: aborting due to previous error For more information about this error, try `rustc --explain E0277`. </ins>