https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80785
--- Comment #2 from Daniel Gutson <daniel.gutson at intel dot com> --- (In reply to Jonathan Wakely from comment #1) > (In reply to Daniel Gutson from comment #0) > > I don't see why one would want to do this. > > You might have a header that encloses the entire contents in an extern "C" > language linkage block, and it might contain static variables. > > Variables with internal linkage don't have language linkage, so the extern > "C" doesn't do anything, but isn't necessarily a mistake. I still think that a warning would help. With this aid, the programmer may pull the static definitions out of the extern"C" block, or more importantly, refactor the organization of the header files structure. Opt-in -Wextern-static or alike? > > For function definitions it's not contradictory, and not redundant: > > extern "C" static void f() { } > static void g() { } > > f() and g() both have internal linkage, but have different types. This > matters if you want to pass &f to a function that takes a pointer to a > function with "C" language linkage (N.B. GCC and many other compilers don't > implement this correctly, see PR 2316). OK, didn't think about this use case.