clang++ 是否忽略了一些弃用警告的 extern "C" ?

Is clang++ ignoring extern "C" for some deprecation warnings?

如果我用clang 3.8.1编译:

extern "C" {
int foo(int x) { register int y = x; return y; }
}

int main() { return foo(123); }

我收到警告:

a.cpp:3:18: warning: 'register' storage class specifier is deprecated and incompatible with C++1z [-Wdeprecated-register]
int foo(int x) { register int y = x; return y; }
                 ^~~~~~~~~

...我真的不应该得到这个,因为内部函数是 C 代码。如果我使用 GCC 6.3.1,即使使用 -Wall,我也不会收到此警告。

这是 clang 错误还是我做错了什么?

extern "C" 并不代表 "compile this code as C"。这意味着 "make this function (or functions) callable from C code",这通常意味着更改名称修改,有时还意味着调用约定。

也许错误与extern "C"无关?看起来它说的不是 "register is incompatible with C",而是 "register is incompatible with C++1z"。 (我假设 C++1x 表示 C++11/14/17。)