summary refs log tree commit diff
path: root/src/test/ui/parser
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2020-07-10 23:26:22 -0700
committerGitHub <noreply@github.com>2020-07-10 23:26:22 -0700
commitec1e7e9dbc83e57da7809cfc32c01e881b42555b (patch)
treeda8a4d60b718bf7f476ce2cfb875bc7dbaaee4e5 /src/test/ui/parser
parentdaecab3a784f28082df90cebb204998051f3557d (diff)
parent52bdaaa0edb2824af1610b67664f06580335fd78 (diff)
downloadrust-ec1e7e9dbc83e57da7809cfc32c01e881b42555b.tar.gz
rust-ec1e7e9dbc83e57da7809cfc32c01e881b42555b.zip
Rollup merge of #71322 - petrochenkov:tuple00, r=nikomatsakis
Accept tuple.0.0 as tuple indexing (take 2)

If we expect something identifier-like when parsing a field name after `.`, but encounter a float token, we break that float token into parts, similarly to how we break `&&` into `&` `&`, or `<<` into `<` `<`, etc.

An alternative to https://github.com/rust-lang/rust/pull/70420.
Diffstat (limited to 'src/test/ui/parser')
-rw-r--r--src/test/ui/parser/float-field-interpolated.rs17
-rw-r--r--src/test/ui/parser/float-field-interpolated.stderr46
-rw-r--r--src/test/ui/parser/float-field.rs62
-rw-r--r--src/test/ui/parser/float-field.stderr349
4 files changed, 474 insertions, 0 deletions
diff --git a/src/test/ui/parser/float-field-interpolated.rs b/src/test/ui/parser/float-field-interpolated.rs
new file mode 100644
index 00000000000..a3053203536
--- /dev/null
+++ b/src/test/ui/parser/float-field-interpolated.rs
@@ -0,0 +1,17 @@
+struct S(u8, (u8, u8));
+
+macro_rules! generate_field_accesses {
+    ($a:tt, $b:literal, $c:expr) => {
+        let s = S(0, (0, 0));
+
+        s.$a; // OK
+        { s.$b; } //~ ERROR unexpected token: `1.1`
+                  //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `1.1`
+        { s.$c; } //~ ERROR unexpected token: `1.1`
+                  //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `1.1`
+    };
+}
+
+fn main() {
+    generate_field_accesses!(1.1, 1.1, 1.1);
+}
diff --git a/src/test/ui/parser/float-field-interpolated.stderr b/src/test/ui/parser/float-field-interpolated.stderr
new file mode 100644
index 00000000000..fb974f085cb
--- /dev/null
+++ b/src/test/ui/parser/float-field-interpolated.stderr
@@ -0,0 +1,46 @@
+error: unexpected token: `1.1`
+  --> $DIR/float-field-interpolated.rs:8:13
+   |
+LL |         { s.$b; }
+   |             ^^
+...
+LL |     generate_field_accesses!(1.1, 1.1, 1.1);
+   |     ---------------------------------------- in this macro invocation
+   |
+   = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `1.1`
+  --> $DIR/float-field-interpolated.rs:8:13
+   |
+LL |         { s.$b; }
+   |             ^^ expected one of `.`, `;`, `?`, `}`, or an operator
+...
+LL |     generate_field_accesses!(1.1, 1.1, 1.1);
+   |     ---------------------------------------- in this macro invocation
+   |
+   = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: unexpected token: `1.1`
+  --> $DIR/float-field-interpolated.rs:10:13
+   |
+LL |         { s.$c; }
+   |             ^^
+...
+LL |     generate_field_accesses!(1.1, 1.1, 1.1);
+   |     ---------------------------------------- in this macro invocation
+   |
+   = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `1.1`
+  --> $DIR/float-field-interpolated.rs:10:13
+   |
+LL |         { s.$c; }
+   |             ^^ expected one of `.`, `;`, `?`, `}`, or an operator
+...
+LL |     generate_field_accesses!(1.1, 1.1, 1.1);
+   |     ---------------------------------------- in this macro invocation
+   |
+   = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to 4 previous errors
+
diff --git a/src/test/ui/parser/float-field.rs b/src/test/ui/parser/float-field.rs
new file mode 100644
index 00000000000..eaa7465dc4d
--- /dev/null
+++ b/src/test/ui/parser/float-field.rs
@@ -0,0 +1,62 @@
+struct S(u8, (u8, u8));
+
+fn main() {
+    let s = S(0, (0, 0));
+
+    s.1e1; //~ ERROR no field `1e1` on type `S`
+    s.1.; //~ ERROR unexpected token: `;`
+    s.1.1;
+    s.1.1e1; //~ ERROR no field `1e1` on type `(u8, u8)`
+    { s.1e+; } //~ ERROR unexpected token: `1e+`
+               //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `1e+`
+               //~| ERROR expected at least one digit in exponent
+    { s.1e-; } //~ ERROR unexpected token: `1e-`
+               //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `1e-`
+               //~| ERROR expected at least one digit in exponent
+    { s.1e+1; } //~ ERROR unexpected token: `1e+1`
+                //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `1e+1`
+    { s.1e-1; } //~ ERROR unexpected token: `1e-1`
+                //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `1e-1`
+    { s.1.1e+1; } //~ ERROR unexpected token: `1.1e+1`
+                  //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `1.1e+1`
+    { s.1.1e-1; } //~ ERROR unexpected token: `1.1e-1`
+                  //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `1.1e-1`
+    s.0x1e1;  //~ ERROR no field `0x1e1` on type `S`
+    s.0x1.; //~ ERROR no field `0x1` on type `S`
+            //~| ERROR hexadecimal float literal is not supported
+            //~| ERROR unexpected token: `;`
+    s.0x1.1; //~ ERROR no field `0x1` on type `S`
+             //~| ERROR hexadecimal float literal is not supported
+    s.0x1.1e1; //~ ERROR no field `0x1` on type `S`
+               //~| ERROR hexadecimal float literal is not supported
+    { s.0x1e+; } //~ ERROR expected expression, found `;`
+    { s.0x1e-; } //~ ERROR expected expression, found `;`
+    s.0x1e+1; //~ ERROR no field `0x1e` on type `S`
+    s.0x1e-1; //~ ERROR no field `0x1e` on type `S`
+    { s.0x1.1e+1; } //~ ERROR unexpected token: `0x1.1e+1`
+                    //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `0x1.1e+1`
+                    //~| ERROR hexadecimal float literal is not supported
+    { s.0x1.1e-1; } //~ ERROR unexpected token: `0x1.1e-1`
+                    //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `0x1.1e-1`
+                    //~| ERROR hexadecimal float literal is not supported
+    s.1e1f32; //~ ERROR no field `1e1` on type `S`
+              //~| ERROR suffixes on a tuple index are invalid
+    s.1.f32; //~ ERROR no field `f32` on type `(u8, u8)`
+    s.1.1f32; //~ ERROR suffixes on a tuple index are invalid
+    s.1.1e1f32; //~ ERROR no field `1e1` on type `(u8, u8)`
+                //~| ERROR suffixes on a tuple index are invalid
+    { s.1e+f32; } //~ ERROR unexpected token: `1e+f32`
+                  //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `1e+f32`
+                  //~| ERROR expected at least one digit in exponent
+    { s.1e-f32; } //~ ERROR unexpected token: `1e-f32`
+                  //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `1e-f32`
+                  //~| ERROR expected at least one digit in exponent
+    { s.1e+1f32; } //~ ERROR unexpected token: `1e+1f32`
+                   //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `1e+1f32`
+    { s.1e-1f32; } //~ ERROR unexpected token: `1e-1f32`
+                   //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `1e-1f32`
+    { s.1.1e+1f32; } //~ ERROR unexpected token: `1.1e+1f32`
+                    //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `1.1e+1f32`
+    { s.1.1e-1f32; } //~ ERROR unexpected token: `1.1e-1f32`
+                    //~| ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `1.1e-1f32`
+}
diff --git a/src/test/ui/parser/float-field.stderr b/src/test/ui/parser/float-field.stderr
new file mode 100644
index 00000000000..62202b99964
--- /dev/null
+++ b/src/test/ui/parser/float-field.stderr
@@ -0,0 +1,349 @@
+error: expected at least one digit in exponent
+  --> $DIR/float-field.rs:10:9
+   |
+LL |     { s.1e+; }
+   |         ^^^
+
+error: expected at least one digit in exponent
+  --> $DIR/float-field.rs:13:9
+   |
+LL |     { s.1e-; }
+   |         ^^^
+
+error: hexadecimal float literal is not supported
+  --> $DIR/float-field.rs:25:7
+   |
+LL |     s.0x1.;
+   |       ^^^^
+
+error: hexadecimal float literal is not supported
+  --> $DIR/float-field.rs:28:7
+   |
+LL |     s.0x1.1;
+   |       ^^^^^
+
+error: hexadecimal float literal is not supported
+  --> $DIR/float-field.rs:30:7
+   |
+LL |     s.0x1.1e1;
+   |       ^^^^^^^
+
+error: hexadecimal float literal is not supported
+  --> $DIR/float-field.rs:36:9
+   |
+LL |     { s.0x1.1e+1; }
+   |         ^^^^^^^^
+
+error: hexadecimal float literal is not supported
+  --> $DIR/float-field.rs:39:9
+   |
+LL |     { s.0x1.1e-1; }
+   |         ^^^^^^^^
+
+error: expected at least one digit in exponent
+  --> $DIR/float-field.rs:48:9
+   |
+LL |     { s.1e+f32; }
+   |         ^^^^^^
+
+error: expected at least one digit in exponent
+  --> $DIR/float-field.rs:51:9
+   |
+LL |     { s.1e-f32; }
+   |         ^^^^^^
+
+error: unexpected token: `;`
+  --> $DIR/float-field.rs:7:9
+   |
+LL |     s.1.;
+   |         ^
+
+error: unexpected token: `1e+`
+  --> $DIR/float-field.rs:10:9
+   |
+LL |     { s.1e+; }
+   |         ^^^
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `1e+`
+  --> $DIR/float-field.rs:10:9
+   |
+LL |     { s.1e+; }
+   |         ^^^ expected one of `.`, `;`, `?`, `}`, or an operator
+
+error: unexpected token: `1e-`
+  --> $DIR/float-field.rs:13:9
+   |
+LL |     { s.1e-; }
+   |         ^^^
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `1e-`
+  --> $DIR/float-field.rs:13:9
+   |
+LL |     { s.1e-; }
+   |         ^^^ expected one of `.`, `;`, `?`, `}`, or an operator
+
+error: unexpected token: `1e+1`
+  --> $DIR/float-field.rs:16:9
+   |
+LL |     { s.1e+1; }
+   |         ^^^^
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `1e+1`
+  --> $DIR/float-field.rs:16:9
+   |
+LL |     { s.1e+1; }
+   |         ^^^^ expected one of `.`, `;`, `?`, `}`, or an operator
+
+error: unexpected token: `1e-1`
+  --> $DIR/float-field.rs:18:9
+   |
+LL |     { s.1e-1; }
+   |         ^^^^
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `1e-1`
+  --> $DIR/float-field.rs:18:9
+   |
+LL |     { s.1e-1; }
+   |         ^^^^ expected one of `.`, `;`, `?`, `}`, or an operator
+
+error: unexpected token: `1.1e+1`
+  --> $DIR/float-field.rs:20:9
+   |
+LL |     { s.1.1e+1; }
+   |         ^^^^^^
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `1.1e+1`
+  --> $DIR/float-field.rs:20:9
+   |
+LL |     { s.1.1e+1; }
+   |         ^^^^^^ expected one of `.`, `;`, `?`, `}`, or an operator
+
+error: unexpected token: `1.1e-1`
+  --> $DIR/float-field.rs:22:9
+   |
+LL |     { s.1.1e-1; }
+   |         ^^^^^^
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `1.1e-1`
+  --> $DIR/float-field.rs:22:9
+   |
+LL |     { s.1.1e-1; }
+   |         ^^^^^^ expected one of `.`, `;`, `?`, `}`, or an operator
+
+error: unexpected token: `;`
+  --> $DIR/float-field.rs:25:11
+   |
+LL |     s.0x1.;
+   |           ^
+
+error: expected expression, found `;`
+  --> $DIR/float-field.rs:32:14
+   |
+LL |     { s.0x1e+; }
+   |              ^ expected expression
+
+error: expected expression, found `;`
+  --> $DIR/float-field.rs:33:14
+   |
+LL |     { s.0x1e-; }
+   |              ^ expected expression
+
+error: unexpected token: `0x1.1e+1`
+  --> $DIR/float-field.rs:36:9
+   |
+LL |     { s.0x1.1e+1; }
+   |         ^^^^^^^^
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `0x1.1e+1`
+  --> $DIR/float-field.rs:36:9
+   |
+LL |     { s.0x1.1e+1; }
+   |         ^^^^^^^^ expected one of `.`, `;`, `?`, `}`, or an operator
+
+error: unexpected token: `0x1.1e-1`
+  --> $DIR/float-field.rs:39:9
+   |
+LL |     { s.0x1.1e-1; }
+   |         ^^^^^^^^
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `0x1.1e-1`
+  --> $DIR/float-field.rs:39:9
+   |
+LL |     { s.0x1.1e-1; }
+   |         ^^^^^^^^ expected one of `.`, `;`, `?`, `}`, or an operator
+
+error: suffixes on a tuple index are invalid
+  --> $DIR/float-field.rs:42:7
+   |
+LL |     s.1e1f32;
+   |       ^^^^^^ invalid suffix `f32`
+
+error: suffixes on a tuple index are invalid
+  --> $DIR/float-field.rs:45:7
+   |
+LL |     s.1.1f32;
+   |       ^^^^^^ invalid suffix `f32`
+
+error: suffixes on a tuple index are invalid
+  --> $DIR/float-field.rs:46:7
+   |
+LL |     s.1.1e1f32;
+   |       ^^^^^^^^ invalid suffix `f32`
+
+error: unexpected token: `1e+f32`
+  --> $DIR/float-field.rs:48:9
+   |
+LL |     { s.1e+f32; }
+   |         ^^^^^^
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `1e+f32`
+  --> $DIR/float-field.rs:48:9
+   |
+LL |     { s.1e+f32; }
+   |         ^^^^^^ expected one of `.`, `;`, `?`, `}`, or an operator
+
+error: unexpected token: `1e-f32`
+  --> $DIR/float-field.rs:51:9
+   |
+LL |     { s.1e-f32; }
+   |         ^^^^^^
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `1e-f32`
+  --> $DIR/float-field.rs:51:9
+   |
+LL |     { s.1e-f32; }
+   |         ^^^^^^ expected one of `.`, `;`, `?`, `}`, or an operator
+
+error: unexpected token: `1e+1f32`
+  --> $DIR/float-field.rs:54:9
+   |
+LL |     { s.1e+1f32; }
+   |         ^^^^^^^
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `1e+1f32`
+  --> $DIR/float-field.rs:54:9
+   |
+LL |     { s.1e+1f32; }
+   |         ^^^^^^^ expected one of `.`, `;`, `?`, `}`, or an operator
+
+error: unexpected token: `1e-1f32`
+  --> $DIR/float-field.rs:56:9
+   |
+LL |     { s.1e-1f32; }
+   |         ^^^^^^^
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `1e-1f32`
+  --> $DIR/float-field.rs:56:9
+   |
+LL |     { s.1e-1f32; }
+   |         ^^^^^^^ expected one of `.`, `;`, `?`, `}`, or an operator
+
+error: unexpected token: `1.1e+1f32`
+  --> $DIR/float-field.rs:58:9
+   |
+LL |     { s.1.1e+1f32; }
+   |         ^^^^^^^^^
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `1.1e+1f32`
+  --> $DIR/float-field.rs:58:9
+   |
+LL |     { s.1.1e+1f32; }
+   |         ^^^^^^^^^ expected one of `.`, `;`, `?`, `}`, or an operator
+
+error: unexpected token: `1.1e-1f32`
+  --> $DIR/float-field.rs:60:9
+   |
+LL |     { s.1.1e-1f32; }
+   |         ^^^^^^^^^
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `1.1e-1f32`
+  --> $DIR/float-field.rs:60:9
+   |
+LL |     { s.1.1e-1f32; }
+   |         ^^^^^^^^^ expected one of `.`, `;`, `?`, `}`, or an operator
+
+error[E0609]: no field `1e1` on type `S`
+  --> $DIR/float-field.rs:6:7
+   |
+LL |     s.1e1;
+   |       ^^^ unknown field
+   |
+   = note: available fields are: `0`, `1`
+
+error[E0609]: no field `1e1` on type `(u8, u8)`
+  --> $DIR/float-field.rs:9:7
+   |
+LL |     s.1.1e1;
+   |       ^^^^^
+
+error[E0609]: no field `0x1e1` on type `S`
+  --> $DIR/float-field.rs:24:7
+   |
+LL |     s.0x1e1;
+   |       ^^^^^ unknown field
+   |
+   = note: available fields are: `0`, `1`
+
+error[E0609]: no field `0x1` on type `S`
+  --> $DIR/float-field.rs:25:7
+   |
+LL |     s.0x1.;
+   |       ^^^^ unknown field
+   |
+   = note: available fields are: `0`, `1`
+
+error[E0609]: no field `0x1` on type `S`
+  --> $DIR/float-field.rs:28:7
+   |
+LL |     s.0x1.1;
+   |       ^^^^^ unknown field
+   |
+   = note: available fields are: `0`, `1`
+
+error[E0609]: no field `0x1` on type `S`
+  --> $DIR/float-field.rs:30:7
+   |
+LL |     s.0x1.1e1;
+   |       ^^^^^^^ unknown field
+   |
+   = note: available fields are: `0`, `1`
+
+error[E0609]: no field `0x1e` on type `S`
+  --> $DIR/float-field.rs:34:7
+   |
+LL |     s.0x1e+1;
+   |       ^^^^ unknown field
+   |
+   = note: available fields are: `0`, `1`
+
+error[E0609]: no field `0x1e` on type `S`
+  --> $DIR/float-field.rs:35:7
+   |
+LL |     s.0x1e-1;
+   |       ^^^^ unknown field
+   |
+   = note: available fields are: `0`, `1`
+
+error[E0609]: no field `1e1` on type `S`
+  --> $DIR/float-field.rs:42:7
+   |
+LL |     s.1e1f32;
+   |       ^^^^^^ unknown field
+   |
+   = note: available fields are: `0`, `1`
+
+error[E0609]: no field `f32` on type `(u8, u8)`
+  --> $DIR/float-field.rs:44:9
+   |
+LL |     s.1.f32;
+   |         ^^^
+
+error[E0609]: no field `1e1` on type `(u8, u8)`
+  --> $DIR/float-field.rs:46:7
+   |
+LL |     s.1.1e1f32;
+   |       ^^^^^^^^
+
+error: aborting due to 55 previous errors
+
+For more information about this error, try `rustc --explain E0609`.