Commit 40f607d195

Vexu <git@vexu.eu>
2019-12-20 21:48:40
translate-c-2 fix macro regression
1 parent 949f236
Changed files (2)
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);
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},
-            ),
         }
     }
 }