Change:
<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. trait Qux {} struct A; struct B; impl Qux for A {} impl Qux for B {} struct Foo<T, U: Qux = A, V: Qux = B>(T, U, V); struct foo; struct bar; fn want<T>(t: T) {} fn have_usize(f: usize) { want::<foo>(f); //~ ERROR mismatched types want::<bar>(f); //~ ERROR mismatched types want::<Foo<usize>>(f); //~ ERROR mismatched types want::<Foo<usize, B>>(f); //~ ERROR mismatched types want::<Foo<foo>>(f); //~ ERROR mismatched types want::<Foo<foo, B>>(f); //~ ERROR mismatched types want::<Foo<bar>>(f); //~ ERROR mismatched types want::<Foo<bar, B>>(f); //~ ERROR mismatched types } fn have_foo(f: foo) { want::<usize>(f); //~ ERROR mismatched types want::<bar>(f); //~ ERROR mismatched types want::<Foo<usize>>(f); //~ ERROR mismatched types want::<Foo<usize, B>>(f); //~ ERROR mismatched types want::<Foo<foo>>(f); //~ ERROR mismatched types want::<Foo<foo, B>>(f); //~ ERROR mismatched types want::<Foo<bar>>(f); //~ ERROR mismatched types want::<Foo<bar, B>>(f); //~ ERROR mismatched types } fn have_foo_foo(f: Foo<foo>) { want::<usize>(f); //~ ERROR mismatched types want::<foo>(f); //~ ERROR mismatched types want::<bar>(f); //~ ERROR mismatched types want::<Foo<usize>>(f); //~ ERROR mismatched types want::<Foo<usize, B>>(f); //~ ERROR mismatched types want::<Foo<foo, B>>(f); //~ ERROR mismatched types want::<Foo<bar>>(f); //~ ERROR mismatched types want::<Foo<bar, B>>(f); //~ ERROR mismatched types want::<&Foo<foo>>(f); //~ ERROR mismatched types want::<&Foo<foo, B>>(f); //~ ERROR mismatched types } fn have_foo_foo_b(f: Foo<foo, B>) { want::<usize>(f); //~ ERROR mismatched types want::<foo>(f); //~ ERROR mismatched types want::<bar>(f); //~ ERROR mismatched types want::<Foo<usize>>(f); //~ ERROR mismatched types want::<Foo<usize, B>>(f); //~ ERROR mismatched types want::<Foo<foo>>(f); //~ ERROR mismatched types want::<Foo<bar>>(f); //~ ERROR mismatched types want::<Foo<bar, B>>(f); //~ ERROR mismatched types want::<&Foo<foo>>(f); //~ ERROR mismatched types want::<&Foo<foo, B>>(f); //~ ERROR mismatched types } fn have_foo_foo_b_a(f: Foo<foo, B, A>) { want::<usize>(f); //~ ERROR mismatched types want::<foo>(f); //~ ERROR mismatched types want::<bar>(f); //~ ERROR mismatched types want::<Foo<usize>>(f); //~ ERROR mismatched types want::<Foo<usize, B>>(f); //~ ERROR mismatched types want::<Foo<foo>>(f); //~ ERROR mismatched types want::<Foo<foo, B>>(f); //~ ERROR mismatched types want::<Foo<bar>>(f); //~ ERROR mismatched types want::<Foo<bar, B>>(f); //~ ERROR mismatched types want::<&Foo<foo>>(f); //~ ERROR mismatched types want::<&Foo<foo, B>>(f); //~ ERROR mismatched types } fn main() {} </ins>

Discussion:
In , adding an parameter to the type, that defaults to induces changes to UI tests that are indicative of something that seemed to need improvement in the compiler, namely that when you have a type , errors should present instead of when they can. It turns out, the compiler does. But not consistently. The following is derived from : () This yields the following errors: See how it prints instead of the (imho) desired , but , not .
This all stems from the fact that in some cases, types are just printed out by formatting the instances, while in other cases, there is manual machinery to highlight parts of the type that handle things, and that doesn't have the default-param elimination that has.