Thanks to Jonathan Sauer for providing initial test cases.
Fixes PR16093 and PR18147.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@197150
91177308-0d34-0410-b5e6-
96231b3b80d8
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);
}
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);
}
--- /dev/null
+// 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