On Mon, Nov 24, 2014 at 10:02 AM, Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> wrote: > > If the goal is to catch non-scalar users, the following is shorter: > #define ACCESS_ONCE(x) (((typeof(x))0) + *(volatile typeof(x) *)&(x)) Me likey. It probably works well in practice, although I think - the "(typeof(x))0)" seems unnecessary and wrong. Why not just "0"? The typeof is not just longer, but it is incorrect for pointer types (you can add 0 to a pointer, but you cannot add two pointers together) - it does mean that the resulting type ends up being upgraded to "int", for the usual C type reasons. Note that the "upgraded to 'int'" is true with or without the "(typeof(x))0". If you add two 'char' values, the addition is still done in 'int'. Maybe you *meant* that typeof to fix the second problem, like so: (typeof(x)) (0 + *(volatile typeof(x) *)&(x)) Hmm? That casts the result of the addition, not the zero. Linus