parser: `expression evaluated but not used` error

pull/5394/head
yuyi 2020-06-16 17:06:53 +08:00 committed by GitHub
parent f2d9fa3815
commit 2daf915371
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
89 changed files with 219 additions and 172 deletions

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/add_op_wrong_left_type_err_a.v:3:5: error: mismatched types `Aaa` and `any_int` vlib/v/checker/tests/add_op_wrong_left_type_err_a.v:3:13: error: mismatched types `Aaa` and `any_int`
1 | struct Aaa{} 1 | struct Aaa{}
2 | fn main() { 2 | fn main() {
3 | Aaa{} + 10 3 | println(Aaa{} + 10)
| ~~~~~ | ~~~~~
4 | } 4 | }

View File

@ -1,4 +1,4 @@
struct Aaa{} struct Aaa{}
fn main() { fn main() {
Aaa{} + 10 println(Aaa{} + 10)
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/add_op_wrong_left_type_err_b.v:2:5: error: mismatched types `array_int` and `any_int` vlib/v/checker/tests/add_op_wrong_left_type_err_b.v:2:13: error: mismatched types `array_int` and `any_int`
1 | fn main() { 1 | fn main() {
2 | [1,2,3] + 10 2 | println([1,2,3] + 10)
| ~~~~~~~ | ~~~~~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
[1,2,3] + 10 println([1,2,3] + 10)
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/add_op_wrong_left_type_err_c.v:3:5: error: mismatched types `map_string_int` and `any_int` vlib/v/checker/tests/add_op_wrong_left_type_err_c.v:3:13: error: mismatched types `map_string_int` and `any_int`
1 | fn main() { 1 | fn main() {
2 | a := map[string]int 2 | a := map[string]int
3 | a + 10 3 | println(a + 10)
| ^ | ^
4 | } 4 | }

View File

@ -1,4 +1,4 @@
fn main() { fn main() {
a := map[string]int a := map[string]int
a + 10 println(a + 10)
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/add_op_wrong_right_type_err_a.v:3:10: error: mismatched types `any_int` and `Aaa` vlib/v/checker/tests/add_op_wrong_right_type_err_a.v:3:18: error: mismatched types `any_int` and `Aaa`
1 | struct Aaa{} 1 | struct Aaa{}
2 | fn main() { 2 | fn main() {
3 | 10 + Aaa{} 3 | println(10 + Aaa{})
| ~~~~~ | ~~~~~
4 | } 4 | }

View File

@ -1,4 +1,4 @@
struct Aaa{} struct Aaa{}
fn main() { fn main() {
10 + Aaa{} println(10 + Aaa{})
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/add_op_wrong_right_type_err_b.v:2:10: error: mismatched types `any_int` and `array_int` vlib/v/checker/tests/add_op_wrong_right_type_err_b.v:2:18: error: mismatched types `any_int` and `array_int`
1 | fn main() { 1 | fn main() {
2 | 10 + [1,2,3] 2 | println(10 + [1,2,3])
| ~~~~~~~ | ~~~~~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
10 + [1,2,3] println(10 + [1,2,3])
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/add_op_wrong_right_type_err_c.v:3:10: error: mismatched types `any_int` and `map_string_int` vlib/v/checker/tests/add_op_wrong_right_type_err_c.v:3:18: error: mismatched types `any_int` and `map_string_int`
1 | fn main() { 1 | fn main() {
2 | a := map[string]int 2 | a := map[string]int
3 | 10 + a 3 | println(10 + a)
| ^ | ^
4 | } 4 | }

View File

@ -1,4 +1,4 @@
fn main() { fn main() {
a := map[string]int a := map[string]int
10 + a println(10 + a)
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/bit_op_wrong_left_type_err.v:2:2: error: left type of `&` cannot be non-integer type any_float vlib/v/checker/tests/bit_op_wrong_left_type_err.v:2:10: error: left type of `&` cannot be non-integer type any_float
1 | fn main() { 1 | fn main() {
2 | 0.5 & 1 2 | println(0.5 & 1)
| ~~~ | ~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
0.5 & 1 println(0.5 & 1)
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/bit_op_wrong_right_type_err.v:2:6: error: right type of `|` cannot be non-integer type any_float vlib/v/checker/tests/bit_op_wrong_right_type_err.v:2:14: error: right type of `|` cannot be non-integer type any_float
1 | fn main() { 1 | fn main() {
2 | 1 | 0.5 2 | println(1 | 0.5)
| ~~~ | ~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
1 | 0.5 println(1 | 0.5)
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/div_op_wrong_left_type_err_a.v:3:5: error: mismatched types `Aaa` and `any_int` vlib/v/checker/tests/div_op_wrong_left_type_err_a.v:3:13: error: mismatched types `Aaa` and `any_int`
1 | struct Aaa{} 1 | struct Aaa{}
2 | fn main() { 2 | fn main() {
3 | Aaa{} / 10 3 | println(Aaa{} / 10)
| ~~~~~ | ~~~~~
4 | } 4 | }

View File

@ -1,4 +1,4 @@
struct Aaa{} struct Aaa{}
fn main() { fn main() {
Aaa{} / 10 println(Aaa{} / 10)
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/div_op_wrong_left_type_err_b.v:2:5: error: mismatched types `array_int` and `any_int` vlib/v/checker/tests/div_op_wrong_left_type_err_b.v:2:13: error: mismatched types `array_int` and `any_int`
1 | fn main() { 1 | fn main() {
2 | [1,2,3] / 10 2 | println([1,2,3] / 10)
| ~~~~~~~ | ~~~~~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
[1,2,3] / 10 println([1,2,3] / 10)
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/div_op_wrong_left_type_err_c.v:3:5: error: mismatched types `map_string_int` and `any_int` vlib/v/checker/tests/div_op_wrong_left_type_err_c.v:3:13: error: mismatched types `map_string_int` and `any_int`
1 | fn main() { 1 | fn main() {
2 | a := map[string]int 2 | a := map[string]int
3 | a / 10 3 | println(a / 10)
| ^ | ^
4 | } 4 | }

View File

@ -1,4 +1,4 @@
fn main() { fn main() {
a := map[string]int a := map[string]int
a / 10 println(a / 10)
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/div_op_wrong_right_type_err_a.v:3:10: error: mismatched types `any_int` and `Aaa` vlib/v/checker/tests/div_op_wrong_right_type_err_a.v:3:18: error: mismatched types `any_int` and `Aaa`
1 | struct Aaa{} 1 | struct Aaa{}
2 | fn main() { 2 | fn main() {
3 | 10 / Aaa{} 3 | println(10 / Aaa{})
| ~~~~~ | ~~~~~
4 | } 4 | }

View File

@ -1,4 +1,4 @@
struct Aaa{} struct Aaa{}
fn main() { fn main() {
10 / Aaa{} println(10 / Aaa{})
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/div_op_wrong_right_type_err_b.v:2:10: error: mismatched types `any_int` and `array_int` vlib/v/checker/tests/div_op_wrong_right_type_err_b.v:2:18: error: mismatched types `any_int` and `array_int`
1 | fn main() { 1 | fn main() {
2 | 10 / [1,2,3] 2 | println(10 / [1,2,3])
| ~~~~~~~ | ~~~~~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
10 / [1,2,3] println(10 / [1,2,3])
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/div_op_wrong_right_type_err_c.v:3:10: error: mismatched types `any_int` and `map_string_int` vlib/v/checker/tests/div_op_wrong_right_type_err_c.v:3:18: error: mismatched types `any_int` and `map_string_int`
1 | fn main() { 1 | fn main() {
2 | a := map[string]int 2 | a := map[string]int
3 | 10 / a 3 | println(10 / a)
| ^ | ^
4 | } 4 | }

View File

@ -1,4 +1,4 @@
fn main() { fn main() {
a := map[string]int a := map[string]int
10 / a println(10 / a)
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/minus_op_wrong_left_type_err_a.v:3:5: error: mismatched types `Aaa` and `any_int` vlib/v/checker/tests/minus_op_wrong_left_type_err_a.v:3:13: error: mismatched types `Aaa` and `any_int`
1 | struct Aaa{} 1 | struct Aaa{}
2 | fn main() { 2 | fn main() {
3 | Aaa{} - 10 3 | println(Aaa{} - 10)
| ~~~~~ | ~~~~~
4 | } 4 | }

View File

@ -1,4 +1,4 @@
struct Aaa{} struct Aaa{}
fn main() { fn main() {
Aaa{} - 10 println(Aaa{} - 10)
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/minus_op_wrong_left_type_err_b.v:2:5: error: mismatched types `array_int` and `any_int` vlib/v/checker/tests/minus_op_wrong_left_type_err_b.v:2:13: error: mismatched types `array_int` and `any_int`
1 | fn main() { 1 | fn main() {
2 | [1,2,3] - 10 2 | println([1,2,3] - 10)
| ~~~~~~~ | ~~~~~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
[1,2,3] - 10 println([1,2,3] - 10)
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/minus_op_wrong_left_type_err_c.v:3:5: error: mismatched types `map_string_int` and `any_int` vlib/v/checker/tests/minus_op_wrong_left_type_err_c.v:3:13: error: mismatched types `map_string_int` and `any_int`
1 | fn main() { 1 | fn main() {
2 | a := map[string]int 2 | a := map[string]int
3 | a - 10 3 | println(a - 10)
| ^ | ^
4 | } 4 | }

View File

@ -1,4 +1,4 @@
fn main() { fn main() {
a := map[string]int a := map[string]int
a - 10 println(a - 10)
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/minus_op_wrong_right_type_err_a.v:3:10: error: mismatched types `any_int` and `Aaa` vlib/v/checker/tests/minus_op_wrong_right_type_err_a.v:3:18: error: mismatched types `any_int` and `Aaa`
1 | struct Aaa{} 1 | struct Aaa{}
2 | fn main() { 2 | fn main() {
3 | 10 - Aaa{} 3 | println(10 - Aaa{})
| ~~~~~ | ~~~~~
4 | } 4 | }

View File

@ -1,4 +1,4 @@
struct Aaa{} struct Aaa{}
fn main() { fn main() {
10 - Aaa{} println(10 - Aaa{})
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/minus_op_wrong_right_type_err_b.v:2:10: error: mismatched types `any_int` and `array_int` vlib/v/checker/tests/minus_op_wrong_right_type_err_b.v:2:18: error: mismatched types `any_int` and `array_int`
1 | fn main() { 1 | fn main() {
2 | 10 - [1,2,3] 2 | println(10 - [1,2,3])
| ~~~~~~~ | ~~~~~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
10 - [1,2,3] println(10 - [1,2,3])
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/minus_op_wrong_right_type_err_c.v:3:10: error: mismatched types `any_int` and `map_string_int` vlib/v/checker/tests/minus_op_wrong_right_type_err_c.v:3:18: error: mismatched types `any_int` and `map_string_int`
1 | fn main() { 1 | fn main() {
2 | a := map[string]int 2 | a := map[string]int
3 | 10 - a 3 | println(10 - a)
| ^ | ^
4 | } 4 | }

View File

@ -1,4 +1,4 @@
fn main() { fn main() {
a := map[string]int a := map[string]int
10 - a println(10 - a)
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/mod_op_wrong_left_type_err_a.v:2:2: error: float modulo not allowed, use math.fmod() instead vlib/v/checker/tests/mod_op_wrong_left_type_err_a.v:2:10: error: float modulo not allowed, use math.fmod() instead
1 | fn main() { 1 | fn main() {
2 | 0.5 % 1 2 | println(0.5 % 1)
| ~~~ | ~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
0.5 % 1 println(0.5 % 1)
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/mod_op_wrong_left_type_err_b.v:2:2: error: mismatched types `array_int` and `any_int` vlib/v/checker/tests/mod_op_wrong_left_type_err_b.v:2:10: error: mismatched types `array_int` and `any_int`
1 | fn main() { 1 | fn main() {
2 | [1,2,3] % 1 2 | println([1,2,3] % 1)
| ~~~~~~~ | ~~~~~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
[1,2,3] % 1 println([1,2,3] % 1)
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/mod_op_wrong_left_type_err_c.v:4:2: error: mismatched types `Aaa` and `any_int` vlib/v/checker/tests/mod_op_wrong_left_type_err_c.v:4:10: error: mismatched types `Aaa` and `any_int`
2 | fn main() { 2 | fn main() {
3 | a := Aaa{} 3 | a := Aaa{}
4 | a % 1 4 | println(a % 1)
| ^ | ^
5 | } 5 | }

View File

@ -1,5 +1,5 @@
struct Aaa{} struct Aaa{}
fn main() { fn main() {
a := Aaa{} a := Aaa{}
a % 1 println(a % 1)
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/mod_op_wrong_left_type_err_d.v:3:2: error: mismatched types `map_string_int` and `any_int` vlib/v/checker/tests/mod_op_wrong_left_type_err_d.v:3:10: error: mismatched types `map_string_int` and `any_int`
1 | fn main() { 1 | fn main() {
2 | a := map[string]int 2 | a := map[string]int
3 | a % 1 3 | println(a % 1)
| ^ | ^
4 | } 4 | }

View File

@ -1,4 +1,4 @@
fn main() { fn main() {
a := map[string]int a := map[string]int
a % 1 println(a % 1)
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/mod_op_wrong_right_type_err_a.v:2:6: error: float modulo not allowed, use math.fmod() instead vlib/v/checker/tests/mod_op_wrong_right_type_err_a.v:2:14: error: float modulo not allowed, use math.fmod() instead
1 | fn main() { 1 | fn main() {
2 | 1 % 0.5 2 | println(1 % 0.5)
| ~~~ | ~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
1 % 0.5 println(1 % 0.5)
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/mod_op_wrong_right_type_err_b.v:2:6: error: mismatched types `any_int` and `array_int` vlib/v/checker/tests/mod_op_wrong_right_type_err_b.v:2:14: error: mismatched types `any_int` and `array_int`
1 | fn main() { 1 | fn main() {
2 | 1 % [1,2,3] 2 | println(1 % [1,2,3])
| ~~~~~~~ | ~~~~~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
1 % [1,2,3] println(1 % [1,2,3])
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/mod_op_wrong_right_type_err_c.v:4:6: error: mismatched types `any_int` and `Aaa` vlib/v/checker/tests/mod_op_wrong_right_type_err_c.v:4:14: error: mismatched types `any_int` and `Aaa`
2 | fn main() { 2 | fn main() {
3 | a := Aaa{} 3 | a := Aaa{}
4 | 1 % a 4 | println(1 % a)
| ^ | ^
5 | } 5 | }

View File

@ -1,5 +1,5 @@
struct Aaa{} struct Aaa{}
fn main() { fn main() {
a := Aaa{} a := Aaa{}
1 % a println(1 % a)
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/mod_op_wrong_right_type_err_d.v:3:6: error: mismatched types `any_int` and `map_string_int` vlib/v/checker/tests/mod_op_wrong_right_type_err_d.v:3:14: error: mismatched types `any_int` and `map_string_int`
1 | fn main() { 1 | fn main() {
2 | a := map[string]int 2 | a := map[string]int
3 | 1 % a 3 | println(1 % a)
| ^ | ^
4 | } 4 | }

View File

@ -1,4 +1,4 @@
fn main() { fn main() {
a := map[string]int a := map[string]int
1 % a println(1 % a)
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/mul_op_wrong_left_type_err_a.v:3:5: error: mismatched types `Aaa` and `any_int` vlib/v/checker/tests/mul_op_wrong_left_type_err_a.v:3:13: error: mismatched types `Aaa` and `any_int`
1 | struct Aaa{} 1 | struct Aaa{}
2 | fn main() { 2 | fn main() {
3 | Aaa{} * 10 3 | println(Aaa{} * 10)
| ~~~~~ | ~~~~~
4 | } 4 | }

View File

@ -1,4 +1,4 @@
struct Aaa{} struct Aaa{}
fn main() { fn main() {
Aaa{} * 10 println(Aaa{} * 10)
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/mul_op_wrong_left_type_err_b.v:2:5: error: mismatched types `array_int` and `any_int` vlib/v/checker/tests/mul_op_wrong_left_type_err_b.v:2:13: error: mismatched types `array_int` and `any_int`
1 | fn main() { 1 | fn main() {
2 | [1,2,3] * 10 2 | println([1,2,3] * 10)
| ~~~~~~~ | ~~~~~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
[1,2,3] * 10 println([1,2,3] * 10)
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/mul_op_wrong_left_type_err_c.v:3:5: error: mismatched types `map_string_int` and `any_int` vlib/v/checker/tests/mul_op_wrong_left_type_err_c.v:3:13: error: mismatched types `map_string_int` and `any_int`
1 | fn main() { 1 | fn main() {
2 | a := map[string]int 2 | a := map[string]int
3 | a * 10 3 | println(a * 10)
| ^ | ^
4 | } 4 | }

View File

@ -1,4 +1,4 @@
fn main() { fn main() {
a := map[string]int a := map[string]int
a * 10 println(a * 10)
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/mul_op_wrong_right_type_err_a.v:3:10: error: mismatched types `any_int` and `Aaa` vlib/v/checker/tests/mul_op_wrong_right_type_err_a.v:3:18: error: mismatched types `any_int` and `Aaa`
1 | struct Aaa{} 1 | struct Aaa{}
2 | fn main() { 2 | fn main() {
3 | 10 * Aaa{} 3 | println(10 * Aaa{})
| ~~~~~ | ~~~~~
4 | } 4 | }

View File

@ -1,4 +1,4 @@
struct Aaa{} struct Aaa{}
fn main() { fn main() {
10 * Aaa{} println(10 * Aaa{})
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/mul_op_wrong_right_type_err_b.v:2:10: error: mismatched types `any_int` and `array_int` vlib/v/checker/tests/mul_op_wrong_right_type_err_b.v:2:18: error: mismatched types `any_int` and `array_int`
1 | fn main() { 1 | fn main() {
2 | 10 * [1,2,3] 2 | println(10 * [1,2,3])
| ~~~~~~~ | ~~~~~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
10 * [1,2,3] println(10 * [1,2,3])
} }

View File

@ -1,6 +1,6 @@
vlib/v/checker/tests/mul_op_wrong_right_type_err_c.v:3:10: error: mismatched types `any_int` and `map_string_int` vlib/v/checker/tests/mul_op_wrong_right_type_err_c.v:3:18: error: mismatched types `any_int` and `map_string_int`
1 | fn main() { 1 | fn main() {
2 | a := map[string]int 2 | a := map[string]int
3 | 10 * a 3 | println(10 * a)
| ^ | ^
4 | } 4 | }

View File

@ -1,4 +1,4 @@
fn main() { fn main() {
a := map[string]int a := map[string]int
10 * a println(10 * a)
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/rshift_op_wrong_left_type_err.v:2:2: error: cannot shift type any_int into non-integer type any_float vlib/v/checker/tests/rshift_op_wrong_left_type_err.v:2:10: error: cannot shift type any_int into non-integer type any_float
1 | fn main() { 1 | fn main() {
2 | 0.5 >> 1 2 | println(0.5 >> 1)
| ~~~ | ~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
0.5 >> 1 println(0.5 >> 1)
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/rshift_op_wrong_right_type_err.v:2:7: error: cannot shift non-integer type any_float into type any_int vlib/v/checker/tests/rshift_op_wrong_right_type_err.v:2:15: error: cannot shift non-integer type any_float into type any_int
1 | fn main() { 1 | fn main() {
2 | 1 >> 0.5 2 | println(1 >> 0.5)
| ~~~ | ~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
1 >> 0.5 println(1 >> 0.5)
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/shift_op_wrong_left_type_err.v:2:2: error: cannot shift type any_int into non-integer type any_float vlib/v/checker/tests/shift_op_wrong_left_type_err.v:2:10: error: cannot shift type any_int into non-integer type any_float
1 | fn main() { 1 | fn main() {
2 | 0.5 << 1 2 | println(0.5 << 1)
| ~~~ | ~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
0.5 << 1 println(0.5 << 1)
} }

View File

@ -1,5 +1,5 @@
vlib/v/checker/tests/shift_op_wrong_right_type_err.v:2:7: error: cannot shift non-integer type any_float into type any_int vlib/v/checker/tests/shift_op_wrong_right_type_err.v:2:15: error: cannot shift non-integer type any_float into type any_int
1 | fn main() { 1 | fn main() {
2 | 1 << 0.5 2 | println(1 << 0.5)
| ~~~ | ~~~
3 | } 3 | }

View File

@ -1,3 +1,3 @@
fn main() { fn main() {
1 << 0.5 println(1 << 0.5)
} }

View File

@ -1,3 +1,3 @@
fn char_backtick() { fn char_backtick() {
`\`` println(`\``)
} }

View File

@ -50,7 +50,7 @@ fn (f Foo) fn_with_optional() ?int {
return 40 return 40
} }
fn mut_array(a mut []int) { fn mut_array(mut a []int) {
println(1) println(1)
} }

View File

@ -1,11 +1,11 @@
fn main() { fn main() {
'Hello world !' println('Hello world !')
'This is correct !' println('This is correct !')
"It's okay" println("It's okay")
'This is "too"' println('This is "too"')
// TODO // TODO
// 'I\'m not correctly formatted' => "I'm not correctly formatted" // 'I\'m not correctly formatted' => "I'm not correctly formatted"
// "\"Everything on the internet is true\" - Albert Einstein, 1965" => '"Everything on the internet is true" - Albert Einstein, 1965' // "\"Everything on the internet is true\" - Albert Einstein, 1965" => '"Everything on the internet is true" - Albert Einstein, 1965'
'I\'m out of idea "_"' println('I\'m out of idea "_"')
// "Definitely out \":'(\"" => 'Definitely out ":\'("' // "Definitely out \":'(\"" => 'Definitely out ":\'("'
} }

View File

@ -1,11 +1,11 @@
fn main() { fn main() {
"Hello world !" println("Hello world !")
'This is correct !' println('This is correct !')
"It's okay" println("It's okay")
'This is "too"' println('This is "too"')
// TODO // TODO
// 'I\'m not correctly formatted' => "I'm not correctly formatted" // 'I\'m not correctly formatted' => "I'm not correctly formatted"
// "\"Everything on the internet is true\" - Albert Einstein, 1965" => '"Everything on the internet is true" - Albert Einstein, 1965' // "\"Everything on the internet is true\" - Albert Einstein, 1965" => '"Everything on the internet is true" - Albert Einstein, 1965'
'I\'m out of idea "_"' println('I\'m out of idea "_"')
// "Definitely out \":'(\"" => 'Definitely out ":\'("' // "Definitely out \":'(\"" => 'Definitely out ":\'("'
} }

View File

@ -73,7 +73,7 @@ pub fn parse_stmt(text string, table &table.Table, scope &ast.Scope) ast.Stmt {
} }
p.init_parse_fns() p.init_parse_fns()
p.read_first_token() p.read_first_token()
return p.stmt() return p.stmt(false)
} }
pub fn parse_text(text string, b_table &table.Table, pref &pref.Preferences, scope, global_scope &ast.Scope) ast.File { pub fn parse_text(text string, b_table &table.Table, pref &pref.Preferences, scope, global_scope &ast.Scope) ast.File {
@ -317,7 +317,7 @@ pub fn (mut p Parser) parse_block_no_scope(is_top_level bool) []ast.Stmt {
mut stmts := []ast.Stmt{} mut stmts := []ast.Stmt{}
if p.tok.kind != .rcbr { if p.tok.kind != .rcbr {
for { for {
stmts << p.stmt() stmts << p.stmt(is_top_level)
// p.warn('after stmt(): tok=$p.tok.str()') // p.warn('after stmt(): tok=$p.tok.str()')
if p.tok.kind in [.eof, .rcbr] { if p.tok.kind in [.eof, .rcbr] {
break break
@ -464,7 +464,7 @@ pub fn (mut p Parser) top_stmt() ast.Stmt {
if p.pref.is_script && !p.pref.is_test { if p.pref.is_script && !p.pref.is_test {
mut stmts := []ast.Stmt{} mut stmts := []ast.Stmt{}
for p.tok.kind != .eof { for p.tok.kind != .eof {
stmts << p.stmt() stmts << p.stmt(false)
} }
return ast.FnDecl{ return ast.FnDecl{
name: 'main' name: 'main'
@ -500,7 +500,7 @@ pub fn (mut p Parser) comment() ast.Comment {
} }
} }
pub fn (mut p Parser) stmt() ast.Stmt { pub fn (mut p Parser) stmt(is_top_level bool) ast.Stmt {
p.is_stmt_ident = p.tok.kind == .name p.is_stmt_ident = p.tok.kind == .name
match p.tok.kind { match p.tok.kind {
.lcbr { .lcbr {
@ -530,7 +530,7 @@ pub fn (mut p Parser) stmt() ast.Stmt {
return p.assign_stmt() return p.assign_stmt()
} else if p.peek_tok.kind == .comma { } else if p.peek_tok.kind == .comma {
// `a, b ...` // `a, b ...`
return p.parse_multi_expr() return p.parse_multi_expr(is_top_level)
} else if p.peek_tok.kind == .colon { } else if p.peek_tok.kind == .colon {
// `label:` // `label:`
name := p.check_name() name := p.check_name()
@ -544,7 +544,7 @@ pub fn (mut p Parser) stmt() ast.Stmt {
[.rcbr, .eof] { [.rcbr, .eof] {
p.error_with_pos('`$p.tok.lit` evaluated but not used', p.tok.position()) p.error_with_pos('`$p.tok.lit` evaluated but not used', p.tok.position())
} }
return p.parse_multi_expr() return p.parse_multi_expr(is_top_level)
} }
.comment { .comment {
return p.comment() return p.comment()
@ -613,7 +613,7 @@ pub fn (mut p Parser) stmt() ast.Stmt {
} }
// literals, 'if', etc. in here // literals, 'if', etc. in here
else { else {
return p.parse_multi_expr() return p.parse_multi_expr(is_top_level)
} }
} }
} }
@ -733,11 +733,12 @@ pub fn (mut p Parser) warn_with_pos(s string, pos token.Position) {
} }
} }
fn (mut p Parser) parse_multi_expr() ast.Stmt { fn (mut p Parser) parse_multi_expr(is_top_level bool) ast.Stmt {
// in here might be 1) multi-expr 2) multi-assign // in here might be 1) multi-expr 2) multi-assign
// 1, a, c ... } // multi-expression // 1, a, c ... } // multi-expression
// a, mut b ... :=/= // multi-assign // a, mut b ... :=/= // multi-assign
// collect things upto hard boundaries // collect things upto hard boundaries
tok_kind := p.tok.kind
mut collected := []ast.Expr{} mut collected := []ast.Expr{}
for { for {
collected << p.expr(0) collected << p.expr(0)
@ -773,6 +774,11 @@ fn (mut p Parser) parse_multi_expr() ast.Stmt {
}) })
pos: epos pos: epos
} }
} else if is_top_level && collected.len > 0 && collected[0] !is ast.AssignExpr &&
collected[0] !is ast.CallExpr && collected[0] !is ast.PostfixExpr &&
!(collected[0] is ast.InfixExpr && (collected[0] as ast.InfixExpr).op == .left_shift) &&
collected[0] !is ast.ComptimeCall && tok_kind !in [.key_if, .key_match] {
p.error_with_pos('expression evaluated but not used', collected[0].position())
} else { } else {
if collected.len == 1 { if collected.len == 1 {
return ast.ExprStmt{ return ast.ExprStmt{

View File

@ -0,0 +1,5 @@
vlib/v/parser/tests/expr_evaluated_but_not_used_a.v:2:2: error: expression evaluated but not used
1 | fn main() {
2 | 'hello'
| ~~~~~~~
3 | }

View File

@ -0,0 +1,3 @@
fn main() {
'hello'
}

View File

@ -0,0 +1,5 @@
vlib/v/parser/tests/expr_evaluated_but_not_used_b.v:2:2: error: expression evaluated but not used
1 | fn main() {
2 | 22
| ~~
3 | }

View File

@ -0,0 +1,3 @@
fn main() {
22
}

View File

@ -0,0 +1,7 @@
vlib/v/parser/tests/expr_evaluated_but_not_used_c.v:3:5: error: expression evaluated but not used
1 | fn main() {
2 | a := 10
3 | `b`
| ~~~
4 | println(a)
5 | }

View File

@ -0,0 +1,5 @@
fn main() {
a := 10
`b`
println(a)
}

View File

@ -0,0 +1,7 @@
vlib/v/parser/tests/expr_evaluated_but_not_used_d.v:4:5: error: expression evaluated but not used
2 | a := 1
3 | b := 2
4 | a+b
| ~~~
5 | println(a*b)
6 | }

View File

@ -0,0 +1,6 @@
fn main() {
a := 1
b := 2
a+b
println(a*b)
}