type
  TFoo[T, U, R = int] = object
    x: T
    y: U
    z: R

  TBar[T] = TFoo[T, array[4, T], T]

var x1: TFoo[int, float]

static:
  assert type(x1.x) is int
  assert type(x1.y) is float
  assert type(x1.z) is int

var x2: TFoo[string, R = float, U = seq[int]]

static:
  assert type(x2.x) is string
  assert type(x2.y) is seq[int]
  assert type(x2.z) is float

var x3: TBar[float]

static:
  assert type(x3.x) is float
  assert type(x3.y) is array[4, float]
  assert type(x3.z) is float

