@@ -2922,8 +2922,7 @@ pub fn (mut c Checker) selector_expr(mut node ast.SelectorExpr) ast.Type {
2922
2922
if field_name.len > 0 && field_name[0 ].is_capital () && sym.info is ast.Struct
2923
2923
&& sym.language == .v {
2924
2924
// x.Foo.y => access the embedded struct
2925
- sym_info := sym.info as ast.Struct
2926
- for embed in sym_info.embeds {
2925
+ for embed in sym.info.embeds {
2927
2926
embed_sym := c.table.get_type_symbol (embed)
2928
2927
if embed_sym.embed_name () == field_name {
2929
2928
node.typ = embed
@@ -4271,7 +4270,6 @@ fn (mut c Checker) for_stmt(mut node ast.ForStmt) {
4271
4270
if infix.op == .key_is {
4272
4271
if (infix.left is ast.Ident || infix.left is ast.SelectorExpr )
4273
4272
&& infix.right is ast.TypeNode {
4274
- right_expr := infix.right as ast.TypeNode
4275
4273
is_variable := if mut infix.left is ast.Ident {
4276
4274
infix.left.kind == .variable
4277
4275
} else {
@@ -4281,7 +4279,8 @@ fn (mut c Checker) for_stmt(mut node ast.ForStmt) {
4281
4279
left_sym := c.table.get_type_symbol (left_type)
4282
4280
if is_variable {
4283
4281
if left_sym.kind in [.sum_type, .interface_] {
4284
- c.smartcast (infix.left, infix.left_type, right_expr.typ, mut node.scope)
4282
+ c.smartcast (infix.left, infix.left_type, infix.right.typ, mut
4283
+ node.scope)
4285
4284
}
4286
4285
}
4287
4286
}
@@ -4667,12 +4666,12 @@ pub fn (mut c Checker) expr(node ast.Expr) ast.Type {
4667
4666
if ! c.table.sumtype_has_variant (node.expr_type, node.typ) {
4668
4667
c.error ('cannot cast `$expr_type_sym.name ` to `$type_sym.name `' , node.pos)
4669
4668
}
4670
- } else {
4671
- // mut s := 'cannot cast non-sum type `$expr_type_sym.name` using `as`'
4672
- // if type_sym.kind == .sum_type {
4673
- // s += ' - use e.g. `${type_sym.name}(some_expr)` instead.'
4674
- // }
4675
- // c.error(s, node.pos)
4669
+ } else if node.expr_type != node.typ {
4670
+ mut s := 'cannot cast non-sum type `$expr_type_sym.name ` using `as`'
4671
+ if type_sym.kind == .sum_type {
4672
+ s + = ' - use e.g. `${type_sym.name} (some_expr)` instead.'
4673
+ }
4674
+ c.error (s, node.pos)
4676
4675
}
4677
4676
return node.typ
4678
4677
}
@@ -5998,7 +5997,7 @@ pub fn (mut c Checker) if_expr(mut node ast.IfExpr) ast.Type {
5998
5997
} else if branch.cond.right is ast.TypeNode && left is ast.TypeNode
5999
5998
&& sym.kind == .interface_ {
6000
5999
// is interface
6001
- checked_type := c.unwrap_generic (( left as ast.TypeNode ) .typ)
6000
+ checked_type := c.unwrap_generic (left.typ)
6002
6001
should_skip = ! c.table.type_implements_interface (checked_type,
6003
6002
got_type)
6004
6003
} else if left is ast.TypeNode {
@@ -6187,8 +6186,7 @@ fn (mut c Checker) comp_if_branch(cond ast.Expr, pos token.Position) bool {
6187
6186
.key_is, .not_is {
6188
6187
if cond.left is ast.TypeNode && cond.right is ast.TypeNode {
6189
6188
// `$if Foo is Interface {`
6190
- type_node := cond.right as ast.TypeNode
6191
- sym := c.table.get_type_symbol (type_node.typ)
6189
+ sym := c.table.get_type_symbol (cond.right.typ)
6192
6190
if sym.kind != .interface_ {
6193
6191
c.expr (cond.left)
6194
6192
// c.error('`$sym.name` is not an interface', cond.right.position())
0 commit comments