I have encountered a strange behaviour in clang (both AppleClang 1400.0.29.202 and clang 15.0.7 from Homebrew). Assume I have the following code:
int bar();
int bar(int a, TEST b) {
return 43;
}
It compiles with -DTEST=int
but fails to compile with -DTEST=char
resulting in conflicting types for 'bar'
. This happens regardless of the specified standard (I have tried c89
and c99
).
Am I missing something?
EDIT: I realise that omitting prototypes is highly discouraged and I don't write code like this, but there's still a lot of code written like this in the wild. I was trying to compile enscript
this morning and encountered this issue.
Also, the following works with -DTEST=char
.
int bar();
int bar(a, b)
int a;
TEST b;
{
return 43;
}
EDIT2: I should have tried it with other compilers before asking. GCC output contains a note about argument promotion:
note: an argument type that has a default promotion cannot match an empty parameter name list declaration
CodePudding user response:
Am I missing something?
Yes, a proper function declaration. The code should have been:
int bar(int a, TEST b);
int bar(int a, TEST b) {
return 43;
}
[Why I am getting this error?]
int bar()
is a function with unspecified count and type of arguments and all arguments undergo default argument promotions, where a char
is promoted to an int
. Because it's impossible for int bar()
to take a char
argument, because it would be promoted to an int
, that is a conflicting type.