diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 11 | ||||
-rw-r--r-- | clang/test/Sema/unused-expr.c | 8 |
2 files changed, 18 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index f8668c38932..869ea1deb0b 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -195,7 +195,7 @@ void Sema::DiagnoseUnusedExprResult(const Stmt *S) { if (isUnevaluatedContext()) return; - SourceLocation ExprLoc = E->IgnoreParens()->getExprLoc(); + SourceLocation ExprLoc = E->IgnoreParenImpCasts()->getExprLoc(); // In most cases, we don't want to warn if the expression is written in a // macro body, or if the macro comes from a system header. If the offending // expression is a call to a function with the warn_unused_result attribute, @@ -218,6 +218,15 @@ void Sema::DiagnoseUnusedExprResult(const Stmt *S) { if (isa<StmtExpr>(E) && Loc.isMacroID()) return; + // Check if this is the UNREFERENCED_PARAMETER from the Microsoft headers. + // That macro is frequently used to suppress "unused parameter" warnings, + // but its implementation makes clang's -Wunused-value fire. Prevent this. + if (isa<ParenExpr>(E->IgnoreImpCasts()) && Loc.isMacroID()) { + SourceLocation SpellLoc = Loc; + if (findMacroSpelling(SpellLoc, "UNREFERENCED_PARAMETER")) + return; + } + // Okay, we have an unused result. Depending on what the base expression is, // we might want to make a more specific diagnostic. Check for one of these // cases now. diff --git a/clang/test/Sema/unused-expr.c b/clang/test/Sema/unused-expr.c index 43d8150b02c..09359687d53 100644 --- a/clang/test/Sema/unused-expr.c +++ b/clang/test/Sema/unused-expr.c @@ -156,3 +156,11 @@ void t11(int i, int j) { #undef M5 #undef M6 #undef M7 + +#define UNREFERENCED_PARAMETER(x) (x) + +void unused_parm(int a) { + // Don't warn if the warning is introduced by a macro that's spelled + // UNREFERENCED_PARAMETER, as that's a commonly used macro in Windows headers. + UNREFERENCED_PARAMETER(a); +} |