@@ -7920,7 +7920,6 @@ fn zirVarExtended(
7920
7920
const mut_src : LazySrcLoc = src ; // TODO add a LazySrcLoc that points at mut token
7921
7921
const init_src : LazySrcLoc = src ; // TODO add a LazySrcLoc that points at init expr
7922
7922
const small = @bitCast (Zir .Inst .ExtendedVar .Small , extended .small );
7923
- const var_ty = try sema .resolveType (block , ty_src , extra .data .var_type );
7924
7923
7925
7924
var extra_index : usize = extra .end ;
7926
7925
@@ -7940,11 +7939,25 @@ fn zirVarExtended(
7940
7939
// break :blk align_tv.val;
7941
7940
//} else Value.initTag(.null_value);
7942
7941
7943
- const init_val : Value = if (small .has_init ) blk : {
7942
+ const uncasted_init : Air.Inst.Ref = if (small .has_init ) blk : {
7944
7943
const init_ref = @intToEnum (Zir .Inst .Ref , sema .code .extra [extra_index ]);
7945
7944
extra_index += 1 ;
7946
- const init_air_inst = sema .resolveInst (init_ref );
7947
- break :blk (try sema .resolveMaybeUndefVal (block , init_src , init_air_inst )) orelse
7945
+ break :blk sema .resolveInst (init_ref );
7946
+ } else .none ;
7947
+
7948
+ const have_ty = extra .data .var_type != .none ;
7949
+ const var_ty = if (have_ty )
7950
+ try sema .resolveType (block , ty_src , extra .data .var_type )
7951
+ else
7952
+ sema .typeOf (uncasted_init );
7953
+
7954
+ const init_val = if (uncasted_init != .none ) blk : {
7955
+ const init = if (have_ty )
7956
+ try sema .coerce (block , var_ty , uncasted_init , init_src )
7957
+ else
7958
+ uncasted_init ;
7959
+
7960
+ break :blk (try sema .resolveMaybeUndefVal (block , init_src , init )) orelse
7948
7961
return sema .failWithNeededComptime (block , init_src );
7949
7962
} else Value .initTag (.unreachable_value );
7950
7963
0 commit comments