authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-08-30 00:17:11-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-08-30 00:17:11-04:00
logc2357830b4350a4685f867566afd79eaf2cb3c66
tree87e589aa52859f735e951f536c9f3525b11ea057
parentb35dad88b474bf346131696f5cb0e01a5b1c45c1

add "child" field to pointer type


2 files changed, 18 insertions(+), 0 deletions(-)

src/ir.cpp+14
...@@ -11416,6 +11416,20 @@ static TypeTableEntry *ir_analyze_instruction_field_ptr(IrAnalyze *ira, IrInstru...@@ -11416,6 +11416,20 @@ static TypeTableEntry *ir_analyze_instruction_field_ptr(IrAnalyze *ira, IrInstru
11416 buf_ptr(&child_type->name), buf_ptr(field_name)));11416 buf_ptr(&child_type->name), buf_ptr(field_name)));
11417 return ira->codegen->builtin_types.entry_invalid;11417 return ira->codegen->builtin_types.entry_invalid;
11418 }11418 }
11419 } else if (child_type->id == TypeTableEntryIdPointer) {
11420 if (buf_eql_str(field_name, "child")) {
11421 bool ptr_is_const = true;
11422 bool ptr_is_volatile = false;
11423 return ir_analyze_const_ptr(ira, &field_ptr_instruction->base,
11424 create_const_type(ira->codegen, child_type->data.pointer.child_type),
11425 ira->codegen->builtin_types.entry_type,
11426 ConstPtrMutComptimeConst, ptr_is_const, ptr_is_volatile);
11427 } else {
11428 ir_add_error(ira, &field_ptr_instruction->base,
11429 buf_sprintf("type '%s' has no member called '%s'",
11430 buf_ptr(&child_type->name), buf_ptr(field_name)));
11431 return ira->codegen->builtin_types.entry_invalid;
11432 }
11419 } else {11433 } else {
11420 ir_add_error(ira, &field_ptr_instruction->base,11434 ir_add_error(ira, &field_ptr_instruction->base,
11421 buf_sprintf("type '%s' does not support field access", buf_ptr(&child_type->name)));11435 buf_sprintf("type '%s' does not support field access", buf_ptr(&child_type->name)));
test/cases/misc.zig+4
...@@ -534,3 +534,7 @@ const vram = @intToPtr(&volatile u8, 0x20000000)[0..0x8000];...@@ -534,3 +534,7 @@ const vram = @intToPtr(&volatile u8, 0x20000000)[0..0x8000];
534export fn writeToVRam() {534export fn writeToVRam() {
535 vram[0] = 'X';535 vram[0] = 'X';
536}536}
537
538test "pointer child field" {
539 assert((&u32).child == u32);
540}