r204395 - Consumed Analysis: IgnoreParens bugfix.
DeLesley Hutchins
delesley at google.com
Thu Mar 20 13:39:21 PDT 2014
Author: delesley
Date: Thu Mar 20 15:39:20 2014
New Revision: 204395
URL: http://llvm.org/viewvc/llvm-project?rev=204395&view=rev
Log:
Consumed Analysis: IgnoreParens bugfix.
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=204395&r1=204394&r2=204395&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/Consumed.cpp (original)
+++ cfe/trunk/lib/Analysis/Consumed.cpp Thu Mar 20 15:39:20 2014
@@ -471,11 +471,21 @@ class ConsumedStmtVisitor : public Const
ConsumedStateMap *StateMap;
MapType PropagationMap;
- void forwardInfo(const Stmt *From, const Stmt *To);
- void copyInfo(const Stmt *From, const Stmt *To, ConsumedState CS);
- ConsumedState getInfo(const Stmt *From);
- void setInfo(const Stmt *To, ConsumedState NS);
- void propagateReturnType(const Stmt *Call, const FunctionDecl *Fun);
+ InfoEntry findInfo(const Expr *E) {
+ return PropagationMap.find(E->IgnoreParens());
+ }
+ ConstInfoEntry findInfo(const Expr *E) const {
+ return PropagationMap.find(E->IgnoreParens());
+ }
+ void insertInfo(const Expr *E, const PropagationInfo &PI) {
+ PropagationMap.insert(PairType(E->IgnoreParens(), PI));
+ }
+
+ void forwardInfo(const Expr *From, const Expr *To);
+ void copyInfo(const Expr *From, const Expr *To, ConsumedState CS);
+ ConsumedState getInfo(const Expr *From);
+ void setInfo(const Expr *To, ConsumedState NS);
+ void propagateReturnType(const Expr *Call, const FunctionDecl *Fun);
public:
void checkCallability(const PropagationInfo &PInfo,
@@ -504,8 +514,8 @@ public:
ConsumedStateMap *StateMap)
: AC(AC), Analyzer(Analyzer), StateMap(StateMap) {}
- PropagationInfo getInfo(const Stmt *StmtNode) const {
- ConstInfoEntry Entry = PropagationMap.find(StmtNode);
+ PropagationInfo getInfo(const Expr *StmtNode) const {
+ ConstInfoEntry Entry = findInfo(StmtNode);
if (Entry != PropagationMap.end())
return Entry->second;
@@ -519,23 +529,23 @@ public:
};
-void ConsumedStmtVisitor::forwardInfo(const Stmt *From, const Stmt *To) {
- InfoEntry Entry = PropagationMap.find(From);
+void ConsumedStmtVisitor::forwardInfo(const Expr *From, const Expr *To) {
+ InfoEntry Entry = findInfo(From);
if (Entry != PropagationMap.end())
- PropagationMap.insert(PairType(To, Entry->second));
+ insertInfo(To, Entry->second);
}
// Create a new state for To, which is initialized to the state of From.
// If NS is not CS_None, sets the state of From to NS.
-void ConsumedStmtVisitor::copyInfo(const Stmt *From, const Stmt *To,
+void ConsumedStmtVisitor::copyInfo(const Expr *From, const Expr *To,
ConsumedState NS) {
- InfoEntry Entry = PropagationMap.find(From);
+ InfoEntry Entry = findInfo(From);
if (Entry != PropagationMap.end()) {
PropagationInfo& PInfo = Entry->second;
ConsumedState CS = PInfo.getAsState(StateMap);
if (CS != CS_None)
- PropagationMap.insert(PairType(To, CS));
+ insertInfo(To, PropagationInfo(CS));
if (NS != CS_None && PInfo.isPointerToValue())
setStateForVarOrTmp(StateMap, PInfo, NS);
}
@@ -543,8 +553,8 @@ void ConsumedStmtVisitor::copyInfo(const
// Get the ConsumedState for From
-ConsumedState ConsumedStmtVisitor::getInfo(const Stmt *From) {
- InfoEntry Entry = PropagationMap.find(From);
+ConsumedState ConsumedStmtVisitor::getInfo(const Expr *From) {
+ InfoEntry Entry = findInfo(From);
if (Entry != PropagationMap.end()) {
PropagationInfo& PInfo = Entry->second;
return PInfo.getAsState(StateMap);
@@ -554,14 +564,14 @@ ConsumedState ConsumedStmtVisitor::getIn
// If we already have info for To then update it, otherwise create a new entry.
-void ConsumedStmtVisitor::setInfo(const Stmt *To, ConsumedState NS) {
- InfoEntry Entry = PropagationMap.find(To);
+void ConsumedStmtVisitor::setInfo(const Expr *To, ConsumedState NS) {
+ InfoEntry Entry = findInfo(To);
if (Entry != PropagationMap.end()) {
PropagationInfo& PInfo = Entry->second;
if (PInfo.isPointerToValue())
setStateForVarOrTmp(StateMap, PInfo, NS);
} else if (NS != CS_None) {
- PropagationMap.insert(PairType(To, PropagationInfo(NS)));
+ insertInfo(To, PropagationInfo(NS));
}
}
@@ -616,7 +626,7 @@ bool ConsumedStmtVisitor::handleCall(con
const ParmVarDecl *Param = FunD->getParamDecl(Index - Offset);
QualType ParamType = Param->getType();
- InfoEntry Entry = PropagationMap.find(Call->getArg(Index));
+ InfoEntry Entry = findInfo(Call->getArg(Index));
if (Entry == PropagationMap.end() || Entry->second.isTest())
continue;
@@ -651,7 +661,7 @@ bool ConsumedStmtVisitor::handleCall(con
return false;
// check implicit 'self' parameter, if present
- InfoEntry Entry = PropagationMap.find(ObjArg);
+ InfoEntry Entry = findInfo(ObjArg);
if (Entry != PropagationMap.end()) {
PropagationInfo PInfo = Entry->second;
checkCallability(PInfo, FunD, Call->getExprLoc());
@@ -675,7 +685,7 @@ bool ConsumedStmtVisitor::handleCall(con
}
-void ConsumedStmtVisitor::propagateReturnType(const Stmt *Call,
+void ConsumedStmtVisitor::propagateReturnType(const Expr *Call,
const FunctionDecl *Fun) {
QualType RetType = Fun->getCallResultType();
if (RetType->isReferenceType())
@@ -697,8 +707,8 @@ void ConsumedStmtVisitor::VisitBinaryOpe
switch (BinOp->getOpcode()) {
case BO_LAnd:
case BO_LOr : {
- InfoEntry LEntry = PropagationMap.find(BinOp->getLHS()),
- REntry = PropagationMap.find(BinOp->getRHS());
+ InfoEntry LEntry = findInfo(BinOp->getLHS()),
+ REntry = findInfo(BinOp->getRHS());
VarTestResult LTest, RTest;
@@ -770,7 +780,7 @@ void ConsumedStmtVisitor::VisitCastExpr(
void ConsumedStmtVisitor::VisitCXXBindTemporaryExpr(
const CXXBindTemporaryExpr *Temp) {
- InfoEntry Entry = PropagationMap.find(Temp->getSubExpr());
+ InfoEntry Entry = findInfo(Temp->getSubExpr());
if (Entry != PropagationMap.end() && !Entry->second.isTest()) {
StateMap->setState(Temp, Entry->second.getAsState(StateMap));
@@ -894,7 +904,7 @@ void ConsumedStmtVisitor::VisitReturnStm
ConsumedState ExpectedState = Analyzer.getExpectedReturnState();
if (ExpectedState != CS_None) {
- InfoEntry Entry = PropagationMap.find(Ret->getRetValue());
+ InfoEntry Entry = findInfo(Ret->getRetValue());
if (Entry != PropagationMap.end()) {
ConsumedState RetState = Entry->second.getAsState(StateMap);
@@ -911,7 +921,7 @@ void ConsumedStmtVisitor::VisitReturnStm
}
void ConsumedStmtVisitor::VisitUnaryOperator(const UnaryOperator *UOp) {
- InfoEntry Entry = PropagationMap.find(UOp->getSubExpr()->IgnoreParens());
+ InfoEntry Entry = findInfo(UOp->getSubExpr());
if (Entry == PropagationMap.end()) return;
switch (UOp->getOpcode()) {
@@ -933,8 +943,7 @@ void ConsumedStmtVisitor::VisitUnaryOper
void ConsumedStmtVisitor::VisitVarDecl(const VarDecl *Var) {
if (isConsumableType(Var->getType())) {
if (Var->hasInit()) {
- MapType::iterator VIT = PropagationMap.find(
- Var->getInit()->IgnoreImplicit());
+ MapType::iterator VIT = findInfo(Var->getInit()->IgnoreImplicit());
if (VIT != PropagationMap.end()) {
PropagationInfo PInfo = VIT->second;
ConsumedState St = PInfo.getAsState(StateMap);
@@ -1292,7 +1301,7 @@ bool ConsumedAnalyzer::splitState(const
if (const IfStmt *IfNode =
dyn_cast_or_null<IfStmt>(CurrBlock->getTerminator().getStmt())) {
- const Stmt *Cond = IfNode->getCond();
+ const Expr *Cond = IfNode->getCond();
PInfo = Visitor.getInfo(Cond);
if (!PInfo.isValid() && isa<BinaryOperator>(Cond))
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=204395&r1=204394&r2=204395&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/warn-consumed-analysis.cpp (original)
+++ cfe/trunk/test/SemaCXX/warn-consumed-analysis.cpp Thu Mar 20 15:39:20 2014
@@ -684,6 +684,8 @@ class CONSUMABLE(unconsumed)
int code;
public:
+ static Status OK;
+
Status() RETURN_TYPESTATE(consumed);
Status(int c) RETURN_TYPESTATE(unconsumed);
@@ -693,6 +695,8 @@ public:
Status& operator=(const Status &other) CALLABLE_WHEN("unknown", "consumed");
Status& operator=(Status &&other) CALLABLE_WHEN("unknown", "consumed");
+ bool operator==(const Status &other) const SET_TYPESTATE(consumed);
+
bool check() const SET_TYPESTATE(consumed);
void ignore() const SET_TYPESTATE(consumed);
// Status& markAsChecked() { return *this; }
@@ -710,6 +714,11 @@ void handleStatusRef(Status& s);
void handleStatusPtr(Status* s);
void handleStatusUnmarked(const Status& s);
+void log(const char* msg);
+void fail() __attribute__((noreturn));
+void checkStat(const Status& s);
+
+
void testSimpleTemporaries0() {
doSomething(); // expected-warning {{invalid invocation of method '~Status' on a temporary object while it is in the 'unconsumed' state}}
}
@@ -870,6 +879,29 @@ Status testReturnAutocast() {
return s; // should autocast back to unconsumed
}
+
+namespace TestParens {
+
+void test3() {
+ checkStat((doSomething()));
+}
+
+void test4() {
+ Status s = (doSomething());
+ s.check();
+}
+
+void test5() {
+ (doSomething()).check();
+}
+
+void test6() {
+ if ((doSomething()) == Status::OK)
+ return;
+}
+
+} // end namespace TestParens
+
} // end namespace InitializerAssertionFailTest
@@ -899,3 +931,4 @@ namespace PR18260 {
std::__1::move(x);
}
} // end namespace PR18260
+
More information about the cfe-commits
mailing list