From 15ab37321cbdb8c38e30cf8bd59bad52f4497580 Mon Sep 17 00:00:00 2001 From: Alp Toker Date: Thu, 12 Dec 2013 12:47:48 +0000 Subject: [PATCH] Suppress -Wshadow / -Wold-style-cast expanded from system header macros Thanks to Jonathan Sauer for providing initial test cases. Fixes PR16093 and PR18147. llvm-svn: 197150 --- clang/lib/Sema/SemaDecl.cpp | 2 ++ clang/lib/Sema/SemaExpr.cpp | 6 ++-- clang/test/SemaCXX/warn-sysheader-macro.cpp | 35 +++++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 clang/test/SemaCXX/warn-sysheader-macro.cpp diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index cd28c228c065..aa2104e0aac4 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -5599,6 +5599,8 @@ void Sema::CheckShadow(Scope *S, VarDecl *D, const LookupResult& R) { DeclarationName Name = R.getLookupName(); // Emit warning and note. + if (getSourceManager().isInSystemMacro(R.getNameLoc())) + return; Diag(R.getNameLoc(), diag::warn_decl_shadow) << Name << Kind << OldDC; Diag(ShadowedDecl->getLocation(), diag::note_previous_declaration); } diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 66ca9d40d831..d1e3c1f41e2e 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -5143,9 +5143,9 @@ Sema::ActOnCastExpr(Scope *S, SourceLocation LParenLoc, CastExpr = Result.take(); } - if (getLangOpts().CPlusPlus && !castType->isVoidType()) - Diag(CastExpr->getLocStart(), diag::warn_old_style_cast) - << SourceRange(LParenLoc, RParenLoc); + if (getLangOpts().CPlusPlus && !castType->isVoidType() && + !getSourceManager().isInSystemMacro(LParenLoc)) + Diag(LParenLoc, diag::warn_old_style_cast) << CastExpr->getSourceRange(); return BuildCStyleCastExpr(LParenLoc, castTInfo, RParenLoc, CastExpr); } diff --git a/clang/test/SemaCXX/warn-sysheader-macro.cpp b/clang/test/SemaCXX/warn-sysheader-macro.cpp new file mode 100644 index 000000000000..c88461720ad4 --- /dev/null +++ b/clang/test/SemaCXX/warn-sysheader-macro.cpp @@ -0,0 +1,35 @@ +// RUN: %clang_cc1 -verify -fsyntax-only -Wshadow -Wold-style-cast %s + +// Test that macro expansions from system headers don't trigger 'syntactic' +// warnings that are not actionable. + +#ifdef IS_SYSHEADER +#pragma clang system_header + +#define SANITY(a) (a / 0) + +#define SHADOW(a) __extension__({ int v = a; v; }) + +#define OLD_STYLE_CAST(a) ((int) (a)) + +#else + +#define IS_SYSHEADER +#include __FILE__ + +void testSanity() { + // Validate that the test is set up correctly + int i = SANITY(0); // expected-warning {{division by zero is undefined}} +} + +void PR16093() { + // no -Wshadow in system macro expansion + int i = SHADOW(SHADOW(1)); +} + +void PR18147() { + // no -Wold_style_cast in system macro expansion + int i = OLD_STYLE_CAST(0); +} + +#endif