authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-12-28 00:55:44+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-12-28 00:55:44+02:00
logd96f5b38a3d56c87f06ae301e9113ef28529e86e
treedc707cbea555c2c9bda71459ba2f6c95bae99aeb
parent5acfaa35d3320c7595262b4d97ba4cdc3a1afc7b
parent795770bcb489c8bb1a042bcfd9070dd6a77e0057
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #7556 from Vexu/translate-c

some fixes

6 files changed, 60 insertions(+), 28 deletions(-)

src/stage1/analyze.cpp+14-6
...@@ -7232,13 +7232,13 @@ bool const_values_equal(CodeGen *g, ZigValue *a, ZigValue *b) {...@@ -7232,13 +7232,13 @@ bool const_values_equal(CodeGen *g, ZigValue *a, ZigValue *b) {
7232 }7232 }
7233 return true;7233 return true;
7234 case ZigTypeIdFnFrame:7234 case ZigTypeIdFnFrame:
7235 zig_panic("TODO");7235 zig_panic("TODO: const_values_equal ZigTypeIdFnFrame");
7236 case ZigTypeIdAnyFrame:7236 case ZigTypeIdAnyFrame:
7237 zig_panic("TODO");7237 zig_panic("TODO: const_values_equal ZigTypeIdAnyFrame");
7238 case ZigTypeIdUndefined:7238 case ZigTypeIdUndefined:
7239 zig_panic("TODO");7239 zig_panic("TODO: const_values_equal ZigTypeIdUndefined");
7240 case ZigTypeIdNull:7240 case ZigTypeIdNull:
7241 zig_panic("TODO");7241 zig_panic("TODO: const_values_equal ZigTypeIdNull");
7242 case ZigTypeIdOptional:7242 case ZigTypeIdOptional:
7243 if (get_src_ptr_type(a->type) != nullptr)7243 if (get_src_ptr_type(a->type) != nullptr)
7244 return const_values_equal_ptr(a, b);7244 return const_values_equal_ptr(a, b);
...@@ -7247,8 +7247,16 @@ bool const_values_equal(CodeGen *g, ZigValue *a, ZigValue *b) {...@@ -7247,8 +7247,16 @@ bool const_values_equal(CodeGen *g, ZigValue *a, ZigValue *b) {
7247 } else {7247 } else {
7248 return const_values_equal(g, a->data.x_optional, b->data.x_optional);7248 return const_values_equal(g, a->data.x_optional, b->data.x_optional);
7249 }7249 }
7250 case ZigTypeIdErrorUnion:7250 case ZigTypeIdErrorUnion: {
7251 zig_panic("TODO");7251 bool a_is_err = a->data.x_err_union.error_set->data.x_err_set != nullptr;
7252 bool b_is_err = b->data.x_err_union.error_set->data.x_err_set != nullptr;
7253 if (a_is_err != b_is_err) return false;
7254 if (a_is_err) {
7255 return const_values_equal(g, a->data.x_err_union.error_set, b->data.x_err_union.error_set);
7256 } else {
7257 return const_values_equal(g, a->data.x_err_union.payload, b->data.x_err_union.payload);
7258 }
7259 }
7252 case ZigTypeIdBoundFn:7260 case ZigTypeIdBoundFn:
7253 case ZigTypeIdInvalid:7261 case ZigTypeIdInvalid:
7254 case ZigTypeIdUnreachable:7262 case ZigTypeIdUnreachable:
src/stage1/codegen.cpp+2-2
...@@ -7855,9 +7855,9 @@ static LLVMValueRef gen_const_val(CodeGen *g, ZigValue *const_val, const char *n...@@ -7855,9 +7855,9 @@ static LLVMValueRef gen_const_val(CodeGen *g, ZigValue *const_val, const char *n
7855 case ZigTypeIdOpaque:7855 case ZigTypeIdOpaque:
7856 zig_unreachable();7856 zig_unreachable();
7857 case ZigTypeIdFnFrame:7857 case ZigTypeIdFnFrame:
7858 zig_panic("TODO");7858 zig_panic("TODO: gen_const_val ZigTypeIdFnFrame");
7859 case ZigTypeIdAnyFrame:7859 case ZigTypeIdAnyFrame:
7860 zig_panic("TODO");7860 zig_panic("TODO: gen_const_val ZigTypeIdAnyFrame");
7861 }7861 }
7862 zig_unreachable();7862 zig_unreachable();
7863}7863}
src/stage1/ir.cpp+19-19
...@@ -10843,7 +10843,7 @@ static void float_init_bigfloat(ZigValue *dest_val, BigFloat *bigfloat) {...@@ -10843,7 +10843,7 @@ static void float_init_bigfloat(ZigValue *dest_val, BigFloat *bigfloat) {
10843 dest_val->data.x_f64 = bigfloat_to_f64(bigfloat);10843 dest_val->data.x_f64 = bigfloat_to_f64(bigfloat);
10844 break;10844 break;
10845 case 80:10845 case 80:
10846 zig_panic("TODO");10846 zig_panic("TODO: float_init_bigfloat c_longdouble");
10847 case 128:10847 case 128:
10848 dest_val->data.x_f128 = bigfloat_to_f128(bigfloat);10848 dest_val->data.x_f128 = bigfloat_to_f128(bigfloat);
10849 break;10849 break;
...@@ -11483,7 +11483,7 @@ static void value_to_bigfloat(BigFloat *out, ZigValue *val) {...@@ -11483,7 +11483,7 @@ static void value_to_bigfloat(BigFloat *out, ZigValue *val) {
11483 bigfloat_init_64(out, val->data.x_f64);11483 bigfloat_init_64(out, val->data.x_f64);
11484 return;11484 return;
11485 case 80:11485 case 80:
11486 zig_panic("TODO");11486 zig_panic("TODO: value_to_bigfloat c_longdouble");
11487 case 128:11487 case 128:
11488 bigfloat_init_128(out, val->data.x_f128);11488 bigfloat_init_128(out, val->data.x_f128);
11489 return;11489 return;
...@@ -11573,7 +11573,7 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstGen *instruction...@@ -11573,7 +11573,7 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstGen *instruction
11573 break;11573 break;
11574 }11574 }
11575 case 80:11575 case 80:
11576 zig_panic("TODO");11576 zig_panic("TODO: ir_num_lit_fits_in_other_type c_longdouble");
11577 case 128: {11577 case 128: {
11578 float128_t tmp = bigfloat_to_f128(&tmp_bf);11578 float128_t tmp = bigfloat_to_f128(&tmp_bf);
11579 bigfloat_init_128(&orig_bf, tmp);11579 bigfloat_init_128(&orig_bf, tmp);
...@@ -11618,7 +11618,7 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstGen *instruction...@@ -11618,7 +11618,7 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstGen *instruction
11618 break;11618 break;
11619 }11619 }
11620 case 80:11620 case 80:
11621 zig_panic("TODO");11621 zig_panic("TODO: ir_num_lit_fits_in_other_type c_longdouble");
11622 case 128: {11622 case 128: {
11623 float16_t tmp = f128M_to_f16(&const_val->data.x_f128);11623 float16_t tmp = f128M_to_f16(&const_val->data.x_f128);
11624 float128_t orig;11624 float128_t orig;
...@@ -11643,7 +11643,7 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstGen *instruction...@@ -11643,7 +11643,7 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstGen *instruction
11643 break;11643 break;
11644 }11644 }
11645 case 80:11645 case 80:
11646 zig_panic("TODO");11646 zig_panic("TODO: ir_num_lit_fits_in_other_type c_longdouble");
11647 case 128: {11647 case 128: {
11648 float32_t tmp = f128M_to_f32(&const_val->data.x_f128);11648 float32_t tmp = f128M_to_f32(&const_val->data.x_f128);
11649 float128_t orig;11649 float128_t orig;
...@@ -11660,7 +11660,7 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstGen *instruction...@@ -11660,7 +11660,7 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstGen *instruction
11660 case 64:11660 case 64:
11661 switch (const_val->type->data.floating.bit_count) {11661 switch (const_val->type->data.floating.bit_count) {
11662 case 80:11662 case 80:
11663 zig_panic("TODO");11663 zig_panic("TODO: ir_num_lit_fits_in_other_type c_longdouble");
11664 case 128: {11664 case 128: {
11665 float64_t tmp = f128M_to_f64(&const_val->data.x_f128);11665 float64_t tmp = f128M_to_f64(&const_val->data.x_f128);
11666 float128_t orig;11666 float128_t orig;
...@@ -11676,7 +11676,7 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstGen *instruction...@@ -11676,7 +11676,7 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstGen *instruction
11676 break;11676 break;
11677 case 80:11677 case 80:
11678 assert(const_val->type->data.floating.bit_count == 128);11678 assert(const_val->type->data.floating.bit_count == 128);
11679 zig_panic("TODO");11679 zig_panic("TODO: ir_num_lit_fits_in_other_type c_longdouble");
11680 case 128:11680 case 128:
11681 return true;11681 return true;
11682 default:11682 default:
...@@ -13068,7 +13068,7 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInst *source_instr,...@@ -13068,7 +13068,7 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInst *source_instr,
13068 zig_unreachable();13068 zig_unreachable();
13069 case CastOpErrSet:13069 case CastOpErrSet:
13070 case CastOpBitCast:13070 case CastOpBitCast:
13071 zig_panic("TODO");13071 zig_panic("TODO: eval_const_expr_implicit_cast CastOpErrSet, CastOpBitCast");
13072 case CastOpNoop: {13072 case CastOpNoop: {
13073 copy_const_val(ira->codegen, const_val, other_val);13073 copy_const_val(ira->codegen, const_val, other_val);
13074 const_val->type = new_type;13074 const_val->type = new_type;
...@@ -13088,7 +13088,7 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInst *source_instr,...@@ -13088,7 +13088,7 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInst *source_instr,
13088 const_val->data.x_f64 = bigfloat_to_f64(&other_val->data.x_bigfloat);13088 const_val->data.x_f64 = bigfloat_to_f64(&other_val->data.x_bigfloat);
13089 break;13089 break;
13090 case 80:13090 case 80:
13091 zig_panic("TODO");13091 zig_panic("TODO: eval_const_expr_implicit_cast c_longdouble");
13092 case 128:13092 case 128:
13093 const_val->data.x_f128 = bigfloat_to_f128(&other_val->data.x_bigfloat);13093 const_val->data.x_f128 = bigfloat_to_f128(&other_val->data.x_bigfloat);
13094 break;13094 break;
...@@ -13117,7 +13117,7 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInst *source_instr,...@@ -13117,7 +13117,7 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInst *source_instr,
13117 const_val->data.x_f64 = bigfloat_to_f64(&bigfloat);13117 const_val->data.x_f64 = bigfloat_to_f64(&bigfloat);
13118 break;13118 break;
13119 case 80:13119 case 80:
13120 zig_panic("TODO");13120 zig_panic("TODO: eval_const_expr_implicit_cast c_longdouble");
13121 case 128:13121 case 128:
13122 const_val->data.x_f128 = bigfloat_to_f128(&bigfloat);13122 const_val->data.x_f128 = bigfloat_to_f128(&bigfloat);
13123 break;13123 break;
...@@ -21433,7 +21433,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source...@@ -21433,7 +21433,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source
21433 ZigValue *array_val = ptr_val->data.x_ptr.data.base_array.array_val;21433 ZigValue *array_val = ptr_val->data.x_ptr.data.base_array.array_val;
21434 assert(array_val->type->id == ZigTypeIdArray);21434 assert(array_val->type->id == ZigTypeIdArray);
21435 if (array_val->data.x_array.special != ConstArraySpecialNone)21435 if (array_val->data.x_array.special != ConstArraySpecialNone)
21436 zig_panic("TODO");21436 zig_panic("TODO: ir_read_const_ptr ConstPtrSpecialSubArray !ConstArraySpecialNone");
21437 if (dst_size > src_size) {21437 if (dst_size > src_size) {
21438 size_t elem_index = ptr_val->data.x_ptr.data.base_array.elem_index;21438 size_t elem_index = ptr_val->data.x_ptr.data.base_array.elem_index;
21439 opt_ir_add_error_node(ira, codegen, source_node,21439 opt_ir_add_error_node(ira, codegen, source_node,
...@@ -21458,7 +21458,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source...@@ -21458,7 +21458,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source
21458 ZigValue *array_val = ptr_val->data.x_ptr.data.base_array.array_val;21458 ZigValue *array_val = ptr_val->data.x_ptr.data.base_array.array_val;
21459 assert(array_val->type->id == ZigTypeIdArray);21459 assert(array_val->type->id == ZigTypeIdArray);
21460 if (array_val->data.x_array.special != ConstArraySpecialNone)21460 if (array_val->data.x_array.special != ConstArraySpecialNone)
21461 zig_panic("TODO");21461 zig_panic("TODO: ir_read_const_ptr ConstPtrSpecialBaseArray !ConstArraySpecialNone");
21462 size_t elem_size = src_size;21462 size_t elem_size = src_size;
21463 size_t elem_index = ptr_val->data.x_ptr.data.base_array.elem_index;21463 size_t elem_index = ptr_val->data.x_ptr.data.base_array.elem_index;
21464 src_size = elem_size * (array_val->type->data.array.len - elem_index);21464 src_size = elem_size * (array_val->type->data.array.len - elem_index);
...@@ -21487,7 +21487,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source...@@ -21487,7 +21487,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source
21487 case ConstPtrSpecialDiscard:21487 case ConstPtrSpecialDiscard:
21488 case ConstPtrSpecialHardCodedAddr:21488 case ConstPtrSpecialHardCodedAddr:
21489 case ConstPtrSpecialFunction:21489 case ConstPtrSpecialFunction:
21490 zig_panic("TODO");21490 zig_panic("TODO: ir_read_const_ptr");
21491 }21491 }
21492 zig_unreachable();21492 zig_unreachable();
21493}21493}
...@@ -28815,13 +28815,13 @@ done_with_return_type:...@@ -28815,13 +28815,13 @@ done_with_return_type:
28815 case ConstPtrSpecialBaseArray:28815 case ConstPtrSpecialBaseArray:
28816 zig_unreachable();28816 zig_unreachable();
28817 case ConstPtrSpecialBaseStruct:28817 case ConstPtrSpecialBaseStruct:
28818 zig_panic("TODO");28818 zig_panic("TODO: ir_analyze_instruction_slice ConstPtrSpecialBaseStruct");
28819 case ConstPtrSpecialBaseErrorUnionCode:28819 case ConstPtrSpecialBaseErrorUnionCode:
28820 zig_panic("TODO");28820 zig_panic("TODO: ir_analyze_instruction_slice ConstPtrSpecialBaseErrorUnionCode");
28821 case ConstPtrSpecialBaseErrorUnionPayload:28821 case ConstPtrSpecialBaseErrorUnionPayload:
28822 zig_panic("TODO");28822 zig_panic("TODO: ir_analyze_instruction_slice ConstPtrSpecialBaseErrorUnionPayload");
28823 case ConstPtrSpecialBaseOptionalPayload:28823 case ConstPtrSpecialBaseOptionalPayload:
28824 zig_panic("TODO");28824 zig_panic("TODO: ir_analyze_instruction_slice ConstPtrSpecialBaseOptionalPayload");
28825 case ConstPtrSpecialHardCodedAddr:28825 case ConstPtrSpecialHardCodedAddr:
28826 init_const_ptr_hard_coded_addr(ira->codegen, ptr_val,28826 init_const_ptr_hard_coded_addr(ira->codegen, ptr_val,
28827 parent_ptr->type->data.pointer.child_type,28827 parent_ptr->type->data.pointer.child_type,
...@@ -28829,9 +28829,9 @@ done_with_return_type:...@@ -28829,9 +28829,9 @@ done_with_return_type:
28829 return_type_is_const);28829 return_type_is_const);
28830 break;28830 break;
28831 case ConstPtrSpecialFunction:28831 case ConstPtrSpecialFunction:
28832 zig_panic("TODO");28832 zig_panic("TODO: ir_analyze_instruction_slice ConstPtrSpecialFunction");
28833 case ConstPtrSpecialNull:28833 case ConstPtrSpecialNull:
28834 zig_panic("TODO");28834 zig_panic("TODO: ir_analyze_instruction_slice ConstPtrSpecialNull");
28835 }28835 }
2883628836
28837 // In the case of pointer-to-array, we must restore this because above it overwrites ptr_val->type28837 // In the case of pointer-to-array, we must restore this because above it overwrites ptr_val->type
src/translate_c.zig+7-1
...@@ -550,7 +550,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const clang.FunctionDecl) Error!void {...@@ -550,7 +550,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const clang.FunctionDecl) Error!void {
550 const fn_decl_loc = fn_decl.getLocation();550 const fn_decl_loc = fn_decl.getLocation();
551 const has_body = fn_decl.hasBody();551 const has_body = fn_decl.hasBody();
552 const storage_class = fn_decl.getStorageClass();552 const storage_class = fn_decl.getStorageClass();
553 const decl_ctx = FnDeclContext{553 var decl_ctx = FnDeclContext{
554 .fn_name = fn_name,554 .fn_name = fn_name,
555 .has_body = has_body,555 .has_body = has_body,
556 .storage_class = storage_class,556 .storage_class = storage_class,
...@@ -584,6 +584,12 @@ fn visitFnDecl(c: *Context, fn_decl: *const clang.FunctionDecl) Error!void {...@@ -584,6 +584,12 @@ fn visitFnDecl(c: *Context, fn_decl: *const clang.FunctionDecl) Error!void {
584 const proto_node = switch (fn_type.getTypeClass()) {584 const proto_node = switch (fn_type.getTypeClass()) {
585 .FunctionProto => blk: {585 .FunctionProto => blk: {
586 const fn_proto_type = @ptrCast(*const clang.FunctionProtoType, fn_type);586 const fn_proto_type = @ptrCast(*const clang.FunctionProtoType, fn_type);
587 if (has_body and fn_proto_type.isVariadic()) {
588 decl_ctx.has_body = false;
589 decl_ctx.storage_class = .Extern;
590 decl_ctx.is_export = false;
591 try emitWarning(c, fn_decl_loc, "TODO unable to translate variadic function, demoted to declaration", .{});
592 }
587 break :blk transFnProto(rp, fn_decl, fn_proto_type, fn_decl_loc, decl_ctx, true) catch |err| switch (err) {593 break :blk transFnProto(rp, fn_decl, fn_proto_type, fn_decl_loc, decl_ctx, true) catch |err| switch (err) {
588 error.UnsupportedType => {594 error.UnsupportedType => {
589 return failDecl(c, fn_decl_loc, fn_name, "unable to resolve prototype of function", .{});595 return failDecl(c, fn_decl_loc, fn_name, "unable to resolve prototype of function", .{});
test/stage1/behavior/error.zig+9
...@@ -441,3 +441,12 @@ test "error payload type is correctly resolved" {...@@ -441,3 +441,12 @@ test "error payload type is correctly resolved" {
441441
442 expectEqual(MyIntWrapper{ .x = 42 }, try MyIntWrapper.create());442 expectEqual(MyIntWrapper{ .x = 42 }, try MyIntWrapper.create());
443}443}
444
445test "error union comptime caching" {
446 const S = struct {
447 fn foo(comptime arg: anytype) void {}
448 };
449
450 S.foo(@as(anyerror!void, {}));
451 S.foo(@as(anyerror!void, {}));
452}
\ No newline at end of file
test/translate_c.zig+9
...@@ -3,6 +3,15 @@ const std = @import("std");...@@ -3,6 +3,15 @@ const std = @import("std");
3const CrossTarget = std.zig.CrossTarget;3const CrossTarget = std.zig.CrossTarget;
44
5pub fn addCases(cases: *tests.TranslateCContext) void {5pub fn addCases(cases: *tests.TranslateCContext) void {
6 cases.add("variadic function demoted to prototype",
7 \\int foo(int bar, ...) {
8 \\ return 1;
9 \\}
10 , &[_][]const u8{
11 \\warning: TODO unable to translate variadic function, demoted to declaration
12 \\pub extern fn foo(bar: c_int, ...) c_int;
13 });
14
6 cases.add("pointer to opaque demoted struct",15 cases.add("pointer to opaque demoted struct",
7 \\typedef struct {16 \\typedef struct {
8 \\ _Atomic int foo;17 \\ _Atomic int foo;