[cfe-commits] r138576 - in /cfe/trunk: lib/Analysis/ReachableCode.cpp test/Sema/warn-unreachable.c
Ted Kremenek
kremenek at apple.com
Thu Aug 25 12:28:56 PDT 2011
Author: kremenek
Date: Thu Aug 25 14:28:55 2011
New Revision: 138576
URL: http://llvm.org/viewvc/llvm-project?rev=138576&view=rev
Log:
Teach -Wunreachable-code about dead code caused by macro expansions. This should suppress false positives resulting from 'assert' and friends.
Modified:
cfe/trunk/lib/Analysis/ReachableCode.cpp
cfe/trunk/test/Sema/warn-unreachable.c
Modified: cfe/trunk/lib/Analysis/ReachableCode.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ReachableCode.cpp?rev=138576&r1=138575&r2=138576&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/ReachableCode.cpp (original)
+++ cfe/trunk/lib/Analysis/ReachableCode.cpp Thu Aug 25 14:28:55 2011
@@ -86,12 +86,10 @@
}
static bool isValidDeadStmt(const Stmt *S) {
- SourceLocation Loc = S->getLocStart();
- if (!(Loc.isValid() && !Loc.isMacroID()))
+ if (S->getLocStart().isInvalid())
return false;
- if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(S)) {
+ if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(S))
return BO->getOpcode() != BO_Comma;
- }
return true;
}
@@ -144,6 +142,12 @@
}
continue;
}
+
+ // Specially handle macro-expanded code.
+ if (S->getLocStart().isMacroID()) {
+ count += clang::reachable_code::ScanReachableFromBlock(Block, Reachable);
+ continue;
+ }
if (isDeadCodeRoot(Block)) {
reportDeadCode(S, CB);
Modified: cfe/trunk/test/Sema/warn-unreachable.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-unreachable.c?rev=138576&r1=138575&r2=138576&view=diff
==============================================================================
--- cfe/trunk/test/Sema/warn-unreachable.c (original)
+++ cfe/trunk/test/Sema/warn-unreachable.c Thu Aug 25 14:28:55 2011
@@ -114,3 +114,15 @@
}
}
+// Handle unreachable code triggered by macro expansions.
+void __myassert_rtn(const char *, const char *, int, const char *) __attribute__((__noreturn__));
+
+#define myassert(e) \
+ (__builtin_expect(!(e), 0) ? __myassert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0)
+
+void test_assert() {
+ myassert(0 && "unreachable");
+ return; // no-warning
+}
+
+
More information about the cfe-commits
mailing list