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
This commit is contained in:
parent
25991aadcc
commit
b8290ffa9f
|
@ -5703,6 +5703,13 @@ static bool RebuildDeclaratorInCurrentInstantiation(Sema &S, Declarator &D,
|
||||||
return false;
|
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) {
|
void Sema::warnOnReservedIdentifier(const NamedDecl *D) {
|
||||||
// Avoid warning twice on the same identifier, and don't warn on redeclaration
|
// Avoid warning twice on the same identifier, and don't warn on redeclaration
|
||||||
// of system decl.
|
// of system decl.
|
||||||
|
@ -5710,9 +5717,10 @@ void Sema::warnOnReservedIdentifier(const NamedDecl *D) {
|
||||||
return;
|
return;
|
||||||
ReservedIdentifierStatus Status = D->isReserved(getLangOpts());
|
ReservedIdentifierStatus Status = D->isReserved(getLangOpts());
|
||||||
if (Status != ReservedIdentifierStatus::NotReserved &&
|
if (Status != ReservedIdentifierStatus::NotReserved &&
|
||||||
!Context.getSourceManager().isInSystemHeader(D->getLocation()))
|
!isFromSystemHeader(Context.getSourceManager(), D)) {
|
||||||
Diag(D->getLocation(), diag::warn_reserved_extern_symbol)
|
Diag(D->getLocation(), diag::warn_reserved_extern_symbol)
|
||||||
<< D << static_cast<int>(Status);
|
<< D << static_cast<int>(Status);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Decl *Sema::ActOnDeclarator(Scope *S, Declarator &D) {
|
Decl *Sema::ActOnDeclarator(Scope *S, Declarator &D) {
|
||||||
|
|
|
@ -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
|
|
@ -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}}
|
#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}}
|
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
|
extern char *_strdup(const char *); // no-warning
|
||||||
|
|
||||||
void ok() {
|
void ok() {
|
||||||
|
|
Loading…
Reference in New Issue