support recursively defined union