about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMu001999 <mu001999@outlook.com>2023-08-13 20:34:36 +0800
committerMu001999 <mu001999@outlook.com>2023-08-13 20:34:36 +0800
commitb1ddd57b5c0d306c02d06fbf8c3750f1c5a16d3c (patch)
tree4bd37ba1acebee4032359251bb560a5210784ff1
parentb08dd92552d663e3c877c8e5ce859e212205a09f (diff)
downloadrust-b1ddd57b5c0d306c02d06fbf8c3750f1c5a16d3c.tar.gz
rust-b1ddd57b5c0d306c02d06fbf8c3750f1c5a16d3c.zip
Add check before suggest removing parens
-rw-r--r--compiler/rustc_hir_typeck/src/callee.rs1
-rw-r--r--tests/ui/suggestions/issue-114701.rs15
-rw-r--r--tests/ui/suggestions/issue-114701.stderr48
3 files changed, 64 insertions, 0 deletions
diff --git a/compiler/rustc_hir_typeck/src/callee.rs b/compiler/rustc_hir_typeck/src/callee.rs
index dd79d1afc62..02371f85ac3 100644
--- a/compiler/rustc_hir_typeck/src/callee.rs
+++ b/compiler/rustc_hir_typeck/src/callee.rs
@@ -599,6 +599,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
                 = self.typeck_results.borrow().qpath_res(qpath, callee_expr.hir_id)
             // Only suggest removing parens if there are no arguments
             && arg_exprs.is_empty()
+            && call_expr.span.contains(callee_expr.span)
         {
             let descr = match kind {
                 def::CtorOf::Struct => "struct",
diff --git a/tests/ui/suggestions/issue-114701.rs b/tests/ui/suggestions/issue-114701.rs
new file mode 100644
index 00000000000..09d573f054b
--- /dev/null
+++ b/tests/ui/suggestions/issue-114701.rs
@@ -0,0 +1,15 @@
+enum Enum<T> { , SVariant { v: T }, UVariant } //~ ERROR expected identifier, found `,`
+
+macro_rules! is_variant {
+    (TSVariant, ) => (!);
+    (SVariant, ) => (!);
+    (UVariant, $expr:expr) => (is_variant!(@check UVariant, {}, $expr));
+    (@check $variant:ident, $matcher:tt, $expr:expr) => (
+        assert!(if let Enum::$variant::<()> $matcher = $expr () else { false }, //~ ERROR this `if` expression
+                );
+    );
+}
+
+fn main() {
+    is_variant!(UVariant, Enum::<()>::UVariant); //~ ERROR expected function
+}
diff --git a/tests/ui/suggestions/issue-114701.stderr b/tests/ui/suggestions/issue-114701.stderr
new file mode 100644
index 00000000000..bccc98e0608
--- /dev/null
+++ b/tests/ui/suggestions/issue-114701.stderr
@@ -0,0 +1,48 @@
+error: expected identifier, found `,`
+  --> $DIR/issue-114701.rs:1:16
+   |
+LL | enum Enum<T> { , SVariant { v: T }, UVariant }
+   |                ^
+   |                |
+   |                expected identifier
+   |                help: remove this comma
+
+error: this `if` expression is missing a block after the condition
+  --> $DIR/issue-114701.rs:8:17
+   |
+LL |         assert!(if let Enum::$variant::<()> $matcher = $expr () else { false },
+   |                 ^^
+...
+LL |     is_variant!(UVariant, Enum::<()>::UVariant);
+   |     ------------------------------------------- in this macro invocation
+   |
+help: add a block here
+  --> $DIR/issue-114701.rs:8:64
+   |
+LL |         assert!(if let Enum::$variant::<()> $matcher = $expr () else { false },
+   |                                                                ^
+...
+LL |     is_variant!(UVariant, Enum::<()>::UVariant);
+   |     ------------------------------------------- in this macro invocation
+   = note: this error originates in the macro `is_variant` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: remove the `if` if you meant to write a `let...else` statement
+   |
+LL -         assert!(if let Enum::$variant::<()> $matcher = $expr () else { false },
+LL +         assert!(let Enum::$variant::<()> $matcher = $expr () else { false },
+   |
+
+error[E0618]: expected function, found `Enum<()>`
+  --> $DIR/issue-114701.rs:14:27
+   |
+LL | enum Enum<T> { , SVariant { v: T }, UVariant }
+   |                                     -------- `Enum::UVariant` defined here
+...
+LL |         assert!(if let Enum::$variant::<()> $matcher = $expr () else { false },
+   |                                                        -------- call expression requires function
+...
+LL |     is_variant!(UVariant, Enum::<()>::UVariant);
+   |                           ^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0618`.