| author | |
| committer | |
| log | f81529fab17fe1a7ded4f1aae959159563f09efb |
| tree | c1766cd4b46039b3db4f20bb7905a4662f849e7a |
| parent | e06a6b9645827fa35cfa388bbea8813206d444ad |
2 files changed, 26 insertions(+), 1 deletions(-)
lib/std/zig/parse.zig+11-1| ... | ... | @@ -303,7 +303,17 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node |
| 303 | 303 | fn parseFnProto(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { |
| 304 | 304 | const cc = parseFnCC(arena, it, tree); |
| 305 | 305 | const fn_token = eatToken(it, .Keyword_fn) orelse { |
| 306 | if (cc == null) return null else return error.ParseError; | |
| 306 | if (cc) |fnCC| { | |
| 307 | if (fnCC == .Extern) { | |
| 308 | putBackToken(it, fnCC.Extern); // 'extern' is also used in ContainerDecl | |
| 309 | } else { | |
| 310 | try tree.errors.push(AstError{ | |
| 311 | .ExpectedToken = .{ .token = it.index, .expected_id = .Keyword_fn }, | |
| 312 | }); | |
| 313 | return error.ParseError; | |
| 314 | } | |
| 315 | } | |
| 316 | return null; | |
| 307 | 317 | }; |
| 308 | 318 | const name_token = eatToken(it, .Identifier); |
| 309 | 319 | const lparen = try expectToken(it, tree, .LParen); |
lib/std/zig/parser_test.zig+15| ... | ... | @@ -2714,6 +2714,13 @@ test "zig fmt: top level doc comments" { |
| 2714 | 2714 | ); |
| 2715 | 2715 | } |
| 2716 | 2716 | |
| 2717 | test "zig fmt: extern without container keyword returns error" { | |
| 2718 | try testError( | |
| 2719 | \\const container = extern {}; | |
| 2720 | \\ | |
| 2721 | ); | |
| 2722 | } | |
| 2723 | ||
| 2717 | 2724 | const std = @import("std"); |
| 2718 | 2725 | const mem = std.mem; |
| 2719 | 2726 | const warn = std.debug.warn; |
| ... | ... | @@ -2820,3 +2827,11 @@ fn testTransform(source: []const u8, expected_source: []const u8) !void { |
| 2820 | 2827 | fn testCanonical(source: []const u8) !void { |
| 2821 | 2828 | return testTransform(source, source); |
| 2822 | 2829 | } |
| 2830 | ||
| 2831 | fn testError(source: []const u8) !void { | |
| 2832 | var fixed_allocator = std.heap.FixedBufferAllocator.init(fixed_buffer_mem[0..]); | |
| 2833 | const tree = try std.zig.parse(&fixed_allocator.allocator, source); | |
| 2834 | defer tree.deinit(); | |
| 2835 | ||
| 2836 | std.testing.expect(tree.errors.len != 0); | |
| 2837 | } |