diff options
author | serge-sans-paille <sguelton@redhat.com> | 2022-01-29 09:17:53 +0100 |
---|---|---|
committer | serge-sans-paille <sguelton@redhat.com> | 2022-01-31 11:16:28 +0100 |
commit | b8290ffa9fd935b8a0e99634fccfae9ed87ad9b5 (patch) | |
tree | 0783ce48e6148d21934e1caa0a4a474aee58a921 | |
parent | 25991aadcc57fdada57147a9c83ca6301f6430bb (diff) |
Fix -Wreserved-identifier in presence of system macro
Do not warn on reserved identifiers resulting from expansion of system macros.
Also properly test -Wreserved-identifier wrt. system headers.
Should fix #49592
Differential Revision: https://reviews.llvm.org/D118532
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 10 | ||||
-rw-r--r-- | clang/test/Sema/Inputs/reserved-identifier.h | 4 | ||||
-rw-r--r-- | clang/test/Sema/reserved-identifier.c | 12 |
3 files changed, 23 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 3252671991b7..e747ffc6f2ac 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -5703,6 +5703,13 @@ static bool RebuildDeclaratorInCurrentInstantiation(Sema &S, Declarator &D, return false; } +/// Returns true if the declaration is declared in a system header or from a +/// system macro. +static bool isFromSystemHeader(SourceManager &SM, const Decl *D) { + return SM.isInSystemHeader(D->getLocation()) || + SM.isInSystemMacro(D->getLocation()); +} + void Sema::warnOnReservedIdentifier(const NamedDecl *D) { // Avoid warning twice on the same identifier, and don't warn on redeclaration // of system decl. @@ -5710,9 +5717,10 @@ void Sema::warnOnReservedIdentifier(const NamedDecl *D) { return; ReservedIdentifierStatus Status = D->isReserved(getLangOpts()); if (Status != ReservedIdentifierStatus::NotReserved && - !Context.getSourceManager().isInSystemHeader(D->getLocation())) + !isFromSystemHeader(Context.getSourceManager(), D)) { Diag(D->getLocation(), diag::warn_reserved_extern_symbol) << D << static_cast<int>(Status); + } } Decl *Sema::ActOnDeclarator(Scope *S, Declarator &D) { diff --git a/clang/test/Sema/Inputs/reserved-identifier.h b/clang/test/Sema/Inputs/reserved-identifier.h new file mode 100644 index 000000000000..83b681f239c3 --- /dev/null +++ b/clang/test/Sema/Inputs/reserved-identifier.h @@ -0,0 +1,4 @@ +int __i_come_from_a_system_header; // no-warning +#define __I_AM_A_SYSTEM_MACRO() // no-warning + +#define SOME_SYSTEM_MACRO() int __i_come_from_a_system_macro diff --git a/clang/test/Sema/reserved-identifier.c b/clang/test/Sema/reserved-identifier.c index 746b4775b0fe..9296e7125e2c 100644 --- a/clang/test/Sema/reserved-identifier.c +++ b/clang/test/Sema/reserved-identifier.c @@ -1,4 +1,12 @@ -// RUN: %clang_cc1 -fsyntax-only -verify -Wreserved-identifier -Wno-visibility %s +// RUN: %clang_cc1 -isystem %S/Inputs -fsyntax-only -verify -Wreserved-identifier -Wno-visibility %s + +#include <reserved-identifier.h> + +__I_AM_A_SYSTEM_MACRO() // no-warning + +void test_system_macro_expansion() { + SOME_SYSTEM_MACRO(); // no-warning +} #define __oof foo__ // expected-warning {{macro name is a reserved identifier}} @@ -58,7 +66,7 @@ void func(struct _preserved { int a; } r) {} // expected-warning {{identifier '_ extern char *_strdup(const char *); // expected-warning {{identifier '_strdup' is reserved because it starts with '_' at global scope}} -// Don't warn on redecleration +// Don't warn on redeclaration extern char *_strdup(const char *); // no-warning void ok() { |