authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-20 22:48:40+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-20 22:48:40+02:00
log40f607d195440fe62e819592deb6746cd2695753
treecb467cc330f5d3630a860608c9ff08761cdc3e02
parent949f2369c1a8958e0cd054978f8045de9693eb72
signature Commit is signed but in an unrecognized format.

translate-c-2 fix macro regression


2 files changed, 22 insertions(+), 12 deletions(-)

src-self-hosted/c_tokenizer.zig+2-2
...@@ -594,7 +594,7 @@ fn next(chars: [*:0]const u8, i: *usize) !CToken {...@@ -594,7 +594,7 @@ fn next(chars: [*:0]const u8, i: *usize) !CToken {
594 switch (c) {594 switch (c) {
595 'l', 'L' => {595 'l', 'L' => {
596 result.num_lit_suffix = .LLU;596 result.num_lit_suffix = .LLU;
597 return result;597 state = .Done;
598 },598 },
599 else => {599 else => {
600 return result;600 return result;
...@@ -718,7 +718,7 @@ test "tokenize macro" {...@@ -718,7 +718,7 @@ test "tokenize macro" {
718 expect(it.next() == null);718 expect(it.next() == null);
719 tl.shrink(0);719 tl.shrink(0);
720720
721 const src5 = "FOO 0l";721 const src5 = "FOO 0ull";
722 try tokenizeCMacro(&tl, src5);722 try tokenizeCMacro(&tl, src5);
723 it = tl.iterator(0);723 it = tl.iterator(0);
724 expect(it.next().?.id == .Identifier);724 expect(it.next().?.id == .Identifier);
src-self-hosted/translate_c.zig+20-10
...@@ -407,8 +407,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {...@@ -407,8 +407,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
407 while (it.next()) |p| {407 while (it.next()) |p| {
408 const param = @fieldParentPtr(ast.Node.ParamDecl, "base", p.*);408 const param = @fieldParentPtr(ast.Node.ParamDecl, "base", p.*);
409 const param_name = tokenSlice(c, param.name_token orelse409 const param_name = tokenSlice(c, param.name_token orelse
410 return failDecl(c, fn_decl_loc, fn_name, "function {} parameter has no name", .{fn_name})410 return failDecl(c, fn_decl_loc, fn_name, "function {} parameter has no name", .{fn_name}));
411 );
412411
413 const checked_param_name = if (try scope.createAlias(rp.c, param_name)) |a| blk: {412 const checked_param_name = if (try scope.createAlias(rp.c, param_name)) |a| blk: {
414 try block_scope.variables.push(.{ .name = param_name, .alias = a });413 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,...@@ -4109,6 +4108,15 @@ fn transMacroDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u8,
4109 node.eq_token = try appendToken(c, .Equal, "=");4108 node.eq_token = try appendToken(c, .Equal, "=");
41104109
4111 node.init_node = try parseCExpr(rp, it, source_loc, scope);4110 node.init_node = try parseCExpr(rp, it, source_loc, scope);
4111 const last = it.next().?;
4112 if (last.id != .Eof)
4113 return revertAndWarn(
4114 rp,
4115 error.UnsupportedTranslation,
4116 source_loc,
4117 "unable to translate C expr, unexpected token: {}",
4118 .{last.id},
4119 );
41124120
4113 node.semicolon_token = try appendToken(c, .Semicolon, ";");4121 node.semicolon_token = try appendToken(c, .Semicolon, ";");
4114 _ = try c.global_scope.macro_table.put(name, &node.base);4122 _ = 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...@@ -4196,6 +4204,15 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u
41964204
4197 const return_expr = try transCreateNodeReturnExpr(c);4205 const return_expr = try transCreateNodeReturnExpr(c);
4198 const expr = try parseCExpr(rp, it, source_loc, scope);4206 const expr = try parseCExpr(rp, it, source_loc, scope);
4207 const last = it.next().?;
4208 if (last.id != .Eof)
4209 return revertAndWarn(
4210 rp,
4211 error.UnsupportedTranslation,
4212 source_loc,
4213 "unable to translate C expr, unexpected token: {}",
4214 .{last.id},
4215 );
4199 _ = try appendToken(c, .Semicolon, ";");4216 _ = try appendToken(c, .Semicolon, ";");
4200 try type_of.params.push(expr);4217 try type_of.params.push(expr);
4201 return_expr.rhs = expr;4218 return_expr.rhs = expr;
...@@ -4475,17 +4492,10 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc...@@ -4475,17 +4492,10 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
4475 call_node.rtoken = try appendToken(rp.c, .RParen, ")");4492 call_node.rtoken = try appendToken(rp.c, .RParen, ")");
4476 node = &call_node.base;4493 node = &call_node.base;
4477 },4494 },
4478 .Eof => {4495 else => {
4479 _ = it.prev();4496 _ = it.prev();
4480 return node;4497 return node;
4481 },4498 },
4482 else => return revertAndWarn(
4483 rp,
4484 error.UnsupportedTranslation,
4485 source_loc,
4486 "unable to translate C expr, unexpected token: {}",
4487 .{tok.id},
4488 ),
4489 }4499 }
4490 }4500 }
4491}4501}