From 55348c9b934ee87950e828e253b86e8b4b8622c2 Mon Sep 17 00:00:00 2001 From: Vexu Date: Sun, 29 Dec 2019 18:37:00 +0200 Subject: [PATCH] translate-c-2 bug fixes - fix use of undefined value - fix parenexprclass result not being suppressed - add an error and a TODO for access of an anonymous field --- src-self-hosted/stage1.zig | 2 +- src-self-hosted/translate_c.zig | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src-self-hosted/stage1.zig b/src-self-hosted/stage1.zig index 6f1faa3f3f..ec683e4ba8 100644 --- a/src-self-hosted/stage1.zig +++ b/src-self-hosted/stage1.zig @@ -95,7 +95,7 @@ export fn stage2_translate_c( args_end: [*]?[*]const u8, resources_path: [*:0]const u8, ) Error { - var errors: []translate_c.ClangErrMsg = undefined; + var errors = @as([*]translate_c.ClangErrMsg, undefined)[0..0]; out_ast.* = translate_c.translate(std.heap.c_allocator, args_begin, args_end, &errors, resources_path) catch |err| switch (err) { error.SemanticAnalyzeFail => { out_errors_ptr.* = errors.ptr; diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index f87e826cbd..cd3282fb88 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -853,15 +853,15 @@ fn transStmt( .ReturnStmtClass => return transReturnStmt(rp, scope, @ptrCast(*const ZigClangReturnStmt, stmt)), .StringLiteralClass => return transStringLiteral(rp, scope, @ptrCast(*const ZigClangStringLiteral, stmt), result_used), .ParenExprClass => { - const expr = try transExpr(rp, scope, ZigClangParenExpr_getSubExpr(@ptrCast(*const ZigClangParenExpr, stmt)), result_used, lrvalue); - if (expr.id == .GroupedExpression) return expr; + const expr = try transExpr(rp, scope, ZigClangParenExpr_getSubExpr(@ptrCast(*const ZigClangParenExpr, stmt)), .used, lrvalue); + if (expr.id == .GroupedExpression) return maybeSuppressResult(rp, scope, result_used, expr); const node = try rp.c.a().create(ast.Node.GroupedExpression); node.* = .{ .lparen = try appendToken(rp.c, .LParen, "("), .expr = expr, .rparen = try appendToken(rp.c, .RParen, ")"), }; - return &node.base; + return maybeSuppressResult(rp, scope, result_used, &node.base); }, .InitListExprClass => return transInitListExpr(rp, scope, @ptrCast(*const ZigClangInitListExpr, stmt), result_used), .ImplicitValueInitExprClass => return transImplicitValueInitExpr(rp, scope, @ptrCast(*const ZigClangExpr, stmt), result_used), @@ -2098,6 +2098,9 @@ fn transMemberExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangMemberE } const name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, ZigClangMemberExpr_getMemberDecl(stmt)))); + if (name.len == 0) { + return revertAndWarn(rp, error.UnsupportedTranslation, ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt)), "TODO access of anonymous field", .{}); + } const node = try transCreateNodeFieldAccess(rp.c, container_node, name); return maybeSuppressResult(rp, scope, result_used, node); }