https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119185
--- Comment #5 from Uroš Platiše <uros at isotel dot org> --- If it is called directly it could hold NULL, but typically hardware abstraction device drivers are never called directly. And now you typically have macros i.e. one of the drivers "work-around" for this: #define ISN_DRV_GETSENDBUF(obj, buf, size, caller) ((isn_driver_t *)obj)->getsendbuf(obj, buf, size, caller) #define ISN_DRV_SEND(obj, buf, size) ((isn_driver_t *)obj)->send(obj, buf, size) #define ISN_DRV_FREE(obj, buf) ((isn_driver_t *)obj)->free(obj, buf) #define ISN_DRV_FORWARD(obj, src, size, caller) ((isn_driver_t *)obj)->forward(obj, src, size, caller) My assumption was that the object is anyway in the regs and the mere issue would be accessing its value. When to bring C++ to tiny micro-controllers is always a debate, as long even linux kernel does not want to switch to C++.