@@ -1428,7 +1428,11 @@ pub fn (mut t Table) resolve_generic_to_concrete(generic_type Type, generic_name
1428
1428
if typ == 0 {
1429
1429
return none
1430
1430
}
1431
- return typ.derive_add_muls (generic_type).clear_flag (.generic)
1431
+ if typ.has_flag (.generic) {
1432
+ return typ.derive_add_muls (generic_type).set_flag (.generic)
1433
+ } else {
1434
+ return typ.derive_add_muls (generic_type).clear_flag (.generic)
1435
+ }
1432
1436
}
1433
1437
match mut sym.info {
1434
1438
Array {
@@ -1443,32 +1447,48 @@ pub fn (mut t Table) resolve_generic_to_concrete(generic_type Type, generic_name
1443
1447
}
1444
1448
if typ := t.resolve_generic_to_concrete (elem_type, generic_names, concrete_types) {
1445
1449
idx := t.find_or_register_array_with_dims (typ, dims)
1446
- return new_type (idx).derive_add_muls (generic_type).clear_flag (.generic)
1450
+ if typ.has_flag (.generic) {
1451
+ return new_type (idx).derive_add_muls (generic_type).set_flag (.generic)
1452
+ } else {
1453
+ return new_type (idx).derive_add_muls (generic_type).clear_flag (.generic)
1454
+ }
1447
1455
}
1448
1456
}
1449
1457
ArrayFixed {
1450
1458
if typ := t.resolve_generic_to_concrete (sym.info.elem_type, generic_names,
1451
1459
concrete_types)
1452
1460
{
1453
1461
idx := t.find_or_register_array_fixed (typ, sym.info.size, None{})
1454
- return new_type (idx).derive_add_muls (generic_type).clear_flag (.generic)
1462
+ if typ.has_flag (.generic) {
1463
+ return new_type (idx).derive_add_muls (generic_type).set_flag (.generic)
1464
+ } else {
1465
+ return new_type (idx).derive_add_muls (generic_type).clear_flag (.generic)
1466
+ }
1455
1467
}
1456
1468
}
1457
1469
Chan {
1458
1470
if typ := t.resolve_generic_to_concrete (sym.info.elem_type, generic_names,
1459
1471
concrete_types)
1460
1472
{
1461
1473
idx := t.find_or_register_chan (typ, typ.nr_muls () > 0 )
1462
- return new_type (idx).derive_add_muls (generic_type).clear_flag (.generic)
1474
+ if typ.has_flag (.generic) {
1475
+ return new_type (idx).derive_add_muls (generic_type).set_flag (.generic)
1476
+ } else {
1477
+ return new_type (idx).derive_add_muls (generic_type).clear_flag (.generic)
1478
+ }
1463
1479
}
1464
1480
}
1465
1481
FnType {
1466
1482
mut func := sym.info.func
1483
+ mut has_generic := false
1467
1484
if func.return_type.has_flag (.generic) {
1468
1485
if typ := t.resolve_generic_to_concrete (func.return_type, generic_names,
1469
1486
concrete_types)
1470
1487
{
1471
1488
func.return_type = typ
1489
+ if typ.has_flag (.generic) {
1490
+ has_generic = true
1491
+ }
1472
1492
}
1473
1493
}
1474
1494
func.params = func.params.clone ()
@@ -1478,12 +1498,19 @@ pub fn (mut t Table) resolve_generic_to_concrete(generic_type Type, generic_name
1478
1498
concrete_types)
1479
1499
{
1480
1500
param.typ = typ
1501
+ if typ.has_flag (.generic) {
1502
+ has_generic = true
1503
+ }
1481
1504
}
1482
1505
}
1483
1506
}
1484
1507
func.name = ''
1485
1508
idx := t.find_or_register_fn_type ('' , func, true , false )
1486
- return new_type (idx).derive_add_muls (generic_type).clear_flag (.generic)
1509
+ if has_generic {
1510
+ return new_type (idx).derive_add_muls (generic_type).set_flag (.generic)
1511
+ } else {
1512
+ return new_type (idx).derive_add_muls (generic_type).clear_flag (.generic)
1513
+ }
1487
1514
}
1488
1515
MultiReturn {
1489
1516
mut types := []Type{}
@@ -1498,7 +1525,11 @@ pub fn (mut t Table) resolve_generic_to_concrete(generic_type Type, generic_name
1498
1525
}
1499
1526
if type_changed {
1500
1527
idx := t.find_or_register_multi_return (types)
1501
- return new_type (idx).derive_add_muls (generic_type).clear_flag (.generic)
1528
+ if types.any (it .has_flag (.generic)) {
1529
+ return new_type (idx).derive_add_muls (generic_type).set_flag (.generic)
1530
+ } else {
1531
+ return new_type (idx).derive_add_muls (generic_type).clear_flag (.generic)
1532
+ }
1502
1533
}
1503
1534
}
1504
1535
Map {
@@ -1519,7 +1550,11 @@ pub fn (mut t Table) resolve_generic_to_concrete(generic_type Type, generic_name
1519
1550
}
1520
1551
if type_changed {
1521
1552
idx := t.find_or_register_map (unwrapped_key_type, unwrapped_value_type)
1522
- return new_type (idx).derive_add_muls (generic_type).clear_flag (.generic)
1553
+ if unwrapped_key_type.has_flag (.generic) || unwrapped_value_type.has_flag (.generic) {
1554
+ return new_type (idx).derive_add_muls (generic_type).set_flag (.generic)
1555
+ } else {
1556
+ return new_type (idx).derive_add_muls (generic_type).clear_flag (.generic)
1557
+ }
1523
1558
}
1524
1559
}
1525
1560
Struct, Interface, SumType {
0 commit comments