Author: serge-sans-paille Date: 2022-01-31T11:16:28+01:00 New Revision: b8290ffa9fd935b8a0e99634fccfae9ed87ad9b5
URL: https://github.com/llvm/llvm-project/commit/b8290ffa9fd935b8a0e99634fccfae9ed87ad9b5 DIFF: https://github.com/llvm/llvm-project/commit/b8290ffa9fd935b8a0e99634fccfae9ed87ad9b5.diff LOG: 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 Added: clang/test/Sema/Inputs/reserved-identifier.h Modified: clang/lib/Sema/SemaDecl.cpp clang/test/Sema/reserved-identifier.c Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 3252671991b70..e747ffc6f2ac1 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 0000000000000..83b681f239c3b --- /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 746b4775b0fe1..9296e7125e2c8 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() { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits