about summary refs log tree commit diff
path: root/tests/ui/tuple
diff options
context:
space:
mode:
authorAlbert Larsan <74931857+albertlarsan68@users.noreply.github.com>2023-01-05 09:13:28 +0100
committerAlbert Larsan <74931857+albertlarsan68@users.noreply.github.com>2023-01-11 09:32:08 +0000
commitcf2dff2b1e3fa55fa5415d524200070d0d7aacfe (patch)
tree40a88d9a46aaf3e8870676eb2538378b75a263eb /tests/ui/tuple
parentca855e6e42787ecd062d81d53336fe6788ef51a9 (diff)
downloadrust-cf2dff2b1e3fa55fa5415d524200070d0d7aacfe.tar.gz
rust-cf2dff2b1e3fa55fa5415d524200070d0d7aacfe.zip
Move /src/test to /tests
Diffstat (limited to 'tests/ui/tuple')
-rw-r--r--tests/ui/tuple/add-tuple-within-arguments.rs10
-rw-r--r--tests/ui/tuple/add-tuple-within-arguments.stderr40
-rw-r--r--tests/ui/tuple/array-diagnostics.rs7
-rw-r--r--tests/ui/tuple/array-diagnostics.stderr9
-rw-r--r--tests/ui/tuple/builtin-fail.rs19
-rw-r--r--tests/ui/tuple/builtin-fail.stderr55
-rw-r--r--tests/ui/tuple/builtin.rs20
-rw-r--r--tests/ui/tuple/index-float.rs10
-rw-r--r--tests/ui/tuple/index-invalid.rs7
-rw-r--r--tests/ui/tuple/index-invalid.stderr21
-rw-r--r--tests/ui/tuple/indexing-in-macro.rs9
-rw-r--r--tests/ui/tuple/nested-index.rs12
-rw-r--r--tests/ui/tuple/one-tuple.rs15
-rw-r--r--tests/ui/tuple/tup.rs21
-rw-r--r--tests/ui/tuple/tuple-arity-mismatch.rs17
-rw-r--r--tests/ui/tuple/tuple-arity-mismatch.stderr35
-rw-r--r--tests/ui/tuple/tuple-index-fat-types.rs13
-rw-r--r--tests/ui/tuple/tuple-index-not-tuple.rs10
-rw-r--r--tests/ui/tuple/tuple-index-not-tuple.stderr15
-rw-r--r--tests/ui/tuple/tuple-index-out-of-bounds.rs14
-rw-r--r--tests/ui/tuple/tuple-index-out-of-bounds.stderr15
-rw-r--r--tests/ui/tuple/tuple-struct-fields/test.rs9
-rw-r--r--tests/ui/tuple/tuple-struct-fields/test.stderr17
-rw-r--r--tests/ui/tuple/tuple-struct-fields/test2.rs15
-rw-r--r--tests/ui/tuple/tuple-struct-fields/test2.stderr28
-rw-r--r--tests/ui/tuple/tuple-struct-fields/test3.rs15
-rw-r--r--tests/ui/tuple/tuple-struct-fields/test3.stderr28
-rw-r--r--tests/ui/tuple/wrong_argument_ice-2.rs17
-rw-r--r--tests/ui/tuple/wrong_argument_ice-2.stderr19
-rw-r--r--tests/ui/tuple/wrong_argument_ice-3.rs17
-rw-r--r--tests/ui/tuple/wrong_argument_ice-3.stderr23
-rw-r--r--tests/ui/tuple/wrong_argument_ice-4.rs6
-rw-r--r--tests/ui/tuple/wrong_argument_ice-4.stderr23
-rw-r--r--tests/ui/tuple/wrong_argument_ice.rs17
-rw-r--r--tests/ui/tuple/wrong_argument_ice.stderr16
35 files changed, 624 insertions, 0 deletions
diff --git a/tests/ui/tuple/add-tuple-within-arguments.rs b/tests/ui/tuple/add-tuple-within-arguments.rs
new file mode 100644
index 00000000000..01b13b29fb4
--- /dev/null
+++ b/tests/ui/tuple/add-tuple-within-arguments.rs
@@ -0,0 +1,10 @@
+fn foo(s: &str, a: (i32, i32), s2: &str) {}
+
+fn bar(s: &str, a: (&str,), s2: &str) {}
+
+fn main() {
+    foo("hi", 1, 2, "hi");
+    //~^ ERROR function takes 3 arguments but 4 arguments were supplied
+    bar("hi", "hi", "hi");
+    //~^ ERROR mismatched types
+}
diff --git a/tests/ui/tuple/add-tuple-within-arguments.stderr b/tests/ui/tuple/add-tuple-within-arguments.stderr
new file mode 100644
index 00000000000..2e20a4cca08
--- /dev/null
+++ b/tests/ui/tuple/add-tuple-within-arguments.stderr
@@ -0,0 +1,40 @@
+error[E0061]: function takes 3 arguments but 4 arguments were supplied
+  --> $DIR/add-tuple-within-arguments.rs:6:5
+   |
+LL |     foo("hi", 1, 2, "hi");
+   |     ^^^
+   |
+note: function defined here
+  --> $DIR/add-tuple-within-arguments.rs:1:4
+   |
+LL | fn foo(s: &str, a: (i32, i32), s2: &str) {}
+   |    ^^^          -------------
+help: wrap these arguments in parentheses to construct a tuple
+   |
+LL |     foo("hi", (1, 2), "hi");
+   |               +    +
+
+error[E0308]: mismatched types
+  --> $DIR/add-tuple-within-arguments.rs:8:15
+   |
+LL |     bar("hi", "hi", "hi");
+   |     ---       ^^^^ expected tuple, found `&str`
+   |     |
+   |     arguments to this function are incorrect
+   |
+   = note:  expected tuple `(&str,)`
+           found reference `&'static str`
+note: function defined here
+  --> $DIR/add-tuple-within-arguments.rs:3:4
+   |
+LL | fn bar(s: &str, a: (&str,), s2: &str) {}
+   |    ^^^          ----------
+help: use a trailing comma to create a tuple with one element
+   |
+LL |     bar("hi", ("hi",), "hi");
+   |               +    ++
+
+error: aborting due to 2 previous errors
+
+Some errors have detailed explanations: E0061, E0308.
+For more information about an error, try `rustc --explain E0061`.
diff --git a/tests/ui/tuple/array-diagnostics.rs b/tests/ui/tuple/array-diagnostics.rs
new file mode 100644
index 00000000000..1929dab0731
--- /dev/null
+++ b/tests/ui/tuple/array-diagnostics.rs
@@ -0,0 +1,7 @@
+fn main() {
+    let _tmp = [
+        ("C200B40A82", 3),
+        ("C200B40A83", 4) //~ ERROR: expected function, found `(&'static str, {integer})` [E0618]
+        ("C200B40A8537", 5),
+    ];
+}
diff --git a/tests/ui/tuple/array-diagnostics.stderr b/tests/ui/tuple/array-diagnostics.stderr
new file mode 100644
index 00000000000..a10d7af470c
--- /dev/null
+++ b/tests/ui/tuple/array-diagnostics.stderr
@@ -0,0 +1,9 @@
+error[E0618]: expected function, found `(&'static str, {integer})`
+  --> $DIR/array-diagnostics.rs:4:9
+   |
+LL |         ("C200B40A83", 4)
+   |         ^^^^^^^^^^^^^^^^^- help: consider separating array elements with a comma: `,`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0618`.
diff --git a/tests/ui/tuple/builtin-fail.rs b/tests/ui/tuple/builtin-fail.rs
new file mode 100644
index 00000000000..31208096151
--- /dev/null
+++ b/tests/ui/tuple/builtin-fail.rs
@@ -0,0 +1,19 @@
+#![feature(tuple_trait)]
+
+fn assert_is_tuple<T: std::marker::Tuple + ?Sized>() {}
+
+struct TupleStruct(i32, i32);
+
+fn from_param_env<T>() {
+    assert_is_tuple::<T>();
+    //~^ ERROR `T` is not a tuple
+}
+
+fn main() {
+    assert_is_tuple::<i32>();
+    //~^ ERROR `i32` is not a tuple
+    assert_is_tuple::<(i32)>();
+    //~^ ERROR `i32` is not a tuple
+    assert_is_tuple::<TupleStruct>();
+    //~^ ERROR `TupleStruct` is not a tuple
+}
diff --git a/tests/ui/tuple/builtin-fail.stderr b/tests/ui/tuple/builtin-fail.stderr
new file mode 100644
index 00000000000..e3e29a73fdc
--- /dev/null
+++ b/tests/ui/tuple/builtin-fail.stderr
@@ -0,0 +1,55 @@
+error[E0277]: `T` is not a tuple
+  --> $DIR/builtin-fail.rs:8:23
+   |
+LL |     assert_is_tuple::<T>();
+   |                       ^ the trait `Tuple` is not implemented for `T`
+   |
+note: required by a bound in `assert_is_tuple`
+  --> $DIR/builtin-fail.rs:3:23
+   |
+LL | fn assert_is_tuple<T: std::marker::Tuple + ?Sized>() {}
+   |                       ^^^^^^^^^^^^^^^^^^ required by this bound in `assert_is_tuple`
+help: consider restricting type parameter `T`
+   |
+LL | fn from_param_env<T: std::marker::Tuple>() {
+   |                    ++++++++++++++++++++
+
+error[E0277]: `i32` is not a tuple
+  --> $DIR/builtin-fail.rs:13:23
+   |
+LL |     assert_is_tuple::<i32>();
+   |                       ^^^ the trait `Tuple` is not implemented for `i32`
+   |
+note: required by a bound in `assert_is_tuple`
+  --> $DIR/builtin-fail.rs:3:23
+   |
+LL | fn assert_is_tuple<T: std::marker::Tuple + ?Sized>() {}
+   |                       ^^^^^^^^^^^^^^^^^^ required by this bound in `assert_is_tuple`
+
+error[E0277]: `i32` is not a tuple
+  --> $DIR/builtin-fail.rs:15:24
+   |
+LL |     assert_is_tuple::<(i32)>();
+   |                        ^^^ the trait `Tuple` is not implemented for `i32`
+   |
+note: required by a bound in `assert_is_tuple`
+  --> $DIR/builtin-fail.rs:3:23
+   |
+LL | fn assert_is_tuple<T: std::marker::Tuple + ?Sized>() {}
+   |                       ^^^^^^^^^^^^^^^^^^ required by this bound in `assert_is_tuple`
+
+error[E0277]: `TupleStruct` is not a tuple
+  --> $DIR/builtin-fail.rs:17:23
+   |
+LL |     assert_is_tuple::<TupleStruct>();
+   |                       ^^^^^^^^^^^ the trait `Tuple` is not implemented for `TupleStruct`
+   |
+note: required by a bound in `assert_is_tuple`
+  --> $DIR/builtin-fail.rs:3:23
+   |
+LL | fn assert_is_tuple<T: std::marker::Tuple + ?Sized>() {}
+   |                       ^^^^^^^^^^^^^^^^^^ required by this bound in `assert_is_tuple`
+
+error: aborting due to 4 previous errors
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/tuple/builtin.rs b/tests/ui/tuple/builtin.rs
new file mode 100644
index 00000000000..d87ce526357
--- /dev/null
+++ b/tests/ui/tuple/builtin.rs
@@ -0,0 +1,20 @@
+// check-pass
+
+#![feature(tuple_trait)]
+
+fn assert_is_tuple<T: std::marker::Tuple + ?Sized>() {}
+
+struct Unsized([u8]);
+
+fn from_param_env<T: std::marker::Tuple + ?Sized>() {
+    assert_is_tuple::<T>();
+}
+
+fn main() {
+    assert_is_tuple::<()>();
+    assert_is_tuple::<(i32,)>();
+    assert_is_tuple::<(Unsized,)>();
+    from_param_env::<()>();
+    from_param_env::<(i32,)>();
+    from_param_env::<(Unsized,)>();
+}
diff --git a/tests/ui/tuple/index-float.rs b/tests/ui/tuple/index-float.rs
new file mode 100644
index 00000000000..eda2bf48581
--- /dev/null
+++ b/tests/ui/tuple/index-float.rs
@@ -0,0 +1,10 @@
+// check-pass
+
+fn main() {
+    let tuple = (((),),);
+
+    let _ = tuple. 0.0; // OK, whitespace
+    let _ = tuple.0. 0; // OK, whitespace
+
+    let _ = tuple./*special cases*/0.0; // OK, comment
+}
diff --git a/tests/ui/tuple/index-invalid.rs b/tests/ui/tuple/index-invalid.rs
new file mode 100644
index 00000000000..d36f6cfe3df
--- /dev/null
+++ b/tests/ui/tuple/index-invalid.rs
@@ -0,0 +1,7 @@
+fn main() {
+    let _ = (((),),).1.0; //~ ERROR no field `1` on type `(((),),)`
+
+    let _ = (((),),).0.1; //~ ERROR no field `1` on type `((),)`
+
+    let _ = (((),),).000.000; //~ ERROR no field `000` on type `(((),),)`
+}
diff --git a/tests/ui/tuple/index-invalid.stderr b/tests/ui/tuple/index-invalid.stderr
new file mode 100644
index 00000000000..8d22f458a6c
--- /dev/null
+++ b/tests/ui/tuple/index-invalid.stderr
@@ -0,0 +1,21 @@
+error[E0609]: no field `1` on type `(((),),)`
+  --> $DIR/index-invalid.rs:2:22
+   |
+LL |     let _ = (((),),).1.0;
+   |                      ^
+
+error[E0609]: no field `1` on type `((),)`
+  --> $DIR/index-invalid.rs:4:24
+   |
+LL |     let _ = (((),),).0.1;
+   |                        ^
+
+error[E0609]: no field `000` on type `(((),),)`
+  --> $DIR/index-invalid.rs:6:22
+   |
+LL |     let _ = (((),),).000.000;
+   |                      ^^^
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0609`.
diff --git a/tests/ui/tuple/indexing-in-macro.rs b/tests/ui/tuple/indexing-in-macro.rs
new file mode 100644
index 00000000000..bef4a69ab23
--- /dev/null
+++ b/tests/ui/tuple/indexing-in-macro.rs
@@ -0,0 +1,9 @@
+// check-pass
+
+macro_rules! m {
+    (.$l:literal) => {};
+}
+
+m!(.0.0); // OK, `0.0` after a dot is still a float token.
+
+fn main() {}
diff --git a/tests/ui/tuple/nested-index.rs b/tests/ui/tuple/nested-index.rs
new file mode 100644
index 00000000000..a3232d6fc36
--- /dev/null
+++ b/tests/ui/tuple/nested-index.rs
@@ -0,0 +1,12 @@
+// run-pass
+
+fn main () {
+    let n = (1, (2, 3)).1.1;
+    assert_eq!(n, 3);
+
+    let n = (1, (2, (3, 4))).1.1.1;
+    assert_eq!(n, 4);
+
+    // This is a range expression, not nested indexing.
+    let _ = 0.0..1.1;
+}
diff --git a/tests/ui/tuple/one-tuple.rs b/tests/ui/tuple/one-tuple.rs
new file mode 100644
index 00000000000..00fbadce1ac
--- /dev/null
+++ b/tests/ui/tuple/one-tuple.rs
@@ -0,0 +1,15 @@
+// run-pass
+// Why one-tuples? Because macros.
+
+
+pub fn main() {
+    match ('c',) {
+        (x,) => {
+            assert_eq!(x, 'c');
+        }
+    }
+    // test the 1-tuple type too
+    let x: (char,) = ('d',);
+    let (y,) = x;
+    assert_eq!(y, 'd');
+}
diff --git a/tests/ui/tuple/tup.rs b/tests/ui/tuple/tup.rs
new file mode 100644
index 00000000000..160477b0b0a
--- /dev/null
+++ b/tests/ui/tuple/tup.rs
@@ -0,0 +1,21 @@
+// run-pass
+
+#![allow(non_camel_case_types)]
+
+type point = (isize, isize);
+
+fn f(p: point, x: isize, y: isize) {
+    let (a, b) = p;
+    assert_eq!(a, x);
+    assert_eq!(b, y);
+}
+
+pub fn main() {
+    let p: point = (10, 20);
+    let (a, b) = p;
+    assert_eq!(a, 10);
+    assert_eq!(b, 20);
+    let p2: point = p;
+    f(p, 10, 20);
+    f(p2, 10, 20);
+}
diff --git a/tests/ui/tuple/tuple-arity-mismatch.rs b/tests/ui/tuple/tuple-arity-mismatch.rs
new file mode 100644
index 00000000000..f1e525c93e1
--- /dev/null
+++ b/tests/ui/tuple/tuple-arity-mismatch.rs
@@ -0,0 +1,17 @@
+// Issue #6155
+
+fn first((value, _): (isize, f64)) -> isize { value }
+
+fn main() {
+    let y = first ((1,2.0,3));
+    //~^ ERROR mismatched types
+    //~| expected tuple `(isize, f64)`
+    //~| found tuple `(isize, f64, {integer})`
+    //~| expected a tuple with 2 elements, found one with 3 elements
+
+    let y = first ((1,));
+    //~^ ERROR mismatched types
+    //~| expected tuple `(isize, f64)`
+    //~| found tuple `(isize,)`
+    //~| expected a tuple with 2 elements, found one with 1 element
+}
diff --git a/tests/ui/tuple/tuple-arity-mismatch.stderr b/tests/ui/tuple/tuple-arity-mismatch.stderr
new file mode 100644
index 00000000000..fff7be987f2
--- /dev/null
+++ b/tests/ui/tuple/tuple-arity-mismatch.stderr
@@ -0,0 +1,35 @@
+error[E0308]: mismatched types
+  --> $DIR/tuple-arity-mismatch.rs:6:20
+   |
+LL |     let y = first ((1,2.0,3));
+   |             -----  ^^^^^^^^^ expected a tuple with 2 elements, found one with 3 elements
+   |             |
+   |             arguments to this function are incorrect
+   |
+   = note: expected tuple `(isize, f64)`
+              found tuple `(isize, f64, {integer})`
+note: function defined here
+  --> $DIR/tuple-arity-mismatch.rs:3:4
+   |
+LL | fn first((value, _): (isize, f64)) -> isize { value }
+   |    ^^^^^ ------------------------
+
+error[E0308]: mismatched types
+  --> $DIR/tuple-arity-mismatch.rs:12:20
+   |
+LL |     let y = first ((1,));
+   |             -----  ^^^^ expected a tuple with 2 elements, found one with 1 element
+   |             |
+   |             arguments to this function are incorrect
+   |
+   = note: expected tuple `(isize, f64)`
+              found tuple `(isize,)`
+note: function defined here
+  --> $DIR/tuple-arity-mismatch.rs:3:4
+   |
+LL | fn first((value, _): (isize, f64)) -> isize { value }
+   |    ^^^^^ ------------------------
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/tests/ui/tuple/tuple-index-fat-types.rs b/tests/ui/tuple/tuple-index-fat-types.rs
new file mode 100644
index 00000000000..5dda1ed975c
--- /dev/null
+++ b/tests/ui/tuple/tuple-index-fat-types.rs
@@ -0,0 +1,13 @@
+// run-pass
+
+struct Foo<'a>(&'a [isize]);
+
+fn main() {
+    let x: &[isize] = &[1, 2, 3];
+    let y = (x,);
+    assert_eq!(y.0, x);
+
+    let x: &[isize] = &[1, 2, 3];
+    let y = Foo(x);
+    assert_eq!(y.0, x);
+}
diff --git a/tests/ui/tuple/tuple-index-not-tuple.rs b/tests/ui/tuple/tuple-index-not-tuple.rs
new file mode 100644
index 00000000000..c478e1c6769
--- /dev/null
+++ b/tests/ui/tuple/tuple-index-not-tuple.rs
@@ -0,0 +1,10 @@
+struct Point { x: isize, y: isize }
+struct Empty;
+
+fn main() {
+    let origin = Point { x: 0, y: 0 };
+    origin.0;
+    //~^ ERROR no field `0` on type `Point`
+    Empty.0;
+    //~^ ERROR no field `0` on type `Empty`
+}
diff --git a/tests/ui/tuple/tuple-index-not-tuple.stderr b/tests/ui/tuple/tuple-index-not-tuple.stderr
new file mode 100644
index 00000000000..a1bcdfaedbc
--- /dev/null
+++ b/tests/ui/tuple/tuple-index-not-tuple.stderr
@@ -0,0 +1,15 @@
+error[E0609]: no field `0` on type `Point`
+  --> $DIR/tuple-index-not-tuple.rs:6:12
+   |
+LL |     origin.0;
+   |            ^ help: a field with a similar name exists: `x`
+
+error[E0609]: no field `0` on type `Empty`
+  --> $DIR/tuple-index-not-tuple.rs:8:11
+   |
+LL |     Empty.0;
+   |           ^ unknown field
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0609`.
diff --git a/tests/ui/tuple/tuple-index-out-of-bounds.rs b/tests/ui/tuple/tuple-index-out-of-bounds.rs
new file mode 100644
index 00000000000..c772c0daa18
--- /dev/null
+++ b/tests/ui/tuple/tuple-index-out-of-bounds.rs
@@ -0,0 +1,14 @@
+struct Point(i32, i32);
+
+fn main() {
+    let origin = Point(0, 0);
+    origin.0;
+    origin.1;
+    origin.2;
+    //~^ ERROR no field `2` on type `Point`
+    let tuple = (0, 0);
+    tuple.0;
+    tuple.1;
+    tuple.2;
+    //~^ ERROR no field `2` on type `({integer}, {integer})`
+}
diff --git a/tests/ui/tuple/tuple-index-out-of-bounds.stderr b/tests/ui/tuple/tuple-index-out-of-bounds.stderr
new file mode 100644
index 00000000000..7d7c5cd7892
--- /dev/null
+++ b/tests/ui/tuple/tuple-index-out-of-bounds.stderr
@@ -0,0 +1,15 @@
+error[E0609]: no field `2` on type `Point`
+  --> $DIR/tuple-index-out-of-bounds.rs:7:12
+   |
+LL |     origin.2;
+   |            ^ help: a field with a similar name exists: `0`
+
+error[E0609]: no field `2` on type `({integer}, {integer})`
+  --> $DIR/tuple-index-out-of-bounds.rs:12:11
+   |
+LL |     tuple.2;
+   |           ^
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0609`.
diff --git a/tests/ui/tuple/tuple-struct-fields/test.rs b/tests/ui/tuple/tuple-struct-fields/test.rs
new file mode 100644
index 00000000000..00677090d78
--- /dev/null
+++ b/tests/ui/tuple/tuple-struct-fields/test.rs
@@ -0,0 +1,9 @@
+mod foo {
+    type T = ();
+    struct S1(pub(in foo) (), pub(T), pub(crate) (), pub(((), T)));
+    struct S2(pub((foo)) ());
+    //~^ ERROR expected one of `)` or `,`, found `(`
+    //~| ERROR cannot find type `foo` in this scope
+}
+
+fn main() {}
diff --git a/tests/ui/tuple/tuple-struct-fields/test.stderr b/tests/ui/tuple/tuple-struct-fields/test.stderr
new file mode 100644
index 00000000000..bfa0b32fd45
--- /dev/null
+++ b/tests/ui/tuple/tuple-struct-fields/test.stderr
@@ -0,0 +1,17 @@
+error: expected one of `)` or `,`, found `(`
+  --> $DIR/test.rs:4:26
+   |
+LL |     struct S2(pub((foo)) ());
+   |                         -^ expected one of `)` or `,`
+   |                         |
+   |                         help: missing `,`
+
+error[E0412]: cannot find type `foo` in this scope
+  --> $DIR/test.rs:4:20
+   |
+LL |     struct S2(pub((foo)) ());
+   |                    ^^^ not found in this scope
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0412`.
diff --git a/tests/ui/tuple/tuple-struct-fields/test2.rs b/tests/ui/tuple/tuple-struct-fields/test2.rs
new file mode 100644
index 00000000000..2b2a2c127e9
--- /dev/null
+++ b/tests/ui/tuple/tuple-struct-fields/test2.rs
@@ -0,0 +1,15 @@
+macro_rules! define_struct {
+    ($t:ty) => {
+        struct S1(pub $t);
+        struct S2(pub (in foo) ());
+        struct S3(pub $t ());
+        //~^ ERROR expected one of `)` or `,`, found `(`
+    }
+}
+
+mod foo {
+    define_struct! { (foo) } //~ ERROR cannot find type `foo` in this scope
+                             //~| ERROR cannot find type `foo` in this scope
+}
+
+fn main() {}
diff --git a/tests/ui/tuple/tuple-struct-fields/test2.stderr b/tests/ui/tuple/tuple-struct-fields/test2.stderr
new file mode 100644
index 00000000000..64a9ac13566
--- /dev/null
+++ b/tests/ui/tuple/tuple-struct-fields/test2.stderr
@@ -0,0 +1,28 @@
+error: expected one of `)` or `,`, found `(`
+  --> $DIR/test2.rs:5:26
+   |
+LL |         struct S3(pub $t ());
+   |                         -^ expected one of `)` or `,`
+   |                         |
+   |                         help: missing `,`
+...
+LL |     define_struct! { (foo) }
+   |     ------------------------ in this macro invocation
+   |
+   = note: this error originates in the macro `define_struct` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0412]: cannot find type `foo` in this scope
+  --> $DIR/test2.rs:11:23
+   |
+LL |     define_struct! { (foo) }
+   |                       ^^^ not found in this scope
+
+error[E0412]: cannot find type `foo` in this scope
+  --> $DIR/test2.rs:11:23
+   |
+LL |     define_struct! { (foo) }
+   |                       ^^^ not found in this scope
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0412`.
diff --git a/tests/ui/tuple/tuple-struct-fields/test3.rs b/tests/ui/tuple/tuple-struct-fields/test3.rs
new file mode 100644
index 00000000000..98d19426e77
--- /dev/null
+++ b/tests/ui/tuple/tuple-struct-fields/test3.rs
@@ -0,0 +1,15 @@
+macro_rules! define_struct {
+    ($t:ty) => {
+        struct S1(pub($t));
+        struct S2(pub (in foo) ());
+        struct S3(pub($t) ());
+        //~^ ERROR expected one of `)` or `,`, found `(`
+    }
+}
+
+mod foo {
+    define_struct! { foo } //~ ERROR cannot find type `foo` in this scope
+                           //~| ERROR cannot find type `foo` in this scope
+}
+
+fn main() {}
diff --git a/tests/ui/tuple/tuple-struct-fields/test3.stderr b/tests/ui/tuple/tuple-struct-fields/test3.stderr
new file mode 100644
index 00000000000..75262ed5780
--- /dev/null
+++ b/tests/ui/tuple/tuple-struct-fields/test3.stderr
@@ -0,0 +1,28 @@
+error: expected one of `)` or `,`, found `(`
+  --> $DIR/test3.rs:5:27
+   |
+LL |         struct S3(pub($t) ());
+   |                          -^ expected one of `)` or `,`
+   |                          |
+   |                          help: missing `,`
+...
+LL |     define_struct! { foo }
+   |     ---------------------- in this macro invocation
+   |
+   = note: this error originates in the macro `define_struct` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0412]: cannot find type `foo` in this scope
+  --> $DIR/test3.rs:11:22
+   |
+LL |     define_struct! { foo }
+   |                      ^^^ not found in this scope
+
+error[E0412]: cannot find type `foo` in this scope
+  --> $DIR/test3.rs:11:22
+   |
+LL |     define_struct! { foo }
+   |                      ^^^ not found in this scope
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0412`.
diff --git a/tests/ui/tuple/wrong_argument_ice-2.rs b/tests/ui/tuple/wrong_argument_ice-2.rs
new file mode 100644
index 00000000000..e1c1d748fec
--- /dev/null
+++ b/tests/ui/tuple/wrong_argument_ice-2.rs
@@ -0,0 +1,17 @@
+fn test(t: (i32, i32)) {}
+
+struct Foo;
+
+impl Foo {
+    fn qux(&self) -> i32 {
+        0
+    }
+}
+
+fn bar() {
+    let x = Foo;
+    test(x.qux(), x.qux());
+    //~^ ERROR function takes 1 argument but 2 arguments were supplied
+}
+
+fn main() {}
diff --git a/tests/ui/tuple/wrong_argument_ice-2.stderr b/tests/ui/tuple/wrong_argument_ice-2.stderr
new file mode 100644
index 00000000000..41244209214
--- /dev/null
+++ b/tests/ui/tuple/wrong_argument_ice-2.stderr
@@ -0,0 +1,19 @@
+error[E0061]: function takes 1 argument but 2 arguments were supplied
+  --> $DIR/wrong_argument_ice-2.rs:13:5
+   |
+LL |     test(x.qux(), x.qux());
+   |     ^^^^
+   |
+note: function defined here
+  --> $DIR/wrong_argument_ice-2.rs:1:4
+   |
+LL | fn test(t: (i32, i32)) {}
+   |    ^^^^ -------------
+help: wrap these arguments in parentheses to construct a tuple
+   |
+LL |     test((x.qux(), x.qux()));
+   |          +                +
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0061`.
diff --git a/tests/ui/tuple/wrong_argument_ice-3.rs b/tests/ui/tuple/wrong_argument_ice-3.rs
new file mode 100644
index 00000000000..96633180b57
--- /dev/null
+++ b/tests/ui/tuple/wrong_argument_ice-3.rs
@@ -0,0 +1,17 @@
+struct Process;
+
+pub type Group = (Vec<String>, Vec<Process>);
+
+fn test(process: &Process, groups: Vec<Group>) -> Vec<Group> {
+    let new_group = vec![String::new()];
+
+    if groups.capacity() == 0 {
+        groups.push(new_group, vec![process]);
+        //~^ ERROR this method takes 1 argument but 2 arguments were supplied
+        return groups;
+    }
+
+    todo!()
+}
+
+fn main() {}
diff --git a/tests/ui/tuple/wrong_argument_ice-3.stderr b/tests/ui/tuple/wrong_argument_ice-3.stderr
new file mode 100644
index 00000000000..0a503e1fe58
--- /dev/null
+++ b/tests/ui/tuple/wrong_argument_ice-3.stderr
@@ -0,0 +1,23 @@
+error[E0061]: this method takes 1 argument but 2 arguments were supplied
+  --> $DIR/wrong_argument_ice-3.rs:9:16
+   |
+LL |         groups.push(new_group, vec![process]);
+   |                ^^^^            ------------- argument of type `Vec<&Process>` unexpected
+   |
+note: expected tuple, found struct `Vec`
+  --> $DIR/wrong_argument_ice-3.rs:9:21
+   |
+LL |         groups.push(new_group, vec![process]);
+   |                     ^^^^^^^^^
+   = note: expected tuple `(Vec<String>, Vec<Process>)`
+             found struct `Vec<String>`
+note: associated function defined here
+  --> $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
+help: remove the extra argument
+   |
+LL |         groups.push(/* (Vec<String>, Vec<Process>) */);
+   |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0061`.
diff --git a/tests/ui/tuple/wrong_argument_ice-4.rs b/tests/ui/tuple/wrong_argument_ice-4.rs
new file mode 100644
index 00000000000..883d92dcce1
--- /dev/null
+++ b/tests/ui/tuple/wrong_argument_ice-4.rs
@@ -0,0 +1,6 @@
+fn main() {
+    (|| {})(|| {
+        //~^ ERROR function takes 0 arguments but 1 argument was supplied
+        let b = 1;
+    });
+}
diff --git a/tests/ui/tuple/wrong_argument_ice-4.stderr b/tests/ui/tuple/wrong_argument_ice-4.stderr
new file mode 100644
index 00000000000..a2686ab9440
--- /dev/null
+++ b/tests/ui/tuple/wrong_argument_ice-4.stderr
@@ -0,0 +1,23 @@
+error[E0057]: this function takes 0 arguments but 1 argument was supplied
+  --> $DIR/wrong_argument_ice-4.rs:2:5
+   |
+LL |       (|| {})(|| {
+   |  _____^^^^^^^_-
+LL | |
+LL | |         let b = 1;
+LL | |     });
+   | |_____- argument of type `[closure@$DIR/wrong_argument_ice-4.rs:2:13: 2:15]` unexpected
+   |
+note: closure defined here
+  --> $DIR/wrong_argument_ice-4.rs:2:6
+   |
+LL |     (|| {})(|| {
+   |      ^^
+help: remove the extra argument
+   |
+LL |     (|| {})();
+   |            ~~
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0057`.
diff --git a/tests/ui/tuple/wrong_argument_ice.rs b/tests/ui/tuple/wrong_argument_ice.rs
new file mode 100644
index 00000000000..b7e0225feb7
--- /dev/null
+++ b/tests/ui/tuple/wrong_argument_ice.rs
@@ -0,0 +1,17 @@
+use std::collections::VecDeque;
+
+pub struct BuildPlanBuilder {
+    acc: VecDeque<(String, String)>,
+    current_provides: String,
+    current_requires: String,
+}
+
+impl BuildPlanBuilder {
+    pub fn or(&mut self) -> &mut Self {
+        self.acc.push_back(self.current_provides, self.current_requires);
+        //~^ ERROR method takes 1 argument but 2 arguments were supplied
+        self
+    }
+}
+
+fn main() {}
diff --git a/tests/ui/tuple/wrong_argument_ice.stderr b/tests/ui/tuple/wrong_argument_ice.stderr
new file mode 100644
index 00000000000..f1b00ae0b92
--- /dev/null
+++ b/tests/ui/tuple/wrong_argument_ice.stderr
@@ -0,0 +1,16 @@
+error[E0061]: method takes 1 argument but 2 arguments were supplied
+  --> $DIR/wrong_argument_ice.rs:11:18
+   |
+LL |         self.acc.push_back(self.current_provides, self.current_requires);
+   |                  ^^^^^^^^^
+   |
+note: associated function defined here
+  --> $SRC_DIR/alloc/src/collections/vec_deque/mod.rs:LL:COL
+help: wrap these arguments in parentheses to construct a tuple
+   |
+LL |         self.acc.push_back((self.current_provides, self.current_requires));
+   |                            +                                            +
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0061`.