about summary refs log tree commit diff
path: root/src/test/ui
diff options
context:
space:
mode:
authoryukang <moorekang@gmail.com>2022-08-14 14:09:16 +0800
committeryukang <moorekang@gmail.com>2022-09-08 23:26:57 +0800
commit50e5d03e16790400f0c5b6ce6d3a27f6a71c5298 (patch)
treed1c7d93435bae87a0b9429f805f3c9db4f14a4d6 /src/test/ui
parent3c7278846102bb829c9a789e91bc43f0ed612943 (diff)
downloadrust-50e5d03e16790400f0c5b6ce6d3a27f6a71c5298.tar.gz
rust-50e5d03e16790400f0c5b6ce6d3a27f6a71c5298.zip
Avoid infinite loop in function arguments checking
Diffstat (limited to 'src/test/ui')
-rw-r--r--src/test/ui/argument-suggestions/issue-100478.rs52
-rw-r--r--src/test/ui/argument-suggestions/issue-100478.stderr81
2 files changed, 133 insertions, 0 deletions
diff --git a/src/test/ui/argument-suggestions/issue-100478.rs b/src/test/ui/argument-suggestions/issue-100478.rs
new file mode 100644
index 00000000000..6bef6ad1038
--- /dev/null
+++ b/src/test/ui/argument-suggestions/issue-100478.rs
@@ -0,0 +1,52 @@
+use std::sync::Arc;
+macro_rules! GenT {
+    ($name:tt) => {
+        #[derive(Default, Debug)]
+        struct $name {
+            #[allow(unused)]
+            val: i32,
+        }
+
+        impl $name {
+            #[allow(unused)]
+            fn new(val: i32) -> Self {
+                $name { val }
+            }
+        }
+    };
+}
+
+GenT!(T1);
+GenT!(T2);
+GenT!(T3);
+GenT!(T4);
+GenT!(T5);
+GenT!(T6);
+GenT!(T7);
+GenT!(T8);
+
+#[allow(unused)]
+fn foo(p1: T1, p2: Arc<T2>, p3: T3, p4: Arc<T4>, p5: T5, p6: T6, p7: T7, p8: Arc<T8>) {}
+fn three_diff(_a: T1, _b: T2, _c: T3) {}
+fn four_shuffle(_a: T1, _b: T2, _c: T3, _d: T4) {}
+
+fn main() {
+    three_diff(T2::new(0)); //~ ERROR this function takes
+    four_shuffle(T3::default(), T4::default(), T1::default(), T2::default()); //~ ERROR 35:5: 35:17: arguments to this function are incorrect [E0308]
+    four_shuffle(T3::default(), T2::default(), T1::default(), T3::default()); //~ ERROR 36:5: 36:17: arguments to this function are incorrect [E0308]
+
+    let p1 = T1::new(0);
+    let p2 = Arc::new(T2::new(0));
+    let p3 = T3::new(0);
+    let p4 = Arc::new(T4::new(1));
+    let p5 = T5::new(0);
+    let p6 = T6::new(0);
+    let p7 = T7::new(0);
+    let p8 = Arc::default();
+
+    foo(
+        //~^ 47:5: 47:8: this function takes 8 arguments but 7 arguments were supplied [E0061]
+        p1, //p2,
+        p3, p4, p5, p6, p7, p8,
+    );
+}
diff --git a/src/test/ui/argument-suggestions/issue-100478.stderr b/src/test/ui/argument-suggestions/issue-100478.stderr
new file mode 100644
index 00000000000..a77889a9679
--- /dev/null
+++ b/src/test/ui/argument-suggestions/issue-100478.stderr
@@ -0,0 +1,81 @@
+error[E0061]: this function takes 3 arguments but 1 argument was supplied
+  --> $DIR/issue-100478.rs:34:5
+   |
+LL |     three_diff(T2::new(0));
+   |     ^^^^^^^^^^------------
+   |               ||
+   |               |an argument of type `T1` is missing
+   |               an argument of type `T3` is missing
+   |
+note: function defined here
+  --> $DIR/issue-100478.rs:30:4
+   |
+LL | fn three_diff(_a: T1, _b: T2, _c: T3) {}
+   |    ^^^^^^^^^^ ------  ------  ------
+help: provide the arguments
+   |
+LL |     three_diff(/* T1 */, T2::new(0), /* T3 */);
+   |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+error[E0308]: arguments to this function are incorrect
+  --> $DIR/issue-100478.rs:35:5
+   |
+LL |     four_shuffle(T3::default(), T4::default(), T1::default(), T2::default());
+   |     ^^^^^^^^^^^^ -------------  -------------  -------------  ------------- expected `T4`, found `T2`
+   |                  |              |              |
+   |                  |              |              expected `T3`, found `T1`
+   |                  |              expected `T2`, found `T4`
+   |                  expected `T1`, found `T3`
+   |
+note: function defined here
+  --> $DIR/issue-100478.rs:31:4
+   |
+LL | fn four_shuffle(_a: T1, _b: T2, _c: T3, _d: T4) {}
+   |    ^^^^^^^^^^^^ ------  ------  ------  ------
+help: did you mean
+   |
+LL |     four_shuffle(T1::default(), T2::default(), T3::default(), T4::default());
+   |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+error[E0308]: arguments to this function are incorrect
+  --> $DIR/issue-100478.rs:36:5
+   |
+LL |     four_shuffle(T3::default(), T2::default(), T1::default(), T3::default());
+   |     ^^^^^^^^^^^^ -------------                 -------------  ------------- expected struct `T4`, found struct `T3`
+   |                  |                             |
+   |                  |                             expected `T3`, found `T1`
+   |                  expected `T1`, found `T3`
+   |
+note: function defined here
+  --> $DIR/issue-100478.rs:31:4
+   |
+LL | fn four_shuffle(_a: T1, _b: T2, _c: T3, _d: T4) {}
+   |    ^^^^^^^^^^^^ ------  ------  ------  ------
+help: swap these arguments
+   |
+LL |     four_shuffle(T1::default(), T2::default(), T3::default(), /* T4 */);
+   |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+error[E0061]: this function takes 8 arguments but 7 arguments were supplied
+  --> $DIR/issue-100478.rs:47:5
+   |
+LL |     foo(
+   |     ^^^
+...
+LL |         p3, p4, p5, p6, p7, p8,
+   |         -- an argument of type `Arc<T2>` is missing
+   |
+note: function defined here
+  --> $DIR/issue-100478.rs:29:4
+   |
+LL | fn foo(p1: T1, p2: Arc<T2>, p3: T3, p4: Arc<T4>, p5: T5, p6: T6, p7: T7, p8: Arc<T8>) {}
+   |    ^^^ ------  -----------  ------  -----------  ------  ------  ------  -----------
+help: provide the argument
+   |
+LL |     foo(p1, /* Arc<T2> */, p3, p4, p5, p6, p7, p8);
+   |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+error: aborting due to 4 previous errors
+
+Some errors have detailed explanations: E0061, E0308.
+For more information about an error, try `rustc --explain E0061`.