[PATCH] D77611: [Sema] Check calls to __attribute__((warn_unused_result)) from StmtExprs
Nick Desaulniers via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Apr 7 15:16:54 PDT 2020
nickdesaulniers updated this revision to Diff 255823.
nickdesaulniers added a comment.
- tighten up condition, eagerly emit diag, test with kernel before pushing
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D77611/new/
https://reviews.llvm.org/D77611
Files:
clang/lib/Sema/SemaStmt.cpp
clang/test/Frontend/macros.c
Index: clang/test/Frontend/macros.c
===================================================================
--- clang/test/Frontend/macros.c
+++ 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,15 @@
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}}
+}
Index: clang/lib/Sema/SemaStmt.cpp
===================================================================
--- clang/lib/Sema/SemaStmt.cpp
+++ clang/lib/Sema/SemaStmt.cpp
@@ -247,9 +247,18 @@
// 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<StmtExpr>(E) && Loc.isMacroID())
+ // false positive. But we do want to check CallExprs with
+ // WarnUnusedResultAttr.
+ if (isa<StmtExpr>(E) && Loc.isMacroID()) {
+ if (const CallExpr *CE = dyn_cast<CallExpr>(WarnExpr))
+ if (const Decl *FD = CE->getCalleeDecl())
+ if (FD->hasAttr<WarnUnusedResultAttr>())
+ DiagnoseNoDiscard(*this,
+ cast_or_null<WarnUnusedResultAttr>(
+ CE->getUnusedResultAttr(Context)),
+ Loc, R1, R2, /*isCtor=*/false);
return;
+ }
// Check if this is the UNREFERENCED_PARAMETER from the Microsoft headers.
// That macro is frequently used to suppress "unused parameter" warnings,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D77611.255823.patch
Type: text/x-patch
Size: 1924 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200407/60d44a64/attachment.bin>
More information about the cfe-commits
mailing list