| author | |
| committer | |
| log | 0a95b0f1ffeb8ae5ee317b02626890adebe5ec63 |
| tree | b81af85f0e9ba611aa24ae8b1c855095f5c8f9e8 |
| parent | 77678b2cbc7ac9ba2d5d4725241f6a9f7ac64fa4 |
4 files changed, 9 insertions(+), 38 deletions(-)
src/ir.cpp-16| ... | ... | @@ -14842,22 +14842,6 @@ static TypeTableEntry *ir_analyze_instruction_unwrap_maybe(IrAnalyze *ira, |
| 14842 | 14842 | TypeTableEntry *type_entry = ptr_type->data.pointer.child_type; |
| 14843 | 14843 | if (type_is_invalid(type_entry)) { |
| 14844 | 14844 | return ira->codegen->builtin_types.entry_invalid; |
| 14845 | } else if (type_entry->id == TypeTableEntryIdMetaType) { | |
| 14846 | // surprise! actually this is just ??T not an unwrap maybe instruction | |
| 14847 | ConstExprValue *ptr_val = const_ptr_pointee(ira->codegen, &value->value); | |
| 14848 | assert(ptr_val->type->id == TypeTableEntryIdMetaType); | |
| 14849 | TypeTableEntry *child_type = ptr_val->data.x_type; | |
| 14850 | ||
| 14851 | type_ensure_zero_bits_known(ira->codegen, child_type); | |
| 14852 | TypeTableEntry *layer1 = get_maybe_type(ira->codegen, child_type); | |
| 14853 | TypeTableEntry *layer2 = get_maybe_type(ira->codegen, layer1); | |
| 14854 | ||
| 14855 | IrInstruction *const_instr = ir_build_const_type(&ira->new_irb, unwrap_maybe_instruction->base.scope, | |
| 14856 | unwrap_maybe_instruction->base.source_node, layer2); | |
| 14857 | IrInstruction *result_instr = ir_get_ref(ira, &unwrap_maybe_instruction->base, const_instr, | |
| 14858 | ptr_type->data.pointer.is_const, ptr_type->data.pointer.is_volatile); | |
| 14859 | ir_link_new_instruction(result_instr, &unwrap_maybe_instruction->base); | |
| 14860 | return result_instr->value.type; | |
| 14861 | 14845 | } else if (type_entry->id != TypeTableEntryIdOptional) { |
| 14862 | 14846 | ir_add_error_node(ira, unwrap_maybe_instruction->value->source_node, |
| 14863 | 14847 | buf_sprintf("expected optional type, found '%s'", buf_ptr(&type_entry->name))); |
std/zig/parse.zig+1-1| ... | ... | @@ -3248,7 +3248,7 @@ fn tokenIdToAssignment(id: *const Token.Id) ?ast.Node.InfixOp.Op { |
| 3248 | 3248 | fn tokenIdToUnwrapExpr(id: @TagType(Token.Id)) ?ast.Node.InfixOp.Op { |
| 3249 | 3249 | return switch (id) { |
| 3250 | 3250 | Token.Id.Keyword_catch => ast.Node.InfixOp.Op{ .Catch = null }, |
| 3251 | Token.Id.QuestionMarkQuestionMark => ast.Node.InfixOp.Op{ .UnwrapOptional = void{} }, | |
| 3251 | Token.Id.Keyword_orelse => ast.Node.InfixOp.Op{ .UnwrapOptional = void{} }, | |
| 3252 | 3252 | else => null, |
| 3253 | 3253 | }; |
| 3254 | 3254 | } |
std/zig/parser_test.zig+1-1| ... | ... | @@ -1151,7 +1151,7 @@ test "zig fmt: infix operators" { |
| 1151 | 1151 | \\ _ = i!i; |
| 1152 | 1152 | \\ _ = i ** i; |
| 1153 | 1153 | \\ _ = i ++ i; |
| 1154 | \\ _ = i ?? i; | |
| 1154 | \\ _ = i orelse i; | |
| 1155 | 1155 | \\ _ = i % i; |
| 1156 | 1156 | \\ _ = i / i; |
| 1157 | 1157 | \\ _ = i *% i; |
std/zig/tokenizer.zig+7-20| ... | ... | @@ -39,6 +39,7 @@ pub const Token = struct { |
| 39 | 39 | Keyword{ .bytes = "noalias", .id = Id.Keyword_noalias }, |
| 40 | 40 | Keyword{ .bytes = "null", .id = Id.Keyword_null }, |
| 41 | 41 | Keyword{ .bytes = "or", .id = Id.Keyword_or }, |
| 42 | Keyword{ .bytes = "orelse", .id = Id.Keyword_orelse }, | |
| 42 | 43 | Keyword{ .bytes = "packed", .id = Id.Keyword_packed }, |
| 43 | 44 | Keyword{ .bytes = "promise", .id = Id.Keyword_promise }, |
| 44 | 45 | Keyword{ .bytes = "pub", .id = Id.Keyword_pub }, |
| ... | ... | @@ -129,7 +130,6 @@ pub const Token = struct { |
| 129 | 130 | Ampersand, |
| 130 | 131 | AmpersandEqual, |
| 131 | 132 | QuestionMark, |
| 132 | QuestionMarkQuestionMark, | |
| 133 | 133 | AngleBracketLeft, |
| 134 | 134 | AngleBracketLeftEqual, |
| 135 | 135 | AngleBracketAngleBracketLeft, |
| ... | ... | @@ -171,6 +171,7 @@ pub const Token = struct { |
| 171 | 171 | Keyword_noalias, |
| 172 | 172 | Keyword_null, |
| 173 | 173 | Keyword_or, |
| 174 | Keyword_orelse, | |
| 174 | 175 | Keyword_packed, |
| 175 | 176 | Keyword_promise, |
| 176 | 177 | Keyword_pub, |
| ... | ... | @@ -254,7 +255,6 @@ pub const Tokenizer = struct { |
| 254 | 255 | Ampersand, |
| 255 | 256 | Caret, |
| 256 | 257 | Percent, |
| 257 | QuestionMark, | |
| 258 | 258 | Plus, |
| 259 | 259 | PlusPercent, |
| 260 | 260 | AngleBracketLeft, |
| ... | ... | @@ -345,6 +345,11 @@ pub const Tokenizer = struct { |
| 345 | 345 | self.index += 1; |
| 346 | 346 | break; |
| 347 | 347 | }, |
| 348 | '?' => { | |
| 349 | result.id = Token.Id.QuestionMark; | |
| 350 | self.index += 1; | |
| 351 | break; | |
| 352 | }, | |
| 348 | 353 | ':' => { |
| 349 | 354 | result.id = Token.Id.Colon; |
| 350 | 355 | self.index += 1; |
| ... | ... | @@ -359,9 +364,6 @@ pub const Tokenizer = struct { |
| 359 | 364 | '+' => { |
| 360 | 365 | state = State.Plus; |
| 361 | 366 | }, |
| 362 | '?' => { | |
| 363 | state = State.QuestionMark; | |
| 364 | }, | |
| 365 | 367 | '<' => { |
| 366 | 368 | state = State.AngleBracketLeft; |
| 367 | 369 | }, |
| ... | ... | @@ -496,18 +498,6 @@ pub const Tokenizer = struct { |
| 496 | 498 | }, |
| 497 | 499 | }, |
| 498 | 500 | |
| 499 | State.QuestionMark => switch (c) { | |
| 500 | '?' => { | |
| 501 | result.id = Token.Id.QuestionMarkQuestionMark; | |
| 502 | self.index += 1; | |
| 503 | break; | |
| 504 | }, | |
| 505 | else => { | |
| 506 | result.id = Token.Id.QuestionMark; | |
| 507 | break; | |
| 508 | }, | |
| 509 | }, | |
| 510 | ||
| 511 | 501 | State.Percent => switch (c) { |
| 512 | 502 | '=' => { |
| 513 | 503 | result.id = Token.Id.PercentEqual; |
| ... | ... | @@ -1084,9 +1074,6 @@ pub const Tokenizer = struct { |
| 1084 | 1074 | State.Plus => { |
| 1085 | 1075 | result.id = Token.Id.Plus; |
| 1086 | 1076 | }, |
| 1087 | State.QuestionMark => { | |
| 1088 | result.id = Token.Id.QuestionMark; | |
| 1089 | }, | |
| 1090 | 1077 | State.Percent => { |
| 1091 | 1078 | result.id = Token.Id.Percent; |
| 1092 | 1079 | }, |