aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorJimmi Holst Christensen <jhc@liab.dk>2018-11-16 14:07:23 +0100
committerAndrew Kelley <superjoe30@gmail.com>2018-11-16 10:15:13 -0500
commitbe9bb0a8572577f5e5bbac83ff25b88467906d70 (patch)
treedda5689eddd5fa857abc70f114d678bb8069c295 /src/ir.cpp
parent332fdf33eeeb0560d3f854c816196214aa4e9bc9 (diff)
downloadzig-be9bb0a8572577f5e5bbac83ff25b88467906d70.tar.gz
zig-be9bb0a8572577f5e5bbac83ff25b88467906d70.zip
Fixed #1663 and removed IrInstructionArrayLen
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp67
1 files changed, 10 insertions, 57 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 128b53fc2d..2c499e885d 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -479,10 +479,6 @@ static constexpr IrInstructionId ir_instruction_id(IrInstructionCUndef *) {
return IrInstructionIdCUndef;
}
-static constexpr IrInstructionId ir_instruction_id(IrInstructionArrayLen *) {
- return IrInstructionIdArrayLen;
-}
-
static constexpr IrInstructionId ir_instruction_id(IrInstructionRef *) {
return IrInstructionIdRef;
}
@@ -1663,15 +1659,6 @@ static IrInstruction *ir_build_import(IrBuilder *irb, Scope *scope, AstNode *sou
return &instruction->base;
}
-static IrInstruction *ir_build_array_len(IrBuilder *irb, Scope *scope, AstNode *source_node, IrInstruction *array_value) {
- IrInstructionArrayLen *instruction = ir_build_instruction<IrInstructionArrayLen>(irb, scope, source_node);
- instruction->array_value = array_value;
-
- ir_ref_instruction(array_value, irb->current_basic_block);
-
- return &instruction->base;
-}
-
static IrInstruction *ir_build_ref(IrBuilder *irb, Scope *scope, AstNode *source_node, IrInstruction *value,
bool is_const, bool is_volatile)
{
@@ -5351,7 +5338,9 @@ static IrInstruction *ir_gen_for_expr(IrBuilder *irb, Scope *parent_scope, AstNo
IrBasicBlock *else_block = else_node ? ir_create_basic_block(irb, child_scope, "ForElse") : end_block;
IrBasicBlock *continue_block = ir_create_basic_block(irb, child_scope, "ForContinue");
- IrInstruction *len_val = ir_build_array_len(irb, child_scope, node, array_val);
+ Buf *len_field_name = buf_create_from_str("len");
+ IrInstruction *len_ref = ir_build_field_ptr(irb, child_scope, node, array_val_ptr, len_field_name);
+ IrInstruction *len_val = ir_build_load_ptr(irb, child_scope, node, len_ref);
ir_build_br(irb, child_scope, node, cond_block, is_comptime);
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
return result;
}
-static IrInstruction *ir_const_usize(IrAnalyze *ira, IrInstruction *source_instruction, uint64_t value) {
- IrInstruction *result = ir_const(ira, source_instruction, ira->codegen->builtin_types.entry_usize);
- bigint_init_unsigned(&result->value.data.x_bigint, value);
- return result;
-}
-
static IrInstruction *ir_get_const_ptr(IrAnalyze *ira, IrInstruction *instruction,
ConstExprValue *pointee, ZigType *pointee_type,
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,
ZigType *ptr_type;
if (type_entry->id == ZigTypeIdArray) {
+ // TODO: Allow capturing pointer to const array.
+ // const a = "123"; for (a) |*c| continue;
+ // error: expected type '*u8', found '*const u8'
ptr_type = get_pointer_to_type(ira->codegen, type_entry->data.array.child_type, false);
- } else if (is_slice(type_entry)) {
+ } else if (is_array_ref(type_entry)) {
+ ptr_type = get_pointer_to_type(ira->codegen,
+ type_entry->data.pointer.child_type->data.array.child_type, type_entry->data.pointer.is_const);
+ } else if (is_slice(type_entry)) {
ptr_type = adjust_ptr_len(ira->codegen, type_entry->data.structure.fields[0].type_entry, PtrLenSingle);
} else if (type_entry->id == ZigTypeIdArgTuple) {
ConstExprValue *arg_tuple_val = ir_resolve_const(ira, value, UndefBad);
@@ -15959,39 +15948,6 @@ static IrInstruction *ir_analyze_instruction_import(IrAnalyze *ira, IrInstructio
return result;
}
-static IrInstruction *ir_analyze_instruction_array_len(IrAnalyze *ira,
- IrInstructionArrayLen *array_len_instruction)
-{
- IrInstruction *array_value = array_len_instruction->array_value->child;
- ZigType *type_entry = array_value->value.type;
- if (type_is_invalid(type_entry)) {
- return ira->codegen->invalid_instruction;
- } else if (type_entry->id == ZigTypeIdArray) {
- return ir_const_usize(ira, &array_len_instruction->base,
- type_entry->data.array.len);
- } else if (is_slice(type_entry)) {
- if (array_value->value.special != ConstValSpecialRuntime) {
- ConstExprValue *len_val = &array_value->value.data.x_struct.fields[slice_len_index];
- if (len_val->special != ConstValSpecialRuntime) {
- return ir_const_usize(ira, &array_len_instruction->base,
- bigint_as_unsigned(&len_val->data.x_bigint));
- }
- }
- TypeStructField *field = &type_entry->data.structure.fields[slice_len_index];
- IrInstruction *len_ptr = ir_build_struct_field_ptr(&ira->new_irb, array_len_instruction->base.scope,
- array_len_instruction->base.source_node, array_value, field);
- len_ptr->value.type = get_pointer_to_type(ira->codegen, ira->codegen->builtin_types.entry_usize, true);
- IrInstruction *result = ir_build_load_ptr(&ira->new_irb,
- array_len_instruction->base.scope, array_len_instruction->base.source_node, len_ptr);
- result->value.type = ira->codegen->builtin_types.entry_usize;
- return result;
- } else {
- ir_add_error_node(ira, array_len_instruction->base.source_node,
- buf_sprintf("type '%s' has no field 'len'", buf_ptr(&array_value->value.type->name)));
- return ira->codegen->invalid_instruction;
- }
-}
-
static IrInstruction *ir_analyze_instruction_ref(IrAnalyze *ira, IrInstructionRef *ref_instruction) {
IrInstruction *value = ref_instruction->value->child;
if (type_is_invalid(value->value.type))
@@ -20893,8 +20849,6 @@ static IrInstruction *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstructio
return ir_analyze_instruction_union_tag(ira, (IrInstructionUnionTag *)instruction);
case IrInstructionIdImport:
return ir_analyze_instruction_import(ira, (IrInstructionImport *)instruction);
- case IrInstructionIdArrayLen:
- return ir_analyze_instruction_array_len(ira, (IrInstructionArrayLen *)instruction);
case IrInstructionIdRef:
return ir_analyze_instruction_ref(ira, (IrInstructionRef *)instruction);
case IrInstructionIdContainerInitList:
@@ -21228,7 +21182,6 @@ bool ir_has_side_effects(IrInstruction *instruction) {
case IrInstructionIdTypeOf:
case IrInstructionIdToPtrType:
case IrInstructionIdPtrTypeChild:
- case IrInstructionIdArrayLen:
case IrInstructionIdStructFieldPtr:
case IrInstructionIdUnionFieldPtr:
case IrInstructionIdArrayType: