Commit 3a8490f7e9

Josh Wolfe <thejoshwolfe@gmail.com>
2017-04-15 01:29:42
add tests for implicit semicolon. closes #297
1 parent 3e93796
Changed files (1)
test/run_tests.cpp
@@ -1868,6 +1868,271 @@ export fn entry() {
 
 //////////////////////////////////////////////////////////////////////////////
 
+static void add_parse_error_tests(void) {
+    add_compile_fail_case("implicit semicolon - block statement", R"SOURCE(
+export fn entry() {
+    {}
+    var good = {};
+    ({})
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - block expr", R"SOURCE(
+export fn entry() {
+    _ = {};
+    var good = {};
+    _ = {}
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - comptime statement", R"SOURCE(
+export fn entry() {
+    comptime {}
+    var good = {};
+    comptime ({})
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - comptime expression", R"SOURCE(
+export fn entry() {
+    _ = comptime {};
+    var good = {};
+    _ = comptime {}
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - defer", R"SOURCE(
+export fn entry() {
+    defer {}
+    var good = {};
+    defer ({})
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: expected token ';', found 'var'");
+
+    add_compile_fail_case("implicit semicolon - if statement", R"SOURCE(
+export fn entry() {
+    if(true) {}
+    var good = {};
+    if(true) ({})
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - if expression", R"SOURCE(
+export fn entry() {
+    _ = if(true) {};
+    var good = {};
+    _ = if(true) {}
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - if-else statement", R"SOURCE(
+export fn entry() {
+    if(true) {} else {}
+    var good = {};
+    if(true) ({}) else ({})
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - if-else expression", R"SOURCE(
+export fn entry() {
+    _ = if(true) {} else {};
+    var good = {};
+    _ = if(true) {} else {}
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - if-else-if statement", R"SOURCE(
+export fn entry() {
+    if(true) {} else if(true) {}
+    var good = {};
+    if(true) ({}) else if(true) ({})
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - if-else-if expression", R"SOURCE(
+export fn entry() {
+    _ = if(true) {} else if(true) {};
+    var good = {};
+    _ = if(true) {} else if(true) {}
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - if-else-if-else statement", R"SOURCE(
+export fn entry() {
+    if(true) {} else if(true) {} else {}
+    var good = {};
+    if(true) ({}) else if(true) ({}) else ({})
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - if-else-if-else expression", R"SOURCE(
+export fn entry() {
+    _ = if(true) {} else if(true) {} else {};
+    var good = {};
+    _ = if(true) {} else if(true) {} else {}
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - if(var) statement", R"SOURCE(
+export fn entry() {
+    if(_=foo()) {}
+    var good = {};
+    if(_=foo()) ({})
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - if(var) expression", R"SOURCE(
+export fn entry() {
+    _ = if(_=foo()) {};
+    var good = {};
+    _ = if(_=foo()) {}
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - if(var)-else statement", R"SOURCE(
+export fn entry() {
+    if(_=foo()) {} else {}
+    var good = {};
+    if(_=foo()) ({}) else ({})
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - if(var)-else expression", R"SOURCE(
+export fn entry() {
+    _ = if(_=foo()) {} else {};
+    var good = {};
+    _ = if(_=foo()) {} else {}
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - if(var)-else-if(var) statement", R"SOURCE(
+export fn entry() {
+    if(_=foo()) {} else if(_=foo()) {}
+    var good = {};
+    if(_=foo()) ({}) else if(_=foo()) ({})
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - if(var)-else-if(var) expression", R"SOURCE(
+export fn entry() {
+    _ = if(_=foo()) {} else if(_=foo()) {};
+    var good = {};
+    _ = if(_=foo()) {} else if(_=foo()) {}
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - if(var)-else-if(var)-else statement", R"SOURCE(
+export fn entry() {
+    if(_=foo()) {} else if(_=foo()) {} else {}
+    var good = {};
+    if(_=foo()) ({}) else if(_=foo()) ({}) else ({})
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - if(var)-else-if(var)-else expression", R"SOURCE(
+export fn entry() {
+    _ = if(_=foo()) {} else if(_=foo()) {} else {};
+    var good = {};
+    _ = if(_=foo()) {} else if(_=foo()) {} else {}
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - try statement", R"SOURCE(
+export fn entry() {
+    try (_ = foo()) {}
+    var good = {};
+    try (_ = foo()) ({})
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - try expression", R"SOURCE(
+export fn entry() {
+    _ = try (_ = foo()) {};
+    var good = {};
+    _ = try (_ = foo()) {}
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - while statement", R"SOURCE(
+export fn entry() {
+    while(true) {}
+    var good = {};
+    while(true) ({})
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - while expression", R"SOURCE(
+export fn entry() {
+    _ = while(true) {};
+    var good = {};
+    _ = while(true) {}
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - while-continue statement", R"SOURCE(
+export fn entry() {
+    while(true;{}) {}
+    var good = {};
+    while(true;{}) ({})
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - while-continue expression", R"SOURCE(
+export fn entry() {
+    _ = while(true;{}) {};
+    var good = {};
+    _ = while(true;{}) {}
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - for statement", R"SOURCE(
+export fn entry() {
+    for(foo()) {}
+    var good = {};
+    for(foo()) ({})
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+
+    add_compile_fail_case("implicit semicolon - for expression", R"SOURCE(
+export fn entry() {
+    _ = for(foo()) {};
+    var good = {};
+    _ = for(foo()) {}
+    var bad = {};
+}
+    )SOURCE", 1, ".tmp_source.zig:6:5: error: invalid token: 'var'");
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
 static void add_debug_safety_test_cases(void) {
     add_debug_safety_case("calling panic", R"SOURCE(
 pub fn panic(message: []const u8) -> noreturn {
@@ -2624,6 +2889,7 @@ int main(int argc, char **argv) {
     add_compiling_test_cases();
     add_debug_safety_test_cases();
     add_compile_failure_test_cases();
+    add_parse_error_tests();
     add_parseh_test_cases();
     add_self_hosted_tests();
     add_std_lib_tests();