diff --git a/src-self-hosted/c_tokenizer.zig b/src-self-hosted/c_tokenizer.zig index 3999645aee..1d166cafe9 100644 --- a/src-self-hosted/c_tokenizer.zig +++ b/src-self-hosted/c_tokenizer.zig @@ -594,7 +594,7 @@ fn next(chars: [*:0]const u8, i: *usize) !CToken { switch (c) { 'l', 'L' => { result.num_lit_suffix = .LLU; - return result; + state = .Done; }, else => { return result; @@ -718,7 +718,7 @@ test "tokenize macro" { expect(it.next() == null); tl.shrink(0); - const src5 = "FOO 0l"; + const src5 = "FOO 0ull"; try tokenizeCMacro(&tl, src5); it = tl.iterator(0); expect(it.next().?.id == .Identifier); diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index a683a02002..489c809e4f 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -407,8 +407,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void { while (it.next()) |p| { const param = @fieldParentPtr(ast.Node.ParamDecl, "base", p.*); const param_name = tokenSlice(c, param.name_token orelse - return failDecl(c, fn_decl_loc, fn_name, "function {} parameter has no name", .{fn_name}) - ); + return failDecl(c, fn_decl_loc, fn_name, "function {} parameter has no name", .{fn_name})); const checked_param_name = if (try scope.createAlias(rp.c, param_name)) |a| blk: { try block_scope.variables.push(.{ .name = param_name, .alias = a }); @@ -4109,6 +4108,15 @@ fn transMacroDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u8, node.eq_token = try appendToken(c, .Equal, "="); node.init_node = try parseCExpr(rp, it, source_loc, scope); + const last = it.next().?; + if (last.id != .Eof) + return revertAndWarn( + rp, + error.UnsupportedTranslation, + source_loc, + "unable to translate C expr, unexpected token: {}", + .{last.id}, + ); node.semicolon_token = try appendToken(c, .Semicolon, ";"); _ = try c.global_scope.macro_table.put(name, &node.base); @@ -4196,6 +4204,15 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u const return_expr = try transCreateNodeReturnExpr(c); const expr = try parseCExpr(rp, it, source_loc, scope); + const last = it.next().?; + if (last.id != .Eof) + return revertAndWarn( + rp, + error.UnsupportedTranslation, + source_loc, + "unable to translate C expr, unexpected token: {}", + .{last.id}, + ); _ = try appendToken(c, .Semicolon, ";"); try type_of.params.push(expr); return_expr.rhs = expr; @@ -4475,17 +4492,10 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc call_node.rtoken = try appendToken(rp.c, .RParen, ")"); node = &call_node.base; }, - .Eof => { + else => { _ = it.prev(); return node; }, - else => return revertAndWarn( - rp, - error.UnsupportedTranslation, - source_loc, - "unable to translate C expr, unexpected token: {}", - .{tok.id}, - ), } } }