Consumed analysis: switch from tests_consumed/unconsumed to a general
tests_typestate attribute. Patch by chris.wailes@gmail.com.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192513 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/Consumed.cpp b/lib/Analysis/Consumed.cpp
index 85dd821..d1c03d0 100644
--- a/lib/Analysis/Consumed.cpp
+++ b/lib/Analysis/Consumed.cpp
@@ -137,7 +137,7 @@
}
static bool isTestingFunction(const FunctionDecl *FunDecl) {
- return FunDecl->hasAttr<TestsUnconsumedAttr>();
+ return FunDecl->hasAttr<TestsTypestateAttr>();
}
static ConsumedState mapConsumableAttrState(const QualType QT) {
@@ -187,6 +187,17 @@
llvm_unreachable("invalid enum");
}
+static ConsumedState testsFor(const FunctionDecl *FunDecl) {
+ assert(isTestingFunction(FunDecl));
+ switch (FunDecl->getAttr<TestsTypestateAttr>()->getTestState()) {
+ case TestsTypestateAttr::Unconsumed:
+ return CS_Unconsumed;
+ case TestsTypestateAttr::Consumed:
+ return CS_Consumed;
+ }
+ llvm_unreachable("invalid enum");
+}
+
namespace {
struct VarTestResult {
const VarDecl *Var;
@@ -341,7 +352,6 @@
ConsumedStateMap *StateMap;
MapType PropagationMap;
void forwardInfo(const Stmt *From, const Stmt *To);
- void handleTestingFunctionCall(const CallExpr *Call, const VarDecl *Var);
bool isLikeMoveAssignment(const CXXMethodDecl *MethodDecl);
void propagateReturnType(const Stmt *Call, const FunctionDecl *Fun,
QualType ReturnType);
@@ -428,22 +438,6 @@
PropagationMap.insert(PairType(To, Entry->second));
}
-void ConsumedStmtVisitor::handleTestingFunctionCall(const CallExpr *Call,
- const VarDecl *Var) {
-
- ConsumedState VarState = StateMap->getState(Var);
-
- if (VarState != CS_Unknown) {
- SourceLocation CallLoc = Call->getExprLoc();
-
- if (!CallLoc.isMacroID())
- Analyzer.WarningsHandler.warnUnnecessaryTest(Var->getNameAsString(),
- stateToString(VarState), CallLoc);
- }
-
- PropagationMap.insert(PairType(Call, PropagationInfo(Var, CS_Unconsumed)));
-}
-
bool ConsumedStmtVisitor::isLikeMoveAssignment(
const CXXMethodDecl *MethodDecl) {
@@ -643,7 +637,8 @@
if (PInfo.isVar()) {
if (isTestingFunction(MethodDecl))
- handleTestingFunctionCall(Call, PInfo.getVar());
+ PropagationMap.insert(PairType(Call,
+ PropagationInfo(PInfo.getVar(), testsFor(MethodDecl))));
else if (MethodDecl->hasAttr<ConsumesAttr>())
StateMap->setState(PInfo.getVar(), consumed::CS_Consumed);
}
@@ -731,7 +726,8 @@
if (PInfo.isVar()) {
if (isTestingFunction(FunDecl))
- handleTestingFunctionCall(Call, PInfo.getVar());
+ PropagationMap.insert(PairType(Call,
+ PropagationInfo(PInfo.getVar(), testsFor(FunDecl))));
else if (FunDecl->hasAttr<ConsumesAttr>())
StateMap->setState(PInfo.getVar(), consumed::CS_Consumed);
}