needs overhaul, since current design leads to problems with GCC 4.8 onwards (and is messed up anyway)