Fix -Wmismatched-tags to not warn on redeclarations of structs in system
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 4 Dec 2018 02:45:28 +0000 (02:45 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 4 Dec 2018 02:45:28 +0000 (02:45 +0000)
commita4ca4ca29374008401106ee714c7a72bff67555a
tree1ef9004d746bad5ce1939c06429a3deb3ec16824
parent55840d10f50836b74c9d3a88f671a838d2af74cf
Fix -Wmismatched-tags to not warn on redeclarations of structs in system
headers.

Previously, we would only check whether the new declaration is in a
system header, but that requires the user to be able to correctly guess
whether a declaration in a system header is declared as a struct or a
class when specializing standard library traits templates.

We now entirely ignore declarations for which the warning was disabled
when determining whether to warn on a tag mismatch.

Also extend the diagnostic message to clarify that
 a) code containing such a tag mismatch is in fact valid and correct,
    and
 b) the (non-coding-style) reason to emit such a warning is that the
    Microsoft C++ ABI is broken and includes the tag kind in decorated
    names,
as it seems a lot of users are confused by our diagnostic here (either
not understanding why we produce it, or believing that it represents an
actual language rule).

llvm-svn: 348233
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/Sema/SemaDecl.cpp
clang/test/SemaCXX/struct-class-redecl.cpp