Auto merge of #44888 - tirr-c:binder-hr-region, r=arielb1
Refactor fmt::Display and fmt::Debug impls in ppaux Also fixes #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
This commit is contained in:
commit
cbf5d39cca
13 changed files with 1290 additions and 917 deletions
File diff suppressed because it is too large
Load diff
|
|
@ -19,7 +19,7 @@ mod foo {
|
|||
}
|
||||
|
||||
pub macro m() {
|
||||
let _: () = S.f(); //~ ERROR type `fn(&foo::S) {foo::S::f}` is private
|
||||
let _: () = S.f(); //~ ERROR type `for<'r> fn(&'r foo::S) {foo::S::f}` is private
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,6 +15,6 @@
|
|||
#[bench]
|
||||
fn bar(x: isize) { }
|
||||
//~^ ERROR mismatched types
|
||||
//~| expected type `fn(&mut __test::test::Bencher)`
|
||||
//~| expected type `for<'r> fn(&'r mut __test::test::Bencher)`
|
||||
//~| found type `fn(isize) {bar}`
|
||||
//~| expected mutable reference, found isize
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
// error-pattern:type `fn() {<u8 as ext::PrivTrait>::method}` is private
|
||||
// error-pattern:type `fn(u8) -> ext::PrivTupleStruct {ext::PrivTupleStruct::{{constructor}}}` is pr
|
||||
// error-pattern:type `fn(u8) -> ext::PubTupleStruct {ext::PubTupleStruct::{{constructor}}}` is priv
|
||||
// error-pattern:type `fn(&ext::Pub<u8>) {<ext::Pub<u8>>::priv_method}` is private
|
||||
// error-pattern:type `for<'r> fn(&'r ext::Pub<u8>) {<ext::Pub<u8>>::priv_method}` is private
|
||||
|
||||
#![feature(decl_macro)]
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ mod m {
|
|||
PubTupleStruct;
|
||||
//~^ ERROR type `fn(u8) -> m::PubTupleStruct {m::PubTupleStruct::{{constructor}}}` is privat
|
||||
Pub(0u8).priv_method();
|
||||
//~^ ERROR type `fn(&m::Pub<u8>) {<m::Pub<u8>>::priv_method}` is private
|
||||
//~^ ERROR type `for<'r> fn(&'r m::Pub<u8>) {<m::Pub<u8>>::priv_method}` is private
|
||||
}
|
||||
|
||||
trait Trait {}
|
||||
|
|
|
|||
|
|
@ -58,8 +58,8 @@ fn supply_G() {
|
|||
want_G(bar);
|
||||
want_G(baz);
|
||||
//~^ ERROR mismatched types
|
||||
//~| expected type `fn(&'cx S) -> &'static S`
|
||||
//~| found type `fn(&S) -> &S {baz}`
|
||||
//~| expected type `for<'cx> fn(&'cx S) -> &'static S`
|
||||
//~| found type `for<'r> fn(&'r S) -> &'r S {baz}`
|
||||
//~| expected concrete lifetime, found bound lifetime parameter 'cx
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ fn main() {
|
|||
// START rustc.node50.EraseRegions.after.mir
|
||||
// fn main::{{closure}}(_1: &ReErased [closure@NodeId(50)], _2: &ReErased mut i32) -> i32 {
|
||||
// bb0: {
|
||||
// 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]);
|
||||
// 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]);
|
||||
// StorageLive(_3);
|
||||
// _3 = _2;
|
||||
// StorageLive(_4);
|
||||
|
|
|
|||
|
|
@ -48,8 +48,8 @@ fn main() {
|
|||
// START rustc.node22.EraseRegions.after.mir
|
||||
// fn write_42::{{closure}}(_1: &ReErased [closure@NodeId(22)], _2: *mut i32) -> () {
|
||||
// bb0: {
|
||||
// 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]);
|
||||
// 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]);
|
||||
// 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]);
|
||||
// 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]);
|
||||
// StorageLive(_3);
|
||||
// _3 = _2;
|
||||
// (*_3) = const 23i32;
|
||||
|
|
@ -74,8 +74,8 @@ fn main() {
|
|||
// START rustc.node60.EraseRegions.after.mir
|
||||
// fn main::{{closure}}(_1: &ReErased [closure@NodeId(60)], _2: &ReErased mut i32) -> bool {
|
||||
// bb0: {
|
||||
// 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]);
|
||||
// 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]);
|
||||
// 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]);
|
||||
// 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]);
|
||||
// StorageLive(_3);
|
||||
// _0 = const write_42(_4) -> bb1;
|
||||
// }
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ fn main() {
|
|||
// START rustc.node46.EraseRegions.after.mir
|
||||
// fn main::{{closure}}(_1: &ReErased [closure@NodeId(46)], _2: &ReErased mut i32) -> bool {
|
||||
// bb0: {
|
||||
// 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]);
|
||||
// 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]);
|
||||
// StorageLive(_3);
|
||||
// _3 = _2;
|
||||
// StorageLive(_4);
|
||||
|
|
|
|||
|
|
@ -40,31 +40,31 @@ pub fn bar() ({
|
|||
|
||||
|
||||
((::fmt::format as
|
||||
fn(std::fmt::Arguments<'_>) -> std::string::String {std::fmt::format})(((<::std::fmt::Arguments>::new_v1
|
||||
as
|
||||
fn(&[&str], &[std::fmt::ArgumentV1<'_>]) -> std::fmt::Arguments<'_> {std::fmt::Arguments<'_>::new_v1})((&([("test"
|
||||
as
|
||||
&'static str)]
|
||||
as
|
||||
[&str; 1])
|
||||
as
|
||||
&[&str; 1]),
|
||||
(&(match (()
|
||||
as
|
||||
())
|
||||
{
|
||||
()
|
||||
=>
|
||||
([]
|
||||
as
|
||||
[std::fmt::ArgumentV1<'_>; 0]),
|
||||
}
|
||||
as
|
||||
[std::fmt::ArgumentV1<'_>; 0])
|
||||
as
|
||||
&[std::fmt::ArgumentV1<'_>; 0]))
|
||||
as
|
||||
std::fmt::Arguments<'_>))
|
||||
for<'r> fn(std::fmt::Arguments<'r>) -> std::string::String {std::fmt::format})(((<::std::fmt::Arguments>::new_v1
|
||||
as
|
||||
fn(&[&str], &[std::fmt::ArgumentV1<'_>]) -> std::fmt::Arguments<'_> {std::fmt::Arguments<'_>::new_v1})((&([("test"
|
||||
as
|
||||
&'static str)]
|
||||
as
|
||||
[&str; 1])
|
||||
as
|
||||
&[&str; 1]),
|
||||
(&(match (()
|
||||
as
|
||||
())
|
||||
{
|
||||
()
|
||||
=>
|
||||
([]
|
||||
as
|
||||
[std::fmt::ArgumentV1<'_>; 0]),
|
||||
}
|
||||
as
|
||||
[std::fmt::ArgumentV1<'_>; 0])
|
||||
as
|
||||
&[std::fmt::ArgumentV1<'_>; 0]))
|
||||
as
|
||||
std::fmt::Arguments<'_>))
|
||||
as std::string::String);
|
||||
} as ())
|
||||
pub type Foo = [i32; (3 as usize)];
|
||||
|
|
|
|||
40
src/test/ui/anonymous-higher-ranked-lifetime.rs
Normal file
40
src/test/ui/anonymous-higher-ranked-lifetime.rs
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
// Copyright 2015 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.
|
||||
|
||||
fn main() {
|
||||
f1(|_: (), _: ()| {});
|
||||
f2(|_: (), _: ()| {});
|
||||
f3(|_: (), _: ()| {});
|
||||
f4(|_: (), _: ()| {});
|
||||
f5(|_: (), _: ()| {});
|
||||
g1(|_: (), _: ()| {});
|
||||
g2(|_: (), _: ()| {});
|
||||
g3(|_: (), _: ()| {});
|
||||
g4(|_: (), _: ()| {});
|
||||
h1(|_: (), _: (), _: (), _: ()| {});
|
||||
h2(|_: (), _: (), _: (), _: ()| {});
|
||||
}
|
||||
|
||||
// Basic
|
||||
fn f1<F>(_: F) where F: Fn(&(), &()) {}
|
||||
fn f2<F>(_: F) where F: for<'a> Fn(&'a (), &()) {}
|
||||
fn f3<'a, F>(_: F) where F: Fn(&'a (), &()) {}
|
||||
fn f4<F>(_: F) where F: for<'r> Fn(&(), &'r ()) {}
|
||||
fn f5<F>(_: F) where F: for<'r> Fn(&'r (), &'r ()) {}
|
||||
|
||||
// Nested
|
||||
fn g1<F>(_: F) where F: Fn(&(), Box<Fn(&())>) {}
|
||||
fn g2<F>(_: F) where F: Fn(&(), fn(&())) {}
|
||||
fn g3<F>(_: F) where F: for<'s> Fn(&'s (), Box<Fn(&())>) {}
|
||||
fn g4<F>(_: F) where F: Fn(&(), for<'r> fn(&'r ())) {}
|
||||
|
||||
// Mixed
|
||||
fn h1<F>(_: F) where F: Fn(&(), Box<Fn(&())>, &(), fn(&(), &())) {}
|
||||
fn h2<F>(_: F) where F: for<'t0> Fn(&(), Box<Fn(&())>, &'t0 (), fn(&(), &())) {}
|
||||
112
src/test/ui/anonymous-higher-ranked-lifetime.stderr
Normal file
112
src/test/ui/anonymous-higher-ranked-lifetime.stderr
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
error[E0631]: type mismatch in closure arguments
|
||||
--> $DIR/anonymous-higher-ranked-lifetime.rs:12:5
|
||||
|
|
||||
12 | f1(|_: (), _: ()| {});
|
||||
| ^^ ----------------- found signature of `fn((), ()) -> _`
|
||||
| |
|
||||
| expected signature of `for<'r, 's> fn(&'r (), &'s ()) -> _`
|
||||
|
|
||||
= note: required by `f1`
|
||||
|
||||
error[E0631]: type mismatch in closure arguments
|
||||
--> $DIR/anonymous-higher-ranked-lifetime.rs:13:5
|
||||
|
|
||||
13 | f2(|_: (), _: ()| {});
|
||||
| ^^ ----------------- found signature of `fn((), ()) -> _`
|
||||
| |
|
||||
| expected signature of `for<'a, 'r> fn(&'a (), &'r ()) -> _`
|
||||
|
|
||||
= note: required by `f2`
|
||||
|
||||
error[E0631]: type mismatch in closure arguments
|
||||
--> $DIR/anonymous-higher-ranked-lifetime.rs:14:5
|
||||
|
|
||||
14 | f3(|_: (), _: ()| {});
|
||||
| ^^ ----------------- found signature of `fn((), ()) -> _`
|
||||
| |
|
||||
| expected signature of `for<'r> fn(&(), &'r ()) -> _`
|
||||
|
|
||||
= note: required by `f3`
|
||||
|
||||
error[E0631]: type mismatch in closure arguments
|
||||
--> $DIR/anonymous-higher-ranked-lifetime.rs:15:5
|
||||
|
|
||||
15 | f4(|_: (), _: ()| {});
|
||||
| ^^ ----------------- found signature of `fn((), ()) -> _`
|
||||
| |
|
||||
| expected signature of `for<'s, 'r> fn(&'s (), &'r ()) -> _`
|
||||
|
|
||||
= note: required by `f4`
|
||||
|
||||
error[E0631]: type mismatch in closure arguments
|
||||
--> $DIR/anonymous-higher-ranked-lifetime.rs:16:5
|
||||
|
|
||||
16 | f5(|_: (), _: ()| {});
|
||||
| ^^ ----------------- found signature of `fn((), ()) -> _`
|
||||
| |
|
||||
| expected signature of `for<'r> fn(&'r (), &'r ()) -> _`
|
||||
|
|
||||
= note: required by `f5`
|
||||
|
||||
error[E0631]: type mismatch in closure arguments
|
||||
--> $DIR/anonymous-higher-ranked-lifetime.rs:17:5
|
||||
|
|
||||
17 | g1(|_: (), _: ()| {});
|
||||
| ^^ ----------------- found signature of `fn((), ()) -> _`
|
||||
| |
|
||||
| expected signature of `for<'r> fn(&'r (), std::boxed::Box<for<'s> std::ops::Fn(&'s ()) + 'static>) -> _`
|
||||
|
|
||||
= note: required by `g1`
|
||||
|
||||
error[E0631]: type mismatch in closure arguments
|
||||
--> $DIR/anonymous-higher-ranked-lifetime.rs:18:5
|
||||
|
|
||||
18 | g2(|_: (), _: ()| {});
|
||||
| ^^ ----------------- found signature of `fn((), ()) -> _`
|
||||
| |
|
||||
| expected signature of `for<'r> fn(&'r (), for<'s> fn(&'s ())) -> _`
|
||||
|
|
||||
= note: required by `g2`
|
||||
|
||||
error[E0631]: type mismatch in closure arguments
|
||||
--> $DIR/anonymous-higher-ranked-lifetime.rs:19:5
|
||||
|
|
||||
19 | g3(|_: (), _: ()| {});
|
||||
| ^^ ----------------- found signature of `fn((), ()) -> _`
|
||||
| |
|
||||
| expected signature of `for<'s> fn(&'s (), std::boxed::Box<for<'r> std::ops::Fn(&'r ()) + 'static>) -> _`
|
||||
|
|
||||
= note: required by `g3`
|
||||
|
||||
error[E0631]: type mismatch in closure arguments
|
||||
--> $DIR/anonymous-higher-ranked-lifetime.rs:20:5
|
||||
|
|
||||
20 | g4(|_: (), _: ()| {});
|
||||
| ^^ ----------------- found signature of `fn((), ()) -> _`
|
||||
| |
|
||||
| expected signature of `for<'s> fn(&'s (), for<'r> fn(&'r ())) -> _`
|
||||
|
|
||||
= note: required by `g4`
|
||||
|
||||
error[E0631]: type mismatch in closure arguments
|
||||
--> $DIR/anonymous-higher-ranked-lifetime.rs:21:5
|
||||
|
|
||||
21 | h1(|_: (), _: (), _: (), _: ()| {});
|
||||
| ^^ ------------------------------- found signature of `fn((), (), (), ()) -> _`
|
||||
| |
|
||||
| expected signature of `for<'r, 's> fn(&'r (), std::boxed::Box<for<'t0> std::ops::Fn(&'t0 ()) + 'static>, &'s (), for<'t0, 't1> fn(&'t0 (), &'t1 ())) -> _`
|
||||
|
|
||||
= note: required by `h1`
|
||||
|
||||
error[E0631]: type mismatch in closure arguments
|
||||
--> $DIR/anonymous-higher-ranked-lifetime.rs:22:5
|
||||
|
|
||||
22 | h2(|_: (), _: (), _: (), _: ()| {});
|
||||
| ^^ ------------------------------- found signature of `fn((), (), (), ()) -> _`
|
||||
| |
|
||||
| expected signature of `for<'r, 't0> fn(&'r (), std::boxed::Box<for<'s> std::ops::Fn(&'s ()) + 'static>, &'t0 (), for<'s, 't1> fn(&'s (), &'t1 ())) -> _`
|
||||
|
|
||||
= note: required by `h2`
|
||||
|
||||
error: aborting due to 11 previous errors
|
||||
|
||||
|
|
@ -4,8 +4,8 @@ error[E0308]: mismatched types
|
|||
51 | want_F(bar); //~ ERROR E0308
|
||||
| ^^^ expected concrete lifetime, found bound lifetime parameter 'cx
|
||||
|
|
||||
= note: expected type `fn(&'cx S) -> &'cx S`
|
||||
found type `fn(&'a S) -> &S {bar::<'_>}`
|
||||
= note: expected type `for<'cx> fn(&'cx S) -> &'cx S`
|
||||
found type `for<'a> fn(&'a S) -> &S {bar::<'_>}`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue