authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-11-16 14:07:23+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-11-16 10:15:13-05:00
logbe9bb0a8572577f5e5bbac83ff25b88467906d70
treedda5689eddd5fa857abc70f114d678bb8069c295
parent332fdf33eeeb0560d3f854c816196214aa4e9bc9

Fixed #1663 and removed IrInstructionArrayLen


5 files changed, 20 insertions(+), 74 deletions(-)

src/all_types.hpp-7
......@@ -2071,7 +2071,6 @@ enum IrInstructionId {
20712071 IrInstructionIdCInclude,
20722072 IrInstructionIdCDefine,
20732073 IrInstructionIdCUndef,
2074 IrInstructionIdArrayLen,
20752074 IrInstructionIdRef,
20762075 IrInstructionIdCompileErr,
20772076 IrInstructionIdCompileLog,
......@@ -2584,12 +2583,6 @@ struct IrInstructionImport {
25842583 IrInstruction *name;
25852584};
25862585
2587struct IrInstructionArrayLen {
2588 IrInstruction base;
2589
2590 IrInstruction *array_value;
2591};
2592
25932586struct IrInstructionRef {
25942587 IrInstruction base;
25952588
src/codegen.cpp-1
......@@ -5102,7 +5102,6 @@ static LLVMValueRef ir_render_instruction(CodeGen *g, IrExecutable *executable,
51025102 case IrInstructionIdContainerInitFields:
51035103 case IrInstructionIdCompileErr:
51045104 case IrInstructionIdCompileLog:
5105 case IrInstructionIdArrayLen:
51065105 case IrInstructionIdImport:
51075106 case IrInstructionIdCImport:
51085107 case IrInstructionIdCInclude:
src/ir.cpp+10-57
......@@ -479,10 +479,6 @@ static constexpr IrInstructionId ir_instruction_id(IrInstructionCUndef *) {
479479 return IrInstructionIdCUndef;
480480}
481481
482static constexpr IrInstructionId ir_instruction_id(IrInstructionArrayLen *) {
483 return IrInstructionIdArrayLen;
484}
485
486482static constexpr IrInstructionId ir_instruction_id(IrInstructionRef *) {
487483 return IrInstructionIdRef;
488484}
......@@ -1663,15 +1659,6 @@ static IrInstruction *ir_build_import(IrBuilder *irb, Scope *scope, AstNode *sou
16631659 return &instruction->base;
16641660}
16651661
1666static IrInstruction *ir_build_array_len(IrBuilder *irb, Scope *scope, AstNode *source_node, IrInstruction *array_value) {
1667 IrInstructionArrayLen *instruction = ir_build_instruction<IrInstructionArrayLen>(irb, scope, source_node);
1668 instruction->array_value = array_value;
1669
1670 ir_ref_instruction(array_value, irb->current_basic_block);
1671
1672 return &instruction->base;
1673}
1674
16751662static IrInstruction *ir_build_ref(IrBuilder *irb, Scope *scope, AstNode *source_node, IrInstruction *value,
16761663 bool is_const, bool is_volatile)
16771664{
......@@ -5351,7 +5338,9 @@ static IrInstruction *ir_gen_for_expr(IrBuilder *irb, Scope *parent_scope, AstNo
53515338 IrBasicBlock *else_block = else_node ? ir_create_basic_block(irb, child_scope, "ForElse") : end_block;
53525339 IrBasicBlock *continue_block = ir_create_basic_block(irb, child_scope, "ForContinue");
53535340
5354 IrInstruction *len_val = ir_build_array_len(irb, child_scope, node, array_val);
5341 Buf *len_field_name = buf_create_from_str("len");
5342 IrInstruction *len_ref = ir_build_field_ptr(irb, child_scope, node, array_val_ptr, len_field_name);
5343 IrInstruction *len_val = ir_build_load_ptr(irb, child_scope, node, len_ref);
53555344 ir_build_br(irb, child_scope, node, cond_block, is_comptime);
53565345
53575346 ir_set_cursor_at_end_and_append_block(irb, cond_block);
......@@ -9450,12 +9439,6 @@ static IrInstruction *ir_const_unsigned(IrAnalyze *ira, IrInstruction *source_in
94509439 return result;
94519440}
94529441
9453static IrInstruction *ir_const_usize(IrAnalyze *ira, IrInstruction *source_instruction, uint64_t value) {
9454 IrInstruction *result = ir_const(ira, source_instruction, ira->codegen->builtin_types.entry_usize);
9455 bigint_init_unsigned(&result->value.data.x_bigint, value);
9456 return result;
9457}
9458
94599442static IrInstruction *ir_get_const_ptr(IrAnalyze *ira, IrInstruction *instruction,
94609443 ConstExprValue *pointee, ZigType *pointee_type,
94619444 ConstPtrMut ptr_mut, bool ptr_is_const, bool ptr_is_volatile, uint32_t ptr_align)
......@@ -14971,8 +14954,14 @@ static IrInstruction *ir_analyze_instruction_to_ptr_type(IrAnalyze *ira,
1497114954
1497214955 ZigType *ptr_type;
1497314956 if (type_entry->id == ZigTypeIdArray) {
14957 // TODO: Allow capturing pointer to const array.
14958 // const a = "123"; for (a) |*c| continue;
14959 // error: expected type '*u8', found '*const u8'
1497414960 ptr_type = get_pointer_to_type(ira->codegen, type_entry->data.array.child_type, false);
14975 } else if (is_slice(type_entry)) {
14961 } else if (is_array_ref(type_entry)) {
14962 ptr_type = get_pointer_to_type(ira->codegen,
14963 type_entry->data.pointer.child_type->data.array.child_type, type_entry->data.pointer.is_const);
14964 } else if (is_slice(type_entry)) {
1497614965 ptr_type = adjust_ptr_len(ira->codegen, type_entry->data.structure.fields[0].type_entry, PtrLenSingle);
1497714966 } else if (type_entry->id == ZigTypeIdArgTuple) {
1497814967 ConstExprValue *arg_tuple_val = ir_resolve_const(ira, value, UndefBad);
......@@ -15959,39 +15948,6 @@ static IrInstruction *ir_analyze_instruction_import(IrAnalyze *ira, IrInstructio
1595915948 return result;
1596015949}
1596115950
15962static IrInstruction *ir_analyze_instruction_array_len(IrAnalyze *ira,
15963 IrInstructionArrayLen *array_len_instruction)
15964{
15965 IrInstruction *array_value = array_len_instruction->array_value->child;
15966 ZigType *type_entry = array_value->value.type;
15967 if (type_is_invalid(type_entry)) {
15968 return ira->codegen->invalid_instruction;
15969 } else if (type_entry->id == ZigTypeIdArray) {
15970 return ir_const_usize(ira, &array_len_instruction->base,
15971 type_entry->data.array.len);
15972 } else if (is_slice(type_entry)) {
15973 if (array_value->value.special != ConstValSpecialRuntime) {
15974 ConstExprValue *len_val = &array_value->value.data.x_struct.fields[slice_len_index];
15975 if (len_val->special != ConstValSpecialRuntime) {
15976 return ir_const_usize(ira, &array_len_instruction->base,
15977 bigint_as_unsigned(&len_val->data.x_bigint));
15978 }
15979 }
15980 TypeStructField *field = &type_entry->data.structure.fields[slice_len_index];
15981 IrInstruction *len_ptr = ir_build_struct_field_ptr(&ira->new_irb, array_len_instruction->base.scope,
15982 array_len_instruction->base.source_node, array_value, field);
15983 len_ptr->value.type = get_pointer_to_type(ira->codegen, ira->codegen->builtin_types.entry_usize, true);
15984 IrInstruction *result = ir_build_load_ptr(&ira->new_irb,
15985 array_len_instruction->base.scope, array_len_instruction->base.source_node, len_ptr);
15986 result->value.type = ira->codegen->builtin_types.entry_usize;
15987 return result;
15988 } else {
15989 ir_add_error_node(ira, array_len_instruction->base.source_node,
15990 buf_sprintf("type '%s' has no field 'len'", buf_ptr(&array_value->value.type->name)));
15991 return ira->codegen->invalid_instruction;
15992 }
15993}
15994
1599515951static IrInstruction *ir_analyze_instruction_ref(IrAnalyze *ira, IrInstructionRef *ref_instruction) {
1599615952 IrInstruction *value = ref_instruction->value->child;
1599715953 if (type_is_invalid(value->value.type))
......@@ -20893,8 +20849,6 @@ static IrInstruction *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstructio
2089320849 return ir_analyze_instruction_union_tag(ira, (IrInstructionUnionTag *)instruction);
2089420850 case IrInstructionIdImport:
2089520851 return ir_analyze_instruction_import(ira, (IrInstructionImport *)instruction);
20896 case IrInstructionIdArrayLen:
20897 return ir_analyze_instruction_array_len(ira, (IrInstructionArrayLen *)instruction);
2089820852 case IrInstructionIdRef:
2089920853 return ir_analyze_instruction_ref(ira, (IrInstructionRef *)instruction);
2090020854 case IrInstructionIdContainerInitList:
......@@ -21228,7 +21182,6 @@ bool ir_has_side_effects(IrInstruction *instruction) {
2122821182 case IrInstructionIdTypeOf:
2122921183 case IrInstructionIdToPtrType:
2123021184 case IrInstructionIdPtrTypeChild:
21231 case IrInstructionIdArrayLen:
2123221185 case IrInstructionIdStructFieldPtr:
2123321186 case IrInstructionIdUnionFieldPtr:
2123421187 case IrInstructionIdArrayType:
src/ir_print.cpp-8
......@@ -553,11 +553,6 @@ static void ir_print_import(IrPrint *irp, IrInstructionImport *instruction) {
553553 fprintf(irp->f, ")");
554554}
555555
556static void ir_print_array_len(IrPrint *irp, IrInstructionArrayLen *instruction) {
557 ir_print_other_instruction(irp, instruction->array_value);
558 fprintf(irp->f, ".len");
559}
560
561556static void ir_print_ref(IrPrint *irp, IrInstructionRef *instruction) {
562557 const char *const_str = instruction->is_const ? "const " : "";
563558 const char *volatile_str = instruction->is_volatile ? "volatile " : "";
......@@ -1462,9 +1457,6 @@ static void ir_print_instruction(IrPrint *irp, IrInstruction *instruction) {
14621457 case IrInstructionIdImport:
14631458 ir_print_import(irp, (IrInstructionImport *)instruction);
14641459 break;
1465 case IrInstructionIdArrayLen:
1466 ir_print_array_len(irp, (IrInstructionArrayLen *)instruction);
1467 break;
14681460 case IrInstructionIdRef:
14691461 ir_print_ref(irp, (IrInstructionRef *)instruction);
14701462 break;
test/cases/for.zig+10-1
......@@ -35,7 +35,7 @@ fn mangleString(s: []u8) void {
3535}
3636
3737test "basic for loop" {
38 const expected_result = []u8{ 9, 8, 7, 6, 0, 1, 2, 3, 9, 8, 7, 6, 0, 1, 2, 3 };
38 const expected_result = []u8{ 9, 8, 7, 6, 0, 1, 2, 3 } ** 3;
3939
4040 var buffer: [expected_result.len]u8 = undefined;
4141 var buf_index: usize = 0;
......@@ -49,6 +49,15 @@ test "basic for loop" {
4949 buffer[buf_index] = @intCast(u8, index);
5050 buf_index += 1;
5151 }
52 const array_ptr = &array;
53 for (array_ptr) |item| {
54 buffer[buf_index] = item;
55 buf_index += 1;
56 }
57 for (array_ptr) |item, index| {
58 buffer[buf_index] = @intCast(u8, index);
59 buf_index += 1;
60 }
5261 const unknown_size: []const u8 = array;
5362 for (unknown_size) |item| {
5463 buffer[buf_index] = item;