/* Consider these types */
typedef int arr_unknown[];
typedef int func_unknown();

/* And then these */
typedef int arr_4[4];
typedef int func_4(int, int, int, int);

/* And finally these */
typedef int arr_2[2];
typedef int func_2(int, int);

/* Consider these subjects */
arr_4 some_arr;
func_4 some_func;
double * some_double_ptr;

int main(void) {
    /* Consider these intermediaries */
    arr_unknown * a_u;
    func_unknown * f_u;
    void * vp;

    /* Three pointers of different types than line 13 */
    arr_2 * a_2;
    func_2 * f_2;
    char * cp;

    /*
     * Observe how the intermediaries allow for
     * conversions without casting
     */
    a_2 = a_u = &some_arr;
    f_2 = f_u = some_func;
    cp = vp = some_double_ptr;

    return 0;
  }

int some_func(int w, int x, int y, int z) {
    return 0;
  }