From 4ca4e094abf6ef2c4871aa6b395e85e8843eb4a8 Mon Sep 17 00:00:00 2001 From: Esteban Kuber Date: Tue, 16 Nov 2021 20:35:26 +0000 Subject: [PATCH] Suggest removal of arguments for unit variant, not replacement --- compiler/rustc_typeck/src/check/callee.rs | 12 +++++++----- src/test/ui/empty/empty-struct-unit-expr.stderr | 10 ++++++---- src/test/ui/error-codes/E0618.stderr | 5 +++-- src/test/ui/resolve/privacy-enum-ctor.stderr | 15 +++++++++------ ...rrect-variant-form-through-alias-caught.stderr | 5 +++-- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/compiler/rustc_typeck/src/check/callee.rs b/compiler/rustc_typeck/src/check/callee.rs index 5d22e300774d..635ed9381931 100644 --- a/compiler/rustc_typeck/src/check/callee.rs +++ b/compiler/rustc_typeck/src/check/callee.rs @@ -349,9 +349,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { 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 { if adt_def.is_enum() { if let hir::ExprKind::Call(expr, _) = call_expr.kind { + removal_span = + 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(); } @@ -379,14 +382,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { ); if let Some(ref path) = unit_variant { - err.span_suggestion( - call_expr.span, + err.span_suggestion_verbose( + removal_span, &format!( - "`{}` is a unit variant, you need to write it \ - without the parentheses", + "`{}` is a unit variant, you need to write it without the parentheses", path ), - path.to_string(), + String::new(), Applicability::MachineApplicable, ); } diff --git a/src/test/ui/empty/empty-struct-unit-expr.stderr b/src/test/ui/empty/empty-struct-unit-expr.stderr index 26bfc4355fa1..81651c5bf6f4 100644 --- a/src/test/ui/empty/empty-struct-unit-expr.stderr +++ b/src/test/ui/empty/empty-struct-unit-expr.stderr @@ -22,8 +22,9 @@ LL | let e4 = E::Empty4(); | help: `E::Empty4` is a unit variant, you need to write it without the parentheses | -LL | let e4 = E::Empty4; - | ~~~~~~~~~ +LL - let e4 = E::Empty4(); +LL + let e4 = E::Empty4; + | error[E0618]: expected function, found `empty_struct::XEmpty2` --> $DIR/empty-struct-unit-expr.rs:18:15 @@ -43,8 +44,9 @@ LL | let xe4 = XE::XEmpty4(); | help: `XE::XEmpty4` is a unit variant, you need to write it without the parentheses | -LL | let xe4 = XE::XEmpty4; - | ~~~~~~~~~~~ +LL - let xe4 = XE::XEmpty4(); +LL + let xe4 = XE::XEmpty4; + | error: aborting due to 4 previous errors diff --git a/src/test/ui/error-codes/E0618.stderr b/src/test/ui/error-codes/E0618.stderr index db1b3f098374..a3a90968df70 100644 --- a/src/test/ui/error-codes/E0618.stderr +++ b/src/test/ui/error-codes/E0618.stderr @@ -11,8 +11,9 @@ LL | X::Entry(); | help: `X::Entry` is a unit variant, you need to write it without the parentheses | -LL | X::Entry; - | ~~~~~~~~ +LL - X::Entry(); +LL + X::Entry; + | error[E0618]: expected function, found `i32` --> $DIR/E0618.rs:9:5 diff --git a/src/test/ui/resolve/privacy-enum-ctor.stderr b/src/test/ui/resolve/privacy-enum-ctor.stderr index 06c52befd52b..c93ba915efb2 100644 --- a/src/test/ui/resolve/privacy-enum-ctor.stderr +++ b/src/test/ui/resolve/privacy-enum-ctor.stderr @@ -340,8 +340,9 @@ LL | let _ = Z::Unit(); | help: `Z::Unit` is a unit variant, you need to write it without the parentheses | -LL | let _ = Z::Unit; - | ~~~~~~~ +LL - let _ = Z::Unit(); +LL + let _ = Z::Unit; + | error[E0308]: mismatched types --> $DIR/privacy-enum-ctor.rs:43:16 @@ -374,8 +375,9 @@ LL | let _: E = m::E::Unit(); | help: `m::E::Unit` is a unit variant, you need to write it without the parentheses | -LL | let _: E = m::E::Unit; - | ~~~~~~~~~~ +LL - let _: E = m::E::Unit(); +LL + let _: E = m::E::Unit; + | error[E0308]: mismatched types --> $DIR/privacy-enum-ctor.rs:51:16 @@ -408,8 +410,9 @@ LL | let _: E = E::Unit(); | help: `E::Unit` is a unit variant, you need to write it without the parentheses | -LL | let _: E = E::Unit; - | ~~~~~~~ +LL - let _: E = E::Unit(); +LL + let _: E = E::Unit; + | error: aborting due to 23 previous errors 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 e918551020c3..0cf020861c74 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 @@ -29,8 +29,9 @@ LL | Alias::Unit(); | help: `Alias::Unit` is a unit variant, you need to write it without the parentheses | -LL | Alias::Unit; - | ~~~~~~~~~~~ +LL - Alias::Unit(); +LL + Alias::Unit; + | error[E0164]: expected tuple struct or tuple variant, found unit variant `Alias::Unit` --> $DIR/incorrect-variant-form-through-alias-caught.rs:17:9