Change the solver handling of arrays. Previously we were calling compat on the pointers underneath matching arrays. However, this led to problems:   union {     char a[8];     int  b[2];   } This is in fact fine, but we'd end up with compat edges between a node pointing to char and a node pointing to int and they wouldn't be congruent so they would end up being WILD. However, if one of them is INDEX, the other should be as well. So we remember whenever an array is compared against another array and we make sure that they have the same flags. However:   union {     char a[4] __INDEX;     int b;   } Should fail. So we remember whenever an array is compared with a non-array. Later, if any such array ends up being INDEX we die with an error in the solver.
Change the solver handling of arrays. Previously we were calling compat on
the pointers underneath matching arrays. However, this led to problems:
  union {
    char a[8];
    int  b[2];
  }
This is in fact fine, but we'd end up with compat edges between a node
pointing to char and a node pointing to int and they wouldn't be congruent
so they would end up being WILD. However, if one of them is INDEX, the
other should be as well. So we remember whenever an array is compared
against another array and we make sure that they have the same flags.
However:
  union {
    char a[4] __INDEX;
    int b;
  }
Should fail. So we remember whenever an array is compared with a non-array.
Later, if any such array ends up being INDEX we die with an error in the
solver.

This commit also beefs up the test-bad/index1 testcase.

samuelhavron/obliv-c,samuelhavron/obliv-c,samuelhavron/obliv-c,samuelhavron/obliv-c