diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -244,13 +244,6 @@ if (!E->isUnusedResultAWarning(WarnExpr, Loc, R1, R2, Context)) return; - // If this is a GNU statement expression expanded from a macro, it is probably - // unused because it is a function-like macro that can be used as either an - // expression or statement. Don't warn, because it is almost certainly a - // false positive. - if (isa(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. diff --git a/clang/test/Frontend/macros.c b/clang/test/Frontend/macros.c --- a/clang/test/Frontend/macros.c +++ b/clang/test/Frontend/macros.c @@ -1,5 +1,4 @@ -// RUN: %clang_cc1 -DA= -DB=1 -verify -fsyntax-only %s -// expected-no-diagnostics +// RUN: %clang_cc1 -Wunused-result -DA= -DB=1 -verify -fsyntax-only %s int a[(B A) == 1 ? 1 : -1]; @@ -11,3 +10,16 @@ void foo(int a, int b, int c) { memset(a,b,c); // No warning! } + +__attribute__((warn_unused_result)) +static inline int bar(void) { + return 42; +} + +#define baz() ({\ + bar(); \ +}) + +void quux(void) { + baz(); // expected-warning {{ignoring return value of function declared with 'warn_unused_result' attribute}} +}