Not even a syntax error, only semantic errors. I'd call it a C program.
I can only answer for myself, but I would call this a "broken C
program" in most cases.
If that's not a C program, where do _you_ put the limit for whether it's
a C program?
I think one must take "intent" into account. If someone writes:
int main(vodi) {
/* a bunch of correct stuff here */
}
it seems obvious that "vodi" was a typo for "void", not an intentional
mis-spelling, or use of a new bizarre keyword in the "C-=42" language.
On the other hand, if the author of the code tells you: "No, that was
intentional, this is the use of a new bizarre keyword in the C-=42
language", then what seemed obvious is in fact wrong, and it is not
a C program, but rather a C-=42 program.
Intent is inherently impossible to ascertain with certainty. One
can ask the intend-er, but even then, he/she/it could lie. In many
cases, though, one can guess pretty well, and it seems appropriate
to believe any "statements of intent" made by the intend-er.
Note that "intent" applies to compilers as well. A C99 compiler
that gets something wrong by mistake is (to me) still "a C99
compiler" (or perhaps "a broken C99 compiler"), but GCC -- which
intentionally violates several C99-isms -- is *not* a C99 compiler,
not even with -std=c99. Compare this with "gcc -std=c89 -pedantic",
which *does* intend to be a C89 compiler: if it gets something
wrong, it is just a bug, not an intentional violation of some
requirement.