Pointer types other than char* are supported as union fields also. They just have a lower chance than char*. The reason I give more chance to char* is we want to do something eventually （not in current Csmith yet）:
int i = 0xffff;
u.p2 = &i;
*(u.p1 + 1) = 2;
With this we achieve implicit pointer conversion and we are able to modify only part of the integer. Supposedly this will make the random programs more interesting.