How about:
#define ADD_OR_DEFAULT(a, b, d) \
({ typeof((a) + (b)) r; __builtin_add_overflow((a), (b), &r) ? (d) : r; })
and then: return ADD_OR_DEFAULT(a, b, 0);
P.S: Names beginning with two underscores are reserved for the implementation.