Skip to content

Assignment error when using recursive definition in sum types type SumType = int | []SumType #14160

@impopular-guy

Description

@impopular-guy

V version: V 0.2.4 501b293
OS: windows, Microsoft Windows 10 Home Single Language v19044 64-bit

What did you do?
v test .

code5_test.v

type SumType = int | []SumType

struct Foo1 {
	a int
	b []int
}

fn test_func() {
	data := Foo1{120, [130, 140]}
	mut res1 := map[string]SumType{}
	$for field in Foo1.fields {
		$if field.typ is int {
			res1[field.name] = data.$(field.name)  // this fails during compilation
		} $else $if field.typ is []int{
			res1[field.name] = data.$(field.name)
		}
	}

	mut res2 := map[string]SumType{}
	$for field in Foo1.fields {
		$if field.typ is int {
			e := data.$(field.name)
			res2[field.name] = e    // this compiles successfully
		} $else $if field.typ is []int{
			e := data.$(field.name)
			res2[field.name] = e
		}
	}
	assert res1 == res2
}

code4_test.v

type SumType = int | []int // difference

struct Foo1 {
	a int
	b []int
}

fn test_func() {
	data := Foo1{120, [130, 140]}
	mut res1 := map[string]SumType{}
	$for field in Foo1.fields {
		$if field.typ is int {
			res1[field.name] = data.$(field.name)
		} $else $if field.typ is []int{
			res1[field.name] = data.$(field.name)
		}
	}

	mut res2 := map[string]SumType{}
	$for field in Foo1.fields {
		$if field.typ is int {
			e := data.$(field.name)
			res2[field.name] = e
		} $else $if field.typ is []int{
			e := data.$(field.name)
			res2[field.name] = e
		}
	}
	assert res1 == res2
}

What did you expect to see?
Both test files successful

What did you see instead?

C:\Users\dhrit\Desktop\ToReead\temp\vtest>v test .
---- Testing... --------------------------------------------------------------------------------------------------------
 FAIL  [1/2]   499.829 ms C:/Users/dhrit/Desktop/ToReead/temp/vtest/code5_test.v
code5_test.v:13:28: error: cannot assign to `res1[field.name]`: expected `SumType`, not `[]int`
   11 |     $for field in Foo1.fields {
   12 |         $if field.typ is int {
   13 |             res1[field.name] = data.$(field.name)
      |                                     ~~~~~~~~~~~~~
   14 |         } $else $if field.typ is []int{
   15 |             res1[field.name] = data.$(field.name)
code5_test.v:15:28: error: cannot assign to `res1[field.name]`: expected `SumType`, not `[]int`
   13 |             res1[field.name] = data.$(field.name)
   14 |         } $else $if field.typ is []int{
   15 |             res1[field.name] = data.$(field.name)
      |                                     ~~~~~~~~~~~~~
   16 |         }
   17 |     }

 FAIL  [2/2]   504.533 ms C:/Users/dhrit/Desktop/ToReead/temp/vtest/code4_test.v
C:\\Users\\dhrit\\Desktop\\ToReead\\temp\\vtest\\code4_test.v:29: ✗ fn test_func
  > assert res1 == res2
    Left value:
      {'a': SumType(120), 'b': SumType([130, 140])}
    Right value:
      {'a': SumType(120), 'b': SumType(4)}

------------------------------------------------------------------------------------------------------------------------
Failed command 1:    "C:\BIN\v\v.exe"   -o "C:\Users\dhrit\AppData\Local\Temp\v\test_session_4713100\code5_test.exe" "C:\Users\dhrit\Desktop\ToReead\temp\vtest\code5_test.v"
Failed command 2:    "C:\BIN\v\v.exe"   -o "C:\Users\dhrit\AppData\Local\Temp\v\test_session_4713100\code4_test.exe" "C:\Users\dhrit\Desktop\ToReead\temp\vtest\code4_test.v"
Summary for all V _test.v files: 2 failed, 2 total. Runtime: 505 ms, on 2 parallel jobs.

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugThis tag is applied to issues which reports bugs.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions