Check for initialisation which replaces a full-struct copy
__builtin_memset() doesn't decay its operand
__builtin_memset() works on arrays
struct expressions always have f_lea() for arrays

This allows us to memset arrays in structs, e.g.
struct A { int x[2]; } a = {};
Moved array-lvalue check to expr_is_lval()

This allows us to keep f_lea() for internal compiler use
Made "fail expected" runs more obvious