@@ -1990,6 +1990,89 @@ To learn more about traits, take a look at the Book:
1990
1990
https://doc.rust-lang.org/book/traits.html
1991
1991
"## ,
1992
1992
1993
+ E0174 : r##"
1994
+ This error occurs because of the explicit use of unboxed closure methods
1995
+ that are an experimental feature in current Rust version.
1996
+
1997
+ Example of erroneous code:
1998
+
1999
+ ```compile_fail
2000
+ fn foo<F: Fn(&str)>(mut f: F) {
2001
+ f.call(("call",));
2002
+ // error: explicit use of unboxed closure method `call`
2003
+ f.call_mut(("call_mut",));
2004
+ // error: explicit use of unboxed closure method `call_mut`
2005
+ f.call_once(("call_once",));
2006
+ // error: explicit use of unboxed closure method `call_once`
2007
+ }
2008
+
2009
+ fn bar(text: &str) {
2010
+ println!("Calling {} it works!", text);
2011
+ }
2012
+
2013
+ fn main() {
2014
+ foo(bar);
2015
+ }
2016
+ ```
2017
+
2018
+ Rust's implementation of closures is a bit different than other languages.
2019
+ They are effectively syntax sugar for traits `Fn`, `FnMut` and `FnOnce`.
2020
+ To understand better how the closures are implemented see here:
2021
+ https://doc.rust-lang.org/book/closures.html#closure-implementation
2022
+
2023
+ To fix this you can call them using parenthesis, like this: `foo()`.
2024
+ When you execute the closure with parenthesis, under the hood you are executing
2025
+ the method `call`, `call_mut` or `call_once`. However, using them explicitly is
2026
+ currently an experimental feature.
2027
+
2028
+ Example of an implicit call:
2029
+
2030
+ ```
2031
+ fn foo<F: Fn(&str)>(f: F) {
2032
+ f("using ()"); // Calling using () it works!
2033
+ }
2034
+
2035
+ fn bar(text: &str) {
2036
+ println!("Calling {} it works!", text);
2037
+ }
2038
+
2039
+ fn main() {
2040
+ foo(bar);
2041
+ }
2042
+ ```
2043
+
2044
+ To enable the explicit calls you need to add `#![feature(unboxed_closures)]`.
2045
+
2046
+ This feature is still unstable so you will also need to add
2047
+ `#![feature(fn_traits)]`.
2048
+ More details about this issue here:
2049
+ https://github.com/rust-lang/rust/issues/29625
2050
+
2051
+ Example of use:
2052
+
2053
+ ```
2054
+ #![feature(fn_traits)]
2055
+ #![feature(unboxed_closures)]
2056
+
2057
+ fn foo<F: Fn(&str)>(mut f: F) {
2058
+ f.call(("call",)); // Calling 'call' it works!
2059
+ f.call_mut(("call_mut",)); // Calling 'call_mut' it works!
2060
+ f.call_once(("call_once",)); // Calling 'call_once' it works!
2061
+ }
2062
+
2063
+ fn bar(text: &str) {
2064
+ println!("Calling '{}' it works!", text);
2065
+ }
2066
+
2067
+ fn main() {
2068
+ foo(bar);
2069
+ }
2070
+ ```
2071
+
2072
+ To see more about closures take a look here:
2073
+ https://doc.rust-lang.org/book/closures.html`
2074
+ "## ,
2075
+
1993
2076
E0178 : r##"
1994
2077
In types, the `+` type operator has low precedence, so it is often necessary
1995
2078
to use parentheses.
@@ -4007,7 +4090,6 @@ register_diagnostics! {
4007
4090
E0167 ,
4008
4091
// E0168,
4009
4092
// E0173, // manual implementations of unboxed closure traits are experimental
4010
- E0174 , // explicit use of unboxed closure methods are experimental
4011
4093
E0182 ,
4012
4094
E0183 ,
4013
4095
// E0187, // can't infer the kind of the closure
0 commit comments