https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92167
--- Comment #1 from Andrew Church <achurch+gcc at achurch dot org> ---
A similar problem occurs when passing the wrong number of arguments to a
function which has been renamed with a macro -- the diagnostic is associated
with the renaming macro instead of the original source line:
-----------------------------
$ cat test3.c
#define RENAME(x) foo_##x
#define a RENAME(a)
extern int a(int);
int b(void) {return a();}
$ gcc-9.2.0 -c test3.c
test.c: In function 'b':
test.c:1:19: error: too few arguments to function 'foo_a'
1 | #define RENAME(x) foo_##x
| ^~~~
test.c:2:11: note: in expansion of macro 'RENAME'
2 | #define a RENAME(a)
| ^~~~~~
test.c:4:21: note: in expansion of macro 'a'
4 | int b(void) {return a();}
| ^
test.c:1:19: note: declared here
1 | #define RENAME(x) foo_##x
| ^~~~
test.c:2:11: note: in expansion of macro 'RENAME'
2 | #define a RENAME(a)
| ^~~~~~
test.c:3:12: note: in expansion of macro 'a'
3 | extern int a(int);
| ^
-----------------------------
In this case as well, Clang associates the diagnostic with the original source
line, though in this case it does not show the macro chain:
-----------------------------
$ clang-9 -c test3.c
test.c:4:23: error: too few arguments to function call, expected 1, have 0
int b(void) {return a();}
~ ^
test.c:3:1: note: 'foo_a' declared here
extern int a(int);
^
-----------------------------