Skip to content

Commit cbf5d39

Browse files
committed
Auto merge of rust-lang#44888 - tirr-c:binder-hr-region, r=arielb1
Refactor fmt::Display and fmt::Debug impls in ppaux Also fixes rust-lang#44887. There was a problem that unnamed late-bound regions are *always* named `'r` while they are displayed using `std::fmt::Display`. --- ```rust fn main() { f(|_: (), _: ()| {}); } fn f<F>(_: F) where F: Fn(&(), for<'r> fn(&'r ())) {} ``` Before (incorrectly shadows lifetime, `for<'r>` omitted for the second argument): ``` error[E0631]: type mismatch in closure arguments --> test.rs:2:5 | 2 | f(|_: (), _: ()| {}); | ^ ----------------- found signature of `fn((), ()) -> _` | | | expected signature of `for<'r> fn(&'r (), fn(&'r ())) -> _` | = note: required by `f` ``` After: ``` error[E0631]: type mismatch in closure arguments --> test.rs:2:5 | 2 | f(|_: (), _: ()| {}); | ^ ----------------- found signature of `fn((), ()) -> _` | | | expected signature of `for<'s> fn(&'s (), for<'r> fn(&'r ())) -> _` | = note: required by `f` ``` r? @nikomatsakis
2 parents c0d40a1 + 84cb90f commit cbf5d39

13 files changed

+1180
-807
lines changed

src/librustc/util/ppaux.rs

+989-768
Large diffs are not rendered by default.

src/test/compile-fail/hygiene/impl_items.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ mod foo {
1919
}
2020

2121
pub macro m() {
22-
let _: () = S.f(); //~ ERROR type `fn(&foo::S) {foo::S::f}` is private
22+
let _: () = S.f(); //~ ERROR type `for<'r> fn(&'r foo::S) {foo::S::f}` is private
2323
}
2424
}
2525

src/test/compile-fail/issue-12997-2.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@
1515
#[bench]
1616
fn bar(x: isize) { }
1717
//~^ ERROR mismatched types
18-
//~| expected type `fn(&mut __test::test::Bencher)`
18+
//~| expected type `for<'r> fn(&'r mut __test::test::Bencher)`
1919
//~| found type `fn(isize) {bar}`
2020
//~| expected mutable reference, found isize

src/test/compile-fail/private-inferred-type-3.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
// error-pattern:type `fn() {<u8 as ext::PrivTrait>::method}` is private
1616
// error-pattern:type `fn(u8) -> ext::PrivTupleStruct {ext::PrivTupleStruct::{{constructor}}}` is pr
1717
// error-pattern:type `fn(u8) -> ext::PubTupleStruct {ext::PubTupleStruct::{{constructor}}}` is priv
18-
// error-pattern:type `fn(&ext::Pub<u8>) {<ext::Pub<u8>>::priv_method}` is private
18+
// error-pattern:type `for<'r> fn(&'r ext::Pub<u8>) {<ext::Pub<u8>>::priv_method}` is private
1919

2020
#![feature(decl_macro)]
2121

src/test/compile-fail/private-inferred-type.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ mod m {
5656
PubTupleStruct;
5757
//~^ ERROR type `fn(u8) -> m::PubTupleStruct {m::PubTupleStruct::{{constructor}}}` is privat
5858
Pub(0u8).priv_method();
59-
//~^ ERROR type `fn(&m::Pub<u8>) {<m::Pub<u8>>::priv_method}` is private
59+
//~^ ERROR type `for<'r> fn(&'r m::Pub<u8>) {<m::Pub<u8>>::priv_method}` is private
6060
}
6161

6262
trait Trait {}

src/test/compile-fail/regions-fn-subtyping-return-static.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ fn supply_G() {
5858
want_G(bar);
5959
want_G(baz);
6060
//~^ ERROR mismatched types
61-
//~| expected type `fn(&'cx S) -> &'static S`
62-
//~| found type `fn(&S) -> &S {baz}`
61+
//~| expected type `for<'cx> fn(&'cx S) -> &'static S`
62+
//~| found type `for<'r> fn(&'r S) -> &'r S {baz}`
6363
//~| expected concrete lifetime, found bound lifetime parameter 'cx
6464
}
6565

src/test/mir-opt/validate_1.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ fn main() {
5757
// START rustc.node50.EraseRegions.after.mir
5858
// fn main::{{closure}}(_1: &ReErased [closure@NodeId(50)], _2: &ReErased mut i32) -> i32 {
5959
// bb0: {
60-
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:11) => validate_1[8cd8]::main[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(50)], _2: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:11) => validate_1[8cd8]::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
60+
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:11) => validate_1[8cd8]::main[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(50)], _2: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:11) => validate_1[8cd8]::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
6161
// StorageLive(_3);
6262
// _3 = _2;
6363
// StorageLive(_4);

src/test/mir-opt/validate_4.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ fn main() {
4848
// START rustc.node22.EraseRegions.after.mir
4949
// fn write_42::{{closure}}(_1: &ReErased [closure@NodeId(22)], _2: *mut i32) -> () {
5050
// bb0: {
51-
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:9) => validate_4[8cd8]::write_42[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(22)], _2: *mut i32]);
52-
// Validate(Release, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:9) => validate_4[8cd8]::write_42[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(22)], _2: *mut i32]);
51+
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:9) => validate_4[8cd8]::write_42[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(22)], _2: *mut i32]);
52+
// Validate(Release, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:9) => validate_4[8cd8]::write_42[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(22)], _2: *mut i32]);
5353
// StorageLive(_3);
5454
// _3 = _2;
5555
// (*_3) = const 23i32;
@@ -74,8 +74,8 @@ fn main() {
7474
// START rustc.node60.EraseRegions.after.mir
7575
// fn main::{{closure}}(_1: &ReErased [closure@NodeId(60)], _2: &ReErased mut i32) -> bool {
7676
// bb0: {
77-
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[8cd8]::main[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(60)], _2: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[8cd8]::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
78-
// Validate(Release, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[8cd8]::main[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(60)], _2: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[8cd8]::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
77+
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[8cd8]::main[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(60)], _2: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[8cd8]::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
78+
// Validate(Release, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[8cd8]::main[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(60)], _2: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[8cd8]::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
7979
// StorageLive(_3);
8080
// _0 = const write_42(_4) -> bb1;
8181
// }

src/test/mir-opt/validate_5.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ fn main() {
4545
// START rustc.node46.EraseRegions.after.mir
4646
// fn main::{{closure}}(_1: &ReErased [closure@NodeId(46)], _2: &ReErased mut i32) -> bool {
4747
// bb0: {
48-
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:9) => validate_5[8cd8]::main[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(46)], _2: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:9) => validate_5[8cd8]::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
48+
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:9) => validate_5[8cd8]::main[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(46)], _2: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:9) => validate_5[8cd8]::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
4949
// StorageLive(_3);
5050
// _3 = _2;
5151
// StorageLive(_4);

src/test/pretty/issue-4264.pp

+25-25
Original file line numberDiff line numberDiff line change
@@ -40,31 +40,31 @@
4040

4141

4242
((::fmt::format as
43-
fn(std::fmt::Arguments<'_>) -> std::string::String {std::fmt::format})(((<::std::fmt::Arguments>::new_v1
44-
as
45-
fn(&[&str], &[std::fmt::ArgumentV1<'_>]) -> std::fmt::Arguments<'_> {std::fmt::Arguments<'_>::new_v1})((&([("test"
46-
as
47-
&'static str)]
48-
as
49-
[&str; 1])
50-
as
51-
&[&str; 1]),
52-
(&(match (()
53-
as
54-
())
55-
{
56-
()
57-
=>
58-
([]
59-
as
60-
[std::fmt::ArgumentV1<'_>; 0]),
61-
}
62-
as
63-
[std::fmt::ArgumentV1<'_>; 0])
64-
as
65-
&[std::fmt::ArgumentV1<'_>; 0]))
66-
as
67-
std::fmt::Arguments<'_>))
43+
for<'r> fn(std::fmt::Arguments<'r>) -> std::string::String {std::fmt::format})(((<::std::fmt::Arguments>::new_v1
44+
as
45+
fn(&[&str], &[std::fmt::ArgumentV1<'_>]) -> std::fmt::Arguments<'_> {std::fmt::Arguments<'_>::new_v1})((&([("test"
46+
as
47+
&'static str)]
48+
as
49+
[&str; 1])
50+
as
51+
&[&str; 1]),
52+
(&(match (()
53+
as
54+
())
55+
{
56+
()
57+
=>
58+
([]
59+
as
60+
[std::fmt::ArgumentV1<'_>; 0]),
61+
}
62+
as
63+
[std::fmt::ArgumentV1<'_>; 0])
64+
as
65+
&[std::fmt::ArgumentV1<'_>; 0]))
66+
as
67+
std::fmt::Arguments<'_>))
6868
as std::string::String);
6969
} as ())
7070
pub type Foo = [i32; (3 as usize)];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
fn main() {
12+
f1(|_: (), _: ()| {});
13+
f2(|_: (), _: ()| {});
14+
f3(|_: (), _: ()| {});
15+
f4(|_: (), _: ()| {});
16+
f5(|_: (), _: ()| {});
17+
g1(|_: (), _: ()| {});
18+
g2(|_: (), _: ()| {});
19+
g3(|_: (), _: ()| {});
20+
g4(|_: (), _: ()| {});
21+
h1(|_: (), _: (), _: (), _: ()| {});
22+
h2(|_: (), _: (), _: (), _: ()| {});
23+
}
24+
25+
// Basic
26+
fn f1<F>(_: F) where F: Fn(&(), &()) {}
27+
fn f2<F>(_: F) where F: for<'a> Fn(&'a (), &()) {}
28+
fn f3<'a, F>(_: F) where F: Fn(&'a (), &()) {}
29+
fn f4<F>(_: F) where F: for<'r> Fn(&(), &'r ()) {}
30+
fn f5<F>(_: F) where F: for<'r> Fn(&'r (), &'r ()) {}
31+
32+
// Nested
33+
fn g1<F>(_: F) where F: Fn(&(), Box<Fn(&())>) {}
34+
fn g2<F>(_: F) where F: Fn(&(), fn(&())) {}
35+
fn g3<F>(_: F) where F: for<'s> Fn(&'s (), Box<Fn(&())>) {}
36+
fn g4<F>(_: F) where F: Fn(&(), for<'r> fn(&'r ())) {}
37+
38+
// Mixed
39+
fn h1<F>(_: F) where F: Fn(&(), Box<Fn(&())>, &(), fn(&(), &())) {}
40+
fn h2<F>(_: F) where F: for<'t0> Fn(&(), Box<Fn(&())>, &'t0 (), fn(&(), &())) {}

0 commit comments

Comments
 (0)