diff options
| author | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2018-12-09 17:54:18 +0200 |
|---|---|---|
| committer | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2019-03-15 09:26:13 +0200 |
| commit | 1c2a3c5d79b9c6ee2ab4257eda41f1a86b273ef5 (patch) | |
| tree | bf4a57b5ae800b500690af89bf27d424c47581dd | |
| parent | fbbc7e915d362d6e0705197c884fce23246acd1d (diff) | |
| download | rust-1c2a3c5d79b9c6ee2ab4257eda41f1a86b273ef5.tar.gz rust-1c2a3c5d79b9c6ee2ab4257eda41f1a86b273ef5.zip | |
rustc: support impl's in PrintCx::parameterized.
| -rw-r--r-- | src/librustc/util/ppaux.rs | 16 | ||||
| -rw-r--r-- | src/test/ui/hygiene/impl_items.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/hygiene/impl_items.stderr | 2 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-22638.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-22638.stderr | 2 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-24322.stderr | 2 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-29124.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-29124.stderr | 2 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-39559-2.stderr | 4 | ||||
| -rw-r--r-- | src/test/ui/privacy/associated-item-privacy-inherent.rs | 6 | ||||
| -rw-r--r-- | src/test/ui/privacy/associated-item-privacy-inherent.stderr | 6 | ||||
| -rw-r--r-- | src/test/ui/qualified/qualified-path-params.stderr | 2 |
12 files changed, 32 insertions, 16 deletions
diff --git a/src/librustc/util/ppaux.rs b/src/librustc/util/ppaux.rs index 8dfa924c1df..6667d378733 100644 --- a/src/librustc/util/ppaux.rs +++ b/src/librustc/util/ppaux.rs @@ -352,6 +352,22 @@ impl PrintCx<'a, 'gcx, 'tcx> { write!(f, "::{}", key.disambiguated_data.data.as_interned_str())?; } else { + // Try to print `impl`s more like how you'd refer to their associated items. + if let DefPathData::Impl = key.disambiguated_data.data { + if let Some(trait_ref) = self.tcx.impl_trait_ref(def_id) { + // HACK(eddyb) this is in lieu of more specific disambiguation. + print!(f, self, write("{}", self.tcx.item_path_str(def_id)))?; + + let trait_ref = trait_ref.subst(self.tcx, substs); + print!(f, self, print_debug(trait_ref))?; + } else { + let self_ty = self.tcx.type_of(def_id).subst(self.tcx, substs); + // FIXME(eddyb) omit the <> where possible. + print!(f, self, write("<"), print(self_ty), write(">"))?; + } + return Ok(()); + } + print!(f, self, write("{}", self.tcx.item_path_str(def_id)))?; } diff --git a/src/test/ui/hygiene/impl_items.rs b/src/test/ui/hygiene/impl_items.rs index 37794c6e077..d628573d517 100644 --- a/src/test/ui/hygiene/impl_items.rs +++ b/src/test/ui/hygiene/impl_items.rs @@ -9,7 +9,7 @@ mod foo { } pub macro m() { - let _: () = S.f(); //~ ERROR type `for<'r> fn(&'r foo::S) {foo::S::f}` is private + let _: () = S.f(); //~ ERROR type `for<'r> fn(&'r foo::S) {<foo::S>::f}` is private } } diff --git a/src/test/ui/hygiene/impl_items.stderr b/src/test/ui/hygiene/impl_items.stderr index 418c2c73ba1..0a273bc98ff 100644 --- a/src/test/ui/hygiene/impl_items.stderr +++ b/src/test/ui/hygiene/impl_items.stderr @@ -1,4 +1,4 @@ -error: type `for<'r> fn(&'r foo::S) {foo::S::f}` is private +error: type `for<'r> fn(&'r foo::S) {<foo::S>::f}` is private --> $DIR/impl_items.rs:12:23 | LL | let _: () = S.f(); diff --git a/src/test/ui/issues/issue-22638.rs b/src/test/ui/issues/issue-22638.rs index fab24404eba..ff58c7aaced 100644 --- a/src/test/ui/issues/issue-22638.rs +++ b/src/test/ui/issues/issue-22638.rs @@ -50,7 +50,7 @@ struct D (Box<A>); impl D { pub fn matches<F: Fn()>(&self, f: &F) { - //~^ ERROR reached the type-length limit while instantiating `D::matches::<[closure + //~^ ERROR reached the type-length limit while instantiating `<D>::matches::<[closure let &D(ref a) = self; a.matches(f) } diff --git a/src/test/ui/issues/issue-22638.stderr b/src/test/ui/issues/issue-22638.stderr index aff968f3618..65483abe5c7 100644 --- a/src/test/ui/issues/issue-22638.stderr +++ b/src/test/ui/issues/issue-22638.stderr @@ -1,4 +1,4 @@ -error: reached the type-length limit while instantiating `D::matches::$CLOSURE` +error: reached the type-length limit while instantiating `<D>::matches::$CLOSURE` --> $DIR/issue-22638.rs:52:5 | LL | / pub fn matches<F: Fn()>(&self, f: &F) { diff --git a/src/test/ui/issues/issue-24322.stderr b/src/test/ui/issues/issue-24322.stderr index def373cf2c0..b284c8cf117 100644 --- a/src/test/ui/issues/issue-24322.stderr +++ b/src/test/ui/issues/issue-24322.stderr @@ -5,7 +5,7 @@ LL | let x: &fn(&B) -> u32 = &B::func; | ^^^^^^^^ expected fn pointer, found fn item | = note: expected type `&for<'r> fn(&'r B) -> u32` - found type `&for<'r> fn(&'r B) -> u32 {B::func}` + found type `&for<'r> fn(&'r B) -> u32 {<B>::func}` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-29124.rs b/src/test/ui/issues/issue-29124.rs index 1cd3f84f7a2..8062045a6c0 100644 --- a/src/test/ui/issues/issue-29124.rs +++ b/src/test/ui/issues/issue-29124.rs @@ -13,7 +13,7 @@ fn func() -> Ret { fn main() { Obj::func.x(); - //~^ ERROR no method named `x` found for type `fn() -> Ret {Obj::func}` in the current scope + //~^ ERROR no method named `x` found for type `fn() -> Ret {<Obj>::func}` in the current scope func.x(); //~^ ERROR no method named `x` found for type `fn() -> Ret {func}` in the current scope } diff --git a/src/test/ui/issues/issue-29124.stderr b/src/test/ui/issues/issue-29124.stderr index 3beb7289788..67f188e0588 100644 --- a/src/test/ui/issues/issue-29124.stderr +++ b/src/test/ui/issues/issue-29124.stderr @@ -1,4 +1,4 @@ -error[E0599]: no method named `x` found for type `fn() -> Ret {Obj::func}` in the current scope +error[E0599]: no method named `x` found for type `fn() -> Ret {<Obj>::func}` in the current scope --> $DIR/issue-29124.rs:15:15 | LL | Obj::func.x(); diff --git a/src/test/ui/issues/issue-39559-2.stderr b/src/test/ui/issues/issue-39559-2.stderr index 700dbe36474..ca2f2a5ba28 100644 --- a/src/test/ui/issues/issue-39559-2.stderr +++ b/src/test/ui/issues/issue-39559-2.stderr @@ -8,7 +8,7 @@ error[E0080]: evaluation of constant value failed --> $DIR/issue-39559-2.rs:14:24 | LL | let array: [usize; Dim3::dim()] - | ^^^^^^^^^^^ calling non-const function `<Dim3 as Dim>::dim` + | ^^^^^^^^^^^ calling non-const function `<Dim3 as Dim><Dim3 as Dim>::dim` error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants --> $DIR/issue-39559-2.rs:17:15 @@ -20,7 +20,7 @@ error[E0080]: evaluation of constant value failed --> $DIR/issue-39559-2.rs:17:15 | LL | = [0; Dim3::dim()]; - | ^^^^^^^^^^^ calling non-const function `<Dim3 as Dim>::dim` + | ^^^^^^^^^^^ calling non-const function `<Dim3 as Dim><Dim3 as Dim>::dim` error: aborting due to 4 previous errors diff --git a/src/test/ui/privacy/associated-item-privacy-inherent.rs b/src/test/ui/privacy/associated-item-privacy-inherent.rs index c3ae920238f..b6fd22fa669 100644 --- a/src/test/ui/privacy/associated-item-privacy-inherent.rs +++ b/src/test/ui/privacy/associated-item-privacy-inherent.rs @@ -11,11 +11,11 @@ mod priv_nominal { pub macro mac() { let value = Pub::method; - //~^ ERROR type `for<'r> fn(&'r priv_nominal::Pub) {priv_nominal::Pub::method}` is private + //~^ ERROR type `for<'r> fn(&'r priv_nominal::Pub) {<priv_nominal::Pub>::method}` is private value; - //~^ ERROR type `for<'r> fn(&'r priv_nominal::Pub) {priv_nominal::Pub::method}` is private + //~^ ERROR type `for<'r> fn(&'r priv_nominal::Pub) {<priv_nominal::Pub>::method}` is private Pub.method(); - //~^ ERROR type `for<'r> fn(&'r priv_nominal::Pub) {priv_nominal::Pub::method}` is private + //~^ ERROR type `for<'r> fn(&'r priv_nominal::Pub) {<priv_nominal::Pub>::method}` is private Pub::CONST; //~^ ERROR associated constant `CONST` is private // let _: Pub::AssocTy; diff --git a/src/test/ui/privacy/associated-item-privacy-inherent.stderr b/src/test/ui/privacy/associated-item-privacy-inherent.stderr index 6471a7914e1..69be9d2cea6 100644 --- a/src/test/ui/privacy/associated-item-privacy-inherent.stderr +++ b/src/test/ui/privacy/associated-item-privacy-inherent.stderr @@ -1,4 +1,4 @@ -error: type `for<'r> fn(&'r priv_nominal::Pub) {priv_nominal::Pub::method}` is private +error: type `for<'r> fn(&'r priv_nominal::Pub) {<priv_nominal::Pub>::method}` is private --> $DIR/associated-item-privacy-inherent.rs:13:21 | LL | let value = Pub::method; @@ -7,7 +7,7 @@ LL | let value = Pub::method; LL | priv_nominal::mac!(); | --------------------- in this macro invocation -error: type `for<'r> fn(&'r priv_nominal::Pub) {priv_nominal::Pub::method}` is private +error: type `for<'r> fn(&'r priv_nominal::Pub) {<priv_nominal::Pub>::method}` is private --> $DIR/associated-item-privacy-inherent.rs:15:9 | LL | value; @@ -16,7 +16,7 @@ LL | value; LL | priv_nominal::mac!(); | --------------------- in this macro invocation -error: type `for<'r> fn(&'r priv_nominal::Pub) {priv_nominal::Pub::method}` is private +error: type `for<'r> fn(&'r priv_nominal::Pub) {<priv_nominal::Pub>::method}` is private --> $DIR/associated-item-privacy-inherent.rs:17:13 | LL | Pub.method(); diff --git a/src/test/ui/qualified/qualified-path-params.stderr b/src/test/ui/qualified/qualified-path-params.stderr index 926b098040f..6315ec2e512 100644 --- a/src/test/ui/qualified/qualified-path-params.stderr +++ b/src/test/ui/qualified/qualified-path-params.stderr @@ -11,7 +11,7 @@ LL | 0 ..= <S as Tr>::A::f::<u8> => {} | ^^^^^^^^^^^^^^^^^^^^^ ranges require char or numeric types | = note: start type: {integer} - = note: end type: fn() {S::f::<u8>} + = note: end type: fn() {<S>::f::<u8>} error: aborting due to 2 previous errors |
