@@ -230,6 +230,7 @@ bool type_is_complete(TypeTableEntry *type_entry) {
230
230
case TypeTableEntryIdBlock:
231
231
case TypeTableEntryIdBoundFn:
232
232
case TypeTableEntryIdArgTuple:
233
+ case TypeTableEntryIdPromise:
233
234
return true ;
234
235
}
235
236
zig_unreachable ();
@@ -267,6 +268,7 @@ bool type_has_zero_bits_known(TypeTableEntry *type_entry) {
267
268
case TypeTableEntryIdBoundFn:
268
269
case TypeTableEntryIdArgTuple:
269
270
case TypeTableEntryIdOpaque:
271
+ case TypeTableEntryIdPromise:
270
272
return true ;
271
273
}
272
274
zig_unreachable ();
@@ -339,6 +341,32 @@ TypeTableEntry *get_smallest_unsigned_int_type(CodeGen *g, uint64_t x) {
339
341
return get_int_type (g, false , bits_needed_for_unsigned (x));
340
342
}
341
343
344
+ TypeTableEntry *get_promise_type (CodeGen *g, TypeTableEntry *result_type) {
345
+ if (result_type != nullptr && result_type->promise_parent != nullptr ) {
346
+ return result_type->promise_parent ;
347
+ } else if (result_type == nullptr && g->builtin_types .entry_promise != nullptr ) {
348
+ return g->builtin_types .entry_promise ;
349
+ }
350
+
351
+ TypeTableEntry *u8_ptr_type = get_pointer_to_type (g, g->builtin_types .entry_u8 , false );
352
+ TypeTableEntry *entry = new_type_table_entry (TypeTableEntryIdPromise);
353
+ entry->type_ref = u8_ptr_type->type_ref ;
354
+ entry->zero_bits = false ;
355
+ entry->data .promise .result_type = result_type;
356
+ buf_init_from_str (&entry->name , " promise" );
357
+ if (result_type != nullptr ) {
358
+ buf_appendf (&entry->name , " ->%s" , buf_ptr (&result_type->name ));
359
+ }
360
+ entry->di_type = u8_ptr_type->di_type ;
361
+
362
+ if (result_type != nullptr ) {
363
+ result_type->promise_parent = entry;
364
+ } else if (result_type == nullptr ) {
365
+ g->builtin_types .entry_promise = entry;
366
+ }
367
+ return entry;
368
+ }
369
+
342
370
TypeTableEntry *get_pointer_to_type_extra (CodeGen *g, TypeTableEntry *child_type, bool is_const,
343
371
bool is_volatile, uint32_t byte_alignment, uint32_t bit_offset, uint32_t unaligned_bit_count)
344
372
{
@@ -1203,6 +1231,7 @@ static bool type_allowed_in_packed_struct(TypeTableEntry *type_entry) {
1203
1231
case TypeTableEntryIdBoundFn:
1204
1232
case TypeTableEntryIdArgTuple:
1205
1233
case TypeTableEntryIdOpaque:
1234
+ case TypeTableEntryIdPromise:
1206
1235
return false ;
1207
1236
case TypeTableEntryIdVoid:
1208
1237
case TypeTableEntryIdBool:
@@ -1243,6 +1272,7 @@ static bool type_allowed_in_extern(CodeGen *g, TypeTableEntry *type_entry) {
1243
1272
case TypeTableEntryIdBlock:
1244
1273
case TypeTableEntryIdBoundFn:
1245
1274
case TypeTableEntryIdArgTuple:
1275
+ case TypeTableEntryIdPromise:
1246
1276
return false ;
1247
1277
case TypeTableEntryIdOpaque:
1248
1278
case TypeTableEntryIdUnreachable:
@@ -1383,7 +1413,7 @@ static TypeTableEntry *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *c
1383
1413
case TypeTableEntryIdBoundFn:
1384
1414
case TypeTableEntryIdMetaType:
1385
1415
add_node_error (g, param_node->data .param_decl .type ,
1386
- buf_sprintf (" parameter of type '%s' must be declared inline " ,
1416
+ buf_sprintf (" parameter of type '%s' must be declared comptime " ,
1387
1417
buf_ptr (&type_entry->name )));
1388
1418
return g->builtin_types .entry_invalid ;
1389
1419
case TypeTableEntryIdVoid:
@@ -1399,6 +1429,7 @@ static TypeTableEntry *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *c
1399
1429
case TypeTableEntryIdEnum:
1400
1430
case TypeTableEntryIdUnion:
1401
1431
case TypeTableEntryIdFn:
1432
+ case TypeTableEntryIdPromise:
1402
1433
ensure_complete_type (g, type_entry);
1403
1434
if (fn_type_id.cc == CallingConventionUnspecified && !type_is_copyable (g, type_entry)) {
1404
1435
add_node_error (g, param_node->data .param_decl .type ,
@@ -1480,6 +1511,7 @@ static TypeTableEntry *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *c
1480
1511
case TypeTableEntryIdEnum:
1481
1512
case TypeTableEntryIdUnion:
1482
1513
case TypeTableEntryIdFn:
1514
+ case TypeTableEntryIdPromise:
1483
1515
break ;
1484
1516
}
1485
1517
@@ -3175,6 +3207,7 @@ TypeTableEntry *validate_var_type(CodeGen *g, AstNode *source_node, TypeTableEnt
3175
3207
case TypeTableEntryIdUnion:
3176
3208
case TypeTableEntryIdFn:
3177
3209
case TypeTableEntryIdBoundFn:
3210
+ case TypeTableEntryIdPromise:
3178
3211
return type_entry;
3179
3212
}
3180
3213
zig_unreachable ();
@@ -3553,6 +3586,7 @@ static bool is_container(TypeTableEntry *type_entry) {
3553
3586
case TypeTableEntryIdBoundFn:
3554
3587
case TypeTableEntryIdArgTuple:
3555
3588
case TypeTableEntryIdOpaque:
3589
+ case TypeTableEntryIdPromise:
3556
3590
return false ;
3557
3591
}
3558
3592
zig_unreachable ();
@@ -3603,6 +3637,7 @@ void resolve_container_type(CodeGen *g, TypeTableEntry *type_entry) {
3603
3637
case TypeTableEntryIdVar:
3604
3638
case TypeTableEntryIdArgTuple:
3605
3639
case TypeTableEntryIdOpaque:
3640
+ case TypeTableEntryIdPromise:
3606
3641
zig_unreachable ();
3607
3642
}
3608
3643
}
@@ -4095,6 +4130,7 @@ bool handle_is_ptr(TypeTableEntry *type_entry) {
4095
4130
case TypeTableEntryIdErrorSet:
4096
4131
case TypeTableEntryIdFn:
4097
4132
case TypeTableEntryIdEnum:
4133
+ case TypeTableEntryIdPromise:
4098
4134
return false ;
4099
4135
case TypeTableEntryIdArray:
4100
4136
case TypeTableEntryIdStruct:
@@ -4342,6 +4378,9 @@ static uint32_t hash_const_val(ConstExprValue *const_val) {
4342
4378
}
4343
4379
zig_unreachable ();
4344
4380
}
4381
+ case TypeTableEntryIdPromise:
4382
+ // TODO better hashing algorithm
4383
+ return 223048345 ;
4345
4384
case TypeTableEntryIdUndefLit:
4346
4385
return 162837799 ;
4347
4386
case TypeTableEntryIdNullLit:
@@ -4501,6 +4540,7 @@ bool type_requires_comptime(TypeTableEntry *type_entry) {
4501
4540
case TypeTableEntryIdPointer:
4502
4541
case TypeTableEntryIdVoid:
4503
4542
case TypeTableEntryIdUnreachable:
4543
+ case TypeTableEntryIdPromise:
4504
4544
return false ;
4505
4545
}
4506
4546
zig_unreachable ();
@@ -4970,6 +5010,7 @@ bool const_values_equal(ConstExprValue *a, ConstExprValue *b) {
4970
5010
case TypeTableEntryIdInvalid:
4971
5011
case TypeTableEntryIdUnreachable:
4972
5012
case TypeTableEntryIdVar:
5013
+ case TypeTableEntryIdPromise:
4973
5014
zig_unreachable ();
4974
5015
}
4975
5016
zig_unreachable ();
@@ -5244,6 +5285,8 @@ void render_const_value(CodeGen *g, Buf *buf, ConstExprValue *const_val) {
5244
5285
buf_appendf (buf, " (args value)" );
5245
5286
return ;
5246
5287
}
5288
+ case TypeTableEntryIdPromise:
5289
+ zig_unreachable ();
5247
5290
}
5248
5291
zig_unreachable ();
5249
5292
}
@@ -5305,6 +5348,7 @@ uint32_t type_id_hash(TypeId x) {
5305
5348
case TypeTableEntryIdBlock:
5306
5349
case TypeTableEntryIdBoundFn:
5307
5350
case TypeTableEntryIdArgTuple:
5351
+ case TypeTableEntryIdPromise:
5308
5352
zig_unreachable ();
5309
5353
case TypeTableEntryIdErrorUnion:
5310
5354
return hash_ptr (x.data .error_union .err_set_type ) ^ hash_ptr (x.data .error_union .payload_type );
@@ -5342,6 +5386,7 @@ bool type_id_eql(TypeId a, TypeId b) {
5342
5386
case TypeTableEntryIdUndefLit:
5343
5387
case TypeTableEntryIdNullLit:
5344
5388
case TypeTableEntryIdMaybe:
5389
+ case TypeTableEntryIdPromise:
5345
5390
case TypeTableEntryIdErrorSet:
5346
5391
case TypeTableEntryIdEnum:
5347
5392
case TypeTableEntryIdUnion:
@@ -5469,6 +5514,7 @@ static const TypeTableEntryId all_type_ids[] = {
5469
5514
TypeTableEntryIdBoundFn,
5470
5515
TypeTableEntryIdArgTuple,
5471
5516
TypeTableEntryIdOpaque,
5517
+ TypeTableEntryIdPromise,
5472
5518
};
5473
5519
5474
5520
TypeTableEntryId type_id_at_index (size_t index) {
@@ -5533,6 +5579,8 @@ size_t type_id_index(TypeTableEntryId id) {
5533
5579
return 22 ;
5534
5580
case TypeTableEntryIdOpaque:
5535
5581
return 23 ;
5582
+ case TypeTableEntryIdPromise:
5583
+ return 24 ;
5536
5584
}
5537
5585
zig_unreachable ();
5538
5586
}
@@ -5590,6 +5638,8 @@ const char *type_id_name(TypeTableEntryId id) {
5590
5638
return " ArgTuple" ;
5591
5639
case TypeTableEntryIdOpaque:
5592
5640
return " Opaque" ;
5641
+ case TypeTableEntryIdPromise:
5642
+ return " Promise" ;
5593
5643
}
5594
5644
zig_unreachable ();
5595
5645
}
0 commit comments