r193010 - Consumed analysis: fix assert failure.
DeLesley Hutchins
delesley at google.com
Fri Oct 18 16:11:49 PDT 2013
Author: delesley
Date: Fri Oct 18 18:11:49 2013
New Revision: 193010
URL: http://llvm.org/viewvc/llvm-project?rev=193010&view=rev
Log:
Consumed analysis: fix assert failure.
Modified:
cfe/trunk/lib/Analysis/Consumed.cpp
cfe/trunk/test/SemaCXX/warn-consumed-analysis.cpp
Modified: cfe/trunk/lib/Analysis/Consumed.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/Consumed.cpp?rev=193010&r1=193009&r2=193010&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/Consumed.cpp (original)
+++ cfe/trunk/lib/Analysis/Consumed.cpp Fri Oct 18 18:11:49 2013
@@ -414,6 +414,15 @@ class ConsumedStmtVisitor : public Const
void propagateReturnType(const Stmt *Call, const FunctionDecl *Fun,
QualType ReturnType);
+ inline ConsumedState getPInfoState(const PropagationInfo& PInfo) {
+ if (PInfo.isVar())
+ return StateMap->getState(PInfo.getVar());
+ else if (PInfo.isState())
+ return PInfo.getState();
+ else
+ return CS_None;
+ }
+
public:
void checkCallability(const PropagationInfo &PInfo,
const FunctionDecl *FunDecl,
@@ -927,15 +936,18 @@ void ConsumedStmtVisitor::VisitUnaryOper
void ConsumedStmtVisitor::VisitVarDecl(const VarDecl *Var) {
if (isConsumableType(Var->getType())) {
if (Var->hasInit()) {
- PropagationInfo PInfo =
- PropagationMap.find(Var->getInit())->second;
-
- StateMap->setState(Var, PInfo.isVar() ?
- StateMap->getState(PInfo.getVar()) : PInfo.getState());
-
- } else {
- StateMap->setState(Var, consumed::CS_Unknown);
+ MapType::iterator VIT = PropagationMap.find(Var->getInit());
+ if (VIT != PropagationMap.end()) {
+ PropagationInfo PInfo = VIT->second;
+ ConsumedState St = getPInfoState(PInfo);
+ if (St != consumed::CS_None) {
+ StateMap->setState(Var, St);
+ return;
+ }
+ }
}
+ // Otherwise
+ StateMap->setState(Var, consumed::CS_Unknown);
}
}
}} // end clang::consumed::ConsumedStmtVisitor
Modified: cfe/trunk/test/SemaCXX/warn-consumed-analysis.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-consumed-analysis.cpp?rev=193010&r1=193009&r2=193010&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/warn-consumed-analysis.cpp (original)
+++ cfe/trunk/test/SemaCXX/warn-consumed-analysis.cpp Fri Oct 18 18:11:49 2013
@@ -642,3 +642,46 @@ void read(bool sf) {
} // end namespace ContinueICETest
+
+namespace InitializerAssertionFailTest {
+
+class CONSUMABLE(unconsumed) Status {
+ int code;
+
+public:
+ Status() RETURN_TYPESTATE(consumed);
+ Status(int c) RETURN_TYPESTATE(unconsumed);
+
+ Status(const Status &other);
+ //Status(Status &&other);
+
+ Status& operator=(const Status &other) CALLABLE_WHEN("unknown", "consumed");
+ //Status& operator=(Status &&other) CALLABLE_WHEN("unknown", "consumed");
+
+ bool check() const SET_TYPESTATE(consumed);
+ void ignore() const SET_TYPESTATE(consumed);
+ // Status& markAsChecked() { return *this; }
+
+ void clear() CALLABLE_WHEN("unknown", "consumed") SET_TYPESTATE(consumed);
+
+ ~Status() CALLABLE_WHEN("unknown", "consumed");
+};
+
+
+bool cond();
+Status doSomething();
+void handleStatus(const Status& s);
+void handleStatusPtr(const Status* s);
+
+int a;
+
+
+void test() {
+ if (cond()) {
+ Status s = doSomething();
+ return; // Warning: Store it, but don't check.
+ }
+}
+
+} // end namespace InitializerAssertionFailTest
+
More information about the cfe-commits
mailing list