It's not really the compiler's job. A compiler is there to check if your code is valid C and then translate your source code into machine code for the target system.
However, compilers have become increasingly friendly over the years and sometimes warn against common bugs, poorly-defined behavior or other potential run-time misbehavior. This friendliness shouldn't be mistaken for some guarantee that the compiler will catch all such bugs though.
While compilers tend to warn for if(a = b)
, gcc with max warnings doesn't even warn for something obvious such as int arr[2]; arr[2]=1;
(clang and icc does). And as you noticed, not for =+
, =!
etc either.
The solution for this is to have a software quality system that covers as many known issues as possible. Not just relying on compiler warnings alone, but taking the step to become a professional software engineer. That means coding style guides, coding standards for using a safe subset of C, static analysis tools, code "beautifiers" and peer code reviews.
Static analysers can find a lot of bugs that the compiler doesn't look for, but perhaps not this particular bug unless you explicitly configure it to look for it. A coding standard + code beautifier ought to transform the code into offset = +TS_SIZE;
though, after which manual code review will easily spot the bug.
EDIT: as pointed out in comments, =+
was once valid C in very early pre-K&R versions. Some history lessons here: What does =+ mean in C?, see the great answer by Jonathan Leffler in particular.