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) {
72327232 }
72337233 return true;
72347234 case ZigTypeIdFnFrame:
7235 zig_panic("TODO");
7235 zig_panic("TODO: const_values_equal ZigTypeIdFnFrame");
72367236 case ZigTypeIdAnyFrame:
7237 zig_panic("TODO");
7237 zig_panic("TODO: const_values_equal ZigTypeIdAnyFrame");
72387238 case ZigTypeIdUndefined:
7239 zig_panic("TODO");
7239 zig_panic("TODO: const_values_equal ZigTypeIdUndefined");
72407240 case ZigTypeIdNull:
7241 zig_panic("TODO");
7241 zig_panic("TODO: const_values_equal ZigTypeIdNull");
72427242 case ZigTypeIdOptional:
72437243 if (get_src_ptr_type(a->type) != nullptr)
72447244 return const_values_equal_ptr(a, b);
......@@ -7247,8 +7247,16 @@ bool const_values_equal(CodeGen *g, ZigValue *a, ZigValue *b) {
72477247 } else {
72487248 return const_values_equal(g, a->data.x_optional, b->data.x_optional);
72497249 }
7250 case ZigTypeIdErrorUnion:
7251 zig_panic("TODO");
7250 case ZigTypeIdErrorUnion: {
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 }
72527260 case ZigTypeIdBoundFn:
72537261 case ZigTypeIdInvalid:
72547262 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
78557855 case ZigTypeIdOpaque:
78567856 zig_unreachable();
78577857 case ZigTypeIdFnFrame:
7858 zig_panic("TODO");
7858 zig_panic("TODO: gen_const_val ZigTypeIdFnFrame");
78597859 case ZigTypeIdAnyFrame:
7860 zig_panic("TODO");
7860 zig_panic("TODO: gen_const_val ZigTypeIdAnyFrame");
78617861 }
78627862 zig_unreachable();
78637863}
src/stage1/ir.cpp+19-19
......@@ -10843,7 +10843,7 @@ static void float_init_bigfloat(ZigValue *dest_val, BigFloat *bigfloat) {
1084310843 dest_val->data.x_f64 = bigfloat_to_f64(bigfloat);
1084410844 break;
1084510845 case 80:
10846 zig_panic("TODO");
10846 zig_panic("TODO: float_init_bigfloat c_longdouble");
1084710847 case 128:
1084810848 dest_val->data.x_f128 = bigfloat_to_f128(bigfloat);
1084910849 break;
......@@ -11483,7 +11483,7 @@ static void value_to_bigfloat(BigFloat *out, ZigValue *val) {
1148311483 bigfloat_init_64(out, val->data.x_f64);
1148411484 return;
1148511485 case 80:
11486 zig_panic("TODO");
11486 zig_panic("TODO: value_to_bigfloat c_longdouble");
1148711487 case 128:
1148811488 bigfloat_init_128(out, val->data.x_f128);
1148911489 return;
......@@ -11573,7 +11573,7 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstGen *instruction
1157311573 break;
1157411574 }
1157511575 case 80:
11576 zig_panic("TODO");
11576 zig_panic("TODO: ir_num_lit_fits_in_other_type c_longdouble");
1157711577 case 128: {
1157811578 float128_t tmp = bigfloat_to_f128(&tmp_bf);
1157911579 bigfloat_init_128(&orig_bf, tmp);
......@@ -11618,7 +11618,7 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstGen *instruction
1161811618 break;
1161911619 }
1162011620 case 80:
11621 zig_panic("TODO");
11621 zig_panic("TODO: ir_num_lit_fits_in_other_type c_longdouble");
1162211622 case 128: {
1162311623 float16_t tmp = f128M_to_f16(&const_val->data.x_f128);
1162411624 float128_t orig;
......@@ -11643,7 +11643,7 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstGen *instruction
1164311643 break;
1164411644 }
1164511645 case 80:
11646 zig_panic("TODO");
11646 zig_panic("TODO: ir_num_lit_fits_in_other_type c_longdouble");
1164711647 case 128: {
1164811648 float32_t tmp = f128M_to_f32(&const_val->data.x_f128);
1164911649 float128_t orig;
......@@ -11660,7 +11660,7 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstGen *instruction
1166011660 case 64:
1166111661 switch (const_val->type->data.floating.bit_count) {
1166211662 case 80:
11663 zig_panic("TODO");
11663 zig_panic("TODO: ir_num_lit_fits_in_other_type c_longdouble");
1166411664 case 128: {
1166511665 float64_t tmp = f128M_to_f64(&const_val->data.x_f128);
1166611666 float128_t orig;
......@@ -11676,7 +11676,7 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, IrInstGen *instruction
1167611676 break;
1167711677 case 80:
1167811678 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");
1168011680 case 128:
1168111681 return true;
1168211682 default:
......@@ -13068,7 +13068,7 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInst *source_instr,
1306813068 zig_unreachable();
1306913069 case CastOpErrSet:
1307013070 case CastOpBitCast:
13071 zig_panic("TODO");
13071 zig_panic("TODO: eval_const_expr_implicit_cast CastOpErrSet, CastOpBitCast");
1307213072 case CastOpNoop: {
1307313073 copy_const_val(ira->codegen, const_val, other_val);
1307413074 const_val->type = new_type;
......@@ -13088,7 +13088,7 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInst *source_instr,
1308813088 const_val->data.x_f64 = bigfloat_to_f64(&other_val->data.x_bigfloat);
1308913089 break;
1309013090 case 80:
13091 zig_panic("TODO");
13091 zig_panic("TODO: eval_const_expr_implicit_cast c_longdouble");
1309213092 case 128:
1309313093 const_val->data.x_f128 = bigfloat_to_f128(&other_val->data.x_bigfloat);
1309413094 break;
......@@ -13117,7 +13117,7 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInst *source_instr,
1311713117 const_val->data.x_f64 = bigfloat_to_f64(&bigfloat);
1311813118 break;
1311913119 case 80:
13120 zig_panic("TODO");
13120 zig_panic("TODO: eval_const_expr_implicit_cast c_longdouble");
1312113121 case 128:
1312213122 const_val->data.x_f128 = bigfloat_to_f128(&bigfloat);
1312313123 break;
......@@ -21433,7 +21433,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source
2143321433 ZigValue *array_val = ptr_val->data.x_ptr.data.base_array.array_val;
2143421434 assert(array_val->type->id == ZigTypeIdArray);
2143521435 if (array_val->data.x_array.special != ConstArraySpecialNone)
21436 zig_panic("TODO");
21436 zig_panic("TODO: ir_read_const_ptr ConstPtrSpecialSubArray !ConstArraySpecialNone");
2143721437 if (dst_size > src_size) {
2143821438 size_t elem_index = ptr_val->data.x_ptr.data.base_array.elem_index;
2143921439 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
2145821458 ZigValue *array_val = ptr_val->data.x_ptr.data.base_array.array_val;
2145921459 assert(array_val->type->id == ZigTypeIdArray);
2146021460 if (array_val->data.x_array.special != ConstArraySpecialNone)
21461 zig_panic("TODO");
21461 zig_panic("TODO: ir_read_const_ptr ConstPtrSpecialBaseArray !ConstArraySpecialNone");
2146221462 size_t elem_size = src_size;
2146321463 size_t elem_index = ptr_val->data.x_ptr.data.base_array.elem_index;
2146421464 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
2148721487 case ConstPtrSpecialDiscard:
2148821488 case ConstPtrSpecialHardCodedAddr:
2148921489 case ConstPtrSpecialFunction:
21490 zig_panic("TODO");
21490 zig_panic("TODO: ir_read_const_ptr");
2149121491 }
2149221492 zig_unreachable();
2149321493}
......@@ -28815,13 +28815,13 @@ done_with_return_type:
2881528815 case ConstPtrSpecialBaseArray:
2881628816 zig_unreachable();
2881728817 case ConstPtrSpecialBaseStruct:
28818 zig_panic("TODO");
28818 zig_panic("TODO: ir_analyze_instruction_slice ConstPtrSpecialBaseStruct");
2881928819 case ConstPtrSpecialBaseErrorUnionCode:
28820 zig_panic("TODO");
28820 zig_panic("TODO: ir_analyze_instruction_slice ConstPtrSpecialBaseErrorUnionCode");
2882128821 case ConstPtrSpecialBaseErrorUnionPayload:
28822 zig_panic("TODO");
28822 zig_panic("TODO: ir_analyze_instruction_slice ConstPtrSpecialBaseErrorUnionPayload");
2882328823 case ConstPtrSpecialBaseOptionalPayload:
28824 zig_panic("TODO");
28824 zig_panic("TODO: ir_analyze_instruction_slice ConstPtrSpecialBaseOptionalPayload");
2882528825 case ConstPtrSpecialHardCodedAddr:
2882628826 init_const_ptr_hard_coded_addr(ira->codegen, ptr_val,
2882728827 parent_ptr->type->data.pointer.child_type,
......@@ -28829,9 +28829,9 @@ done_with_return_type:
2882928829 return_type_is_const);
2883028830 break;
2883128831 case ConstPtrSpecialFunction:
28832 zig_panic("TODO");
28832 zig_panic("TODO: ir_analyze_instruction_slice ConstPtrSpecialFunction");
2883328833 case ConstPtrSpecialNull:
28834 zig_panic("TODO");
28834 zig_panic("TODO: ir_analyze_instruction_slice ConstPtrSpecialNull");
2883528835 }
2883628836
2883728837 // 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 {
550550 const fn_decl_loc = fn_decl.getLocation();
551551 const has_body = fn_decl.hasBody();
552552 const storage_class = fn_decl.getStorageClass();
553 const decl_ctx = FnDeclContext{
553 var decl_ctx = FnDeclContext{
554554 .fn_name = fn_name,
555555 .has_body = has_body,
556556 .storage_class = storage_class,
......@@ -584,6 +584,12 @@ fn visitFnDecl(c: *Context, fn_decl: *const clang.FunctionDecl) Error!void {
584584 const proto_node = switch (fn_type.getTypeClass()) {
585585 .FunctionProto => blk: {
586586 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 }
587593 break :blk transFnProto(rp, fn_decl, fn_proto_type, fn_decl_loc, decl_ctx, true) catch |err| switch (err) {
588594 error.UnsupportedType => {
589595 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" {
441441
442442 expectEqual(MyIntWrapper{ .x = 42 }, try MyIntWrapper.create());
443443}
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");
33const CrossTarget = std.zig.CrossTarget;
44
55pub 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
615 cases.add("pointer to opaque demoted struct",
716 \\typedef struct {
817 \\ _Atomic int foo;