Juan Quintela wrote: > * add VARRAY_UINT16_UNSAFE: unsafe here means that type checking is off > (a.k.a. as a cast in C). In this case the problem is that the last > element of one struct is int foo[0], and we allocate the right size > for the array we want. Problem? I haven't been able to abuse^Wuse > gcc + cpp + magic to typecheck that for vmstate: > > We have > struct FOO { > int32_t foo[0]; > } > We want to "compare the type of foo (t1) with int32_t (t2) > > ((t1(*)[n])0 - (t2*)0) > This one don't work, because we don't have 'n' > ((t1(**))0 - (t2*)0) > This don't work either because t1 is one array. > ((t1(*)[])0 - (t2*)0) > Too clever, imposible cast to on array type. > I tried some other variants, but have not able to get one that compiles.
Since you mention GCC, is it ok to use GCC extensions? __typeof__(t1) often does the trick for this sort of thing where t1 alone does not compile, even if t1 is a type. __builtin_types_compatible_p(), __builtin_choose_exper and __attribute__((__error__)) are good for informative error messages. -- Jamie