diff options
| author | Michael Goulet <michael@errs.io> | 2022-07-16 22:15:41 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2022-07-16 22:15:41 +0000 |
| commit | 04c590b7ef3f864637fa3808d43089631c4cc3db (patch) | |
| tree | 916b08aaf48ff54a0d966ecea72335e2cc78ec46 | |
| parent | 7210e46dc69a4b197a313d093fe145722c248b7d (diff) | |
| download | rust-04c590b7ef3f864637fa3808d43089631c4cc3db.tar.gz rust-04c590b7ef3f864637fa3808d43089631c4cc3db.zip | |
Be more precise when suggesting removal of parens on unit adt ctor
| -rw-r--r-- | compiler/rustc_typeck/src/check/callee.rs | 36 | ||||
| -rw-r--r-- | src/test/ui/empty/empty-struct-unit-expr.rs | 4 | ||||
| -rw-r--r-- | src/test/ui/empty/empty-struct-unit-expr.stderr | 24 | ||||
| -rw-r--r-- | src/test/ui/error-codes/E0618.stderr | 4 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-20714.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-20714.stderr | 10 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-21701.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-21701.stderr | 10 | ||||
| -rw-r--r-- | src/test/ui/resolve/privacy-enum-ctor.stderr | 12 | ||||
| -rw-r--r-- | src/test/ui/suggestions/issue-99240.rs | 6 | ||||
| -rw-r--r-- | src/test/ui/suggestions/issue-99240.stderr | 11 | ||||
| -rw-r--r-- | src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.stderr | 4 |
12 files changed, 86 insertions, 39 deletions
diff --git a/compiler/rustc_typeck/src/check/callee.rs b/compiler/rustc_typeck/src/check/callee.rs index d14d06237be..7996fe5f363 100644 --- a/compiler/rustc_typeck/src/check/callee.rs +++ b/compiler/rustc_typeck/src/check/callee.rs @@ -4,7 +4,7 @@ use crate::type_error_struct; use rustc_errors::{struct_span_err, Applicability, Diagnostic}; use rustc_hir as hir; -use rustc_hir::def::{Namespace, Res}; +use rustc_hir::def::{self, Namespace, Res}; use rustc_hir::def_id::{DefId, LOCAL_CRATE}; use rustc_infer::{ infer, @@ -390,17 +390,23 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { (fn_sig, Some(def_id)) } ty::FnPtr(sig) => (sig, None), - ref t => { + _ => { let mut unit_variant = None; - let mut removal_span = call_expr.span; - if let ty::Adt(adt_def, ..) = t - && adt_def.is_enum() - && let hir::ExprKind::Call(expr, _) = call_expr.kind + if let hir::ExprKind::Path(qpath) = &callee_expr.kind + && let Res::Def(def::DefKind::Ctor(kind, def::CtorKind::Const), _) + = self.typeck_results.borrow().qpath_res(qpath, callee_expr.hir_id) + // Only suggest removing parens if there are no arguments + && arg_exprs.is_empty() + && let Ok(path) = self.tcx.sess.source_map().span_to_snippet(callee_expr.span) { - removal_span = - expr.span.shrink_to_hi().to(call_expr.span.shrink_to_hi()); + let descr = match kind { + def::CtorOf::Struct => "struct", + def::CtorOf::Variant => "enum variant", + }; + let removal_span = + callee_expr.span.shrink_to_hi().to(call_expr.span.shrink_to_hi()); unit_variant = - self.tcx.sess.source_map().span_to_snippet(expr.span).ok(); + Some((removal_span, descr, path)); } let callee_ty = self.resolve_vars_if_possible(callee_ty); @@ -410,8 +416,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { callee_ty, E0618, "expected function, found {}", - match unit_variant { - Some(ref path) => format!("enum variant `{path}`"), + match &unit_variant { + Some((_, kind, path)) => format!("{kind} `{path}`"), None => format!("`{callee_ty}`"), } ); @@ -423,11 +429,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { callee_expr.span, ); - if let Some(ref path) = unit_variant { + if let Some((removal_span, kind, path)) = &unit_variant { err.span_suggestion_verbose( - removal_span, + *removal_span, &format!( - "`{path}` is a unit variant, you need to write it without the parentheses", + "`{path}` is a unit {kind}, and does not take parentheses to be constructed", ), "", Applicability::MachineApplicable, @@ -470,7 +476,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { if let Some(span) = self.tcx.hir().res_span(def) { let callee_ty = callee_ty.to_string(); let label = match (unit_variant, inner_callee_path) { - (Some(path), _) => Some(format!("`{path}` defined here")), + (Some((_, kind, path)), _) => Some(format!("{kind} `{path}` defined here")), (_, Some(hir::QPath::Resolved(_, path))) => self .tcx .sess diff --git a/src/test/ui/empty/empty-struct-unit-expr.rs b/src/test/ui/empty/empty-struct-unit-expr.rs index b192e3a92c3..8f3688a2a07 100644 --- a/src/test/ui/empty/empty-struct-unit-expr.rs +++ b/src/test/ui/empty/empty-struct-unit-expr.rs @@ -12,10 +12,10 @@ enum E { } fn main() { - let e2 = Empty2(); //~ ERROR expected function, found `Empty2` + let e2 = Empty2(); //~ ERROR expected function, found struct `Empty2` let e4 = E::Empty4(); //~^ ERROR expected function, found enum variant `E::Empty4` [E0618] - let xe2 = XEmpty2(); //~ ERROR expected function, found `empty_struct::XEmpty2` + let xe2 = XEmpty2(); //~ ERROR expected function, found struct `XEmpty2` let xe4 = XE::XEmpty4(); //~^ ERROR expected function, found enum variant `XE::XEmpty4` [E0618] } diff --git a/src/test/ui/empty/empty-struct-unit-expr.stderr b/src/test/ui/empty/empty-struct-unit-expr.stderr index cd51274dce8..e97209527fe 100644 --- a/src/test/ui/empty/empty-struct-unit-expr.stderr +++ b/src/test/ui/empty/empty-struct-unit-expr.stderr @@ -1,38 +1,50 @@ -error[E0618]: expected function, found `Empty2` +error[E0618]: expected function, found struct `Empty2` --> $DIR/empty-struct-unit-expr.rs:15:14 | LL | struct Empty2; - | ------------- `Empty2` defined here + | ------------- struct `Empty2` defined here ... LL | let e2 = Empty2(); | ^^^^^^-- | | | call expression requires function + | +help: `Empty2` is a unit struct, and does not take parentheses to be constructed + | +LL - let e2 = Empty2(); +LL + let e2 = Empty2; + | error[E0618]: expected function, found enum variant `E::Empty4` --> $DIR/empty-struct-unit-expr.rs:16:14 | LL | Empty4 - | ------ `E::Empty4` defined here + | ------ enum variant `E::Empty4` defined here ... LL | let e4 = E::Empty4(); | ^^^^^^^^^-- | | | call expression requires function | -help: `E::Empty4` is a unit variant, you need to write it without the parentheses +help: `E::Empty4` is a unit enum variant, and does not take parentheses to be constructed | LL - let e4 = E::Empty4(); LL + let e4 = E::Empty4; | -error[E0618]: expected function, found `empty_struct::XEmpty2` +error[E0618]: expected function, found struct `XEmpty2` --> $DIR/empty-struct-unit-expr.rs:18:15 | LL | let xe2 = XEmpty2(); | ^^^^^^^-- | | | call expression requires function + | +help: `XEmpty2` is a unit struct, and does not take parentheses to be constructed + | +LL - let xe2 = XEmpty2(); +LL + let xe2 = XEmpty2; + | error[E0618]: expected function, found enum variant `XE::XEmpty4` --> $DIR/empty-struct-unit-expr.rs:19:15 @@ -42,7 +54,7 @@ LL | let xe4 = XE::XEmpty4(); | | | call expression requires function | -help: `XE::XEmpty4` is a unit variant, you need to write it without the parentheses +help: `XE::XEmpty4` is a unit enum variant, and does not take parentheses to be constructed | LL - let xe4 = XE::XEmpty4(); LL + let xe4 = XE::XEmpty4; diff --git a/src/test/ui/error-codes/E0618.stderr b/src/test/ui/error-codes/E0618.stderr index fcee6b47c1d..793ec02a86f 100644 --- a/src/test/ui/error-codes/E0618.stderr +++ b/src/test/ui/error-codes/E0618.stderr @@ -2,14 +2,14 @@ error[E0618]: expected function, found enum variant `X::Entry` --> $DIR/E0618.rs:6:5 | LL | Entry, - | ----- `X::Entry` defined here + | ----- enum variant `X::Entry` defined here ... LL | X::Entry(); | ^^^^^^^^-- | | | call expression requires function | -help: `X::Entry` is a unit variant, you need to write it without the parentheses +help: `X::Entry` is a unit enum variant, and does not take parentheses to be constructed | LL - X::Entry(); LL + X::Entry; diff --git a/src/test/ui/issues/issue-20714.rs b/src/test/ui/issues/issue-20714.rs index 0a4817c1164..3aa39bb7388 100644 --- a/src/test/ui/issues/issue-20714.rs +++ b/src/test/ui/issues/issue-20714.rs @@ -1,5 +1,5 @@ struct G; fn main() { - let g = G(); //~ ERROR: expected function, found `G` + let g = G(); //~ ERROR: expected function, found struct `G` } diff --git a/src/test/ui/issues/issue-20714.stderr b/src/test/ui/issues/issue-20714.stderr index 2d88ce5e511..a3447aa6845 100644 --- a/src/test/ui/issues/issue-20714.stderr +++ b/src/test/ui/issues/issue-20714.stderr @@ -1,13 +1,19 @@ -error[E0618]: expected function, found `G` +error[E0618]: expected function, found struct `G` --> $DIR/issue-20714.rs:4:13 | LL | struct G; - | -------- `G` defined here + | -------- struct `G` defined here ... LL | let g = G(); | ^-- | | | call expression requires function + | +help: `G` is a unit struct, and does not take parentheses to be constructed + | +LL - let g = G(); +LL + let g = G; + | error: aborting due to previous error diff --git a/src/test/ui/issues/issue-21701.rs b/src/test/ui/issues/issue-21701.rs index fb2d5a4ad2a..bfa03c5e42f 100644 --- a/src/test/ui/issues/issue-21701.rs +++ b/src/test/ui/issues/issue-21701.rs @@ -7,7 +7,7 @@ struct Bar; pub fn some_func() { let f = Bar(); -//~^ ERROR: expected function, found `Bar` +//~^ ERROR: expected function, found struct `Bar` } fn main() { diff --git a/src/test/ui/issues/issue-21701.stderr b/src/test/ui/issues/issue-21701.stderr index ada6f44319d..9f1fe7dde73 100644 --- a/src/test/ui/issues/issue-21701.stderr +++ b/src/test/ui/issues/issue-21701.stderr @@ -8,16 +8,22 @@ LL | let y = t(); | | | call expression requires function -error[E0618]: expected function, found `Bar` +error[E0618]: expected function, found struct `Bar` --> $DIR/issue-21701.rs:9:13 | LL | struct Bar; - | ---------- `Bar` defined here + | ---------- struct `Bar` defined here ... LL | let f = Bar(); | ^^^-- | | | call expression requires function + | +help: `Bar` is a unit struct, and does not take parentheses to be constructed + | +LL - let f = Bar(); +LL + let f = Bar; + | error: aborting due to 2 previous errors diff --git a/src/test/ui/resolve/privacy-enum-ctor.stderr b/src/test/ui/resolve/privacy-enum-ctor.stderr index e546d9f64ec..f885ac2151d 100644 --- a/src/test/ui/resolve/privacy-enum-ctor.stderr +++ b/src/test/ui/resolve/privacy-enum-ctor.stderr @@ -336,14 +336,14 @@ error[E0618]: expected function, found enum variant `Z::Unit` --> $DIR/privacy-enum-ctor.rs:31:17 | LL | Unit, - | ---- `Z::Unit` defined here + | ---- enum variant `Z::Unit` defined here ... LL | let _ = Z::Unit(); | ^^^^^^^-- | | | call expression requires function | -help: `Z::Unit` is a unit variant, you need to write it without the parentheses +help: `Z::Unit` is a unit enum variant, and does not take parentheses to be constructed | LL - let _ = Z::Unit(); LL + let _ = Z::Unit; @@ -371,14 +371,14 @@ error[E0618]: expected function, found enum variant `m::E::Unit` --> $DIR/privacy-enum-ctor.rs:47:16 | LL | Unit, - | ---- `m::E::Unit` defined here + | ---- enum variant `m::E::Unit` defined here ... LL | let _: E = m::E::Unit(); | ^^^^^^^^^^-- | | | call expression requires function | -help: `m::E::Unit` is a unit variant, you need to write it without the parentheses +help: `m::E::Unit` is a unit enum variant, and does not take parentheses to be constructed | LL - let _: E = m::E::Unit(); LL + let _: E = m::E::Unit; @@ -406,14 +406,14 @@ error[E0618]: expected function, found enum variant `E::Unit` --> $DIR/privacy-enum-ctor.rs:55:16 | LL | Unit, - | ---- `E::Unit` defined here + | ---- enum variant `E::Unit` defined here ... LL | let _: E = E::Unit(); | ^^^^^^^-- | | | call expression requires function | -help: `E::Unit` is a unit variant, you need to write it without the parentheses +help: `E::Unit` is a unit enum variant, and does not take parentheses to be constructed | LL - let _: E = E::Unit(); LL + let _: E = E::Unit; diff --git a/src/test/ui/suggestions/issue-99240.rs b/src/test/ui/suggestions/issue-99240.rs new file mode 100644 index 00000000000..2115a42662e --- /dev/null +++ b/src/test/ui/suggestions/issue-99240.rs @@ -0,0 +1,6 @@ +fn fmt(it: &(std::cell::Cell<Option<impl FnOnce()>>,)) { + (it.0.take())() + //~^ ERROR expected function +} + +fn main() {} diff --git a/src/test/ui/suggestions/issue-99240.stderr b/src/test/ui/suggestions/issue-99240.stderr new file mode 100644 index 00000000000..f1bea688b4e --- /dev/null +++ b/src/test/ui/suggestions/issue-99240.stderr @@ -0,0 +1,11 @@ +error[E0618]: expected function, found `Option<impl FnOnce()>` + --> $DIR/issue-99240.rs:2:5 + | +LL | (it.0.take())() + | ^^^^^^^^^^^^^-- + | | + | call expression requires function + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0618`. diff --git a/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.stderr b/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.stderr index 8ddf9f7cd68..8f3180a8639 100644 --- a/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.stderr +++ b/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.stderr @@ -20,14 +20,14 @@ error[E0618]: expected function, found enum variant `Alias::Unit` --> $DIR/incorrect-variant-form-through-alias-caught.rs:15:5 | LL | enum Enum { Braced {}, Unit, Tuple() } - | ---- `Alias::Unit` defined here + | ---- enum variant `Alias::Unit` defined here ... LL | Alias::Unit(); | ^^^^^^^^^^^-- | | | call expression requires function | -help: `Alias::Unit` is a unit variant, you need to write it without the parentheses +help: `Alias::Unit` is a unit enum variant, and does not take parentheses to be constructed | LL - Alias::Unit(); LL + Alias::Unit; |
