[cfe-commits] r50197 - /cfe/trunk/lib/Analysis/BugReporter.cpp
Ted Kremenek
kremenek at apple.com
Wed Apr 23 16:35:08 PDT 2008
Author: kremenek
Date: Wed Apr 23 18:35:07 2008
New Revision: 50197
URL: http://llvm.org/viewvc/llvm-project?rev=50197&view=rev
Log:
For case statements involving enums, BugReporter now generates PathDiagnostics
that say that we are jumping to "case a" instead of "case 0".
This is a feature implementation for <rdar://problem/5880430>.
Modified:
cfe/trunk/lib/Analysis/BugReporter.cpp
Modified: cfe/trunk/lib/Analysis/BugReporter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BugReporter.cpp?rev=50197&r1=50196&r2=50197&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/BugReporter.cpp (original)
+++ cfe/trunk/lib/Analysis/BugReporter.cpp Wed Apr 23 18:35:07 2008
@@ -254,16 +254,16 @@
case Stmt::SwitchStmtClass: {
// Figure out what case arm we took.
-
- Stmt* S = Dst->getLabel();
-
- if (!S)
- continue;
-
+
std::ostringstream os;
-
- switch (S->getStmtClass()) {
+
+ if (Stmt* S = Dst->getLabel())
+ switch (S->getStmtClass()) {
+
default:
+ assert(false && "Not a valid switch label.");
+ continue;
+
case Stmt::DefaultStmtClass: {
os << "Control jumps to the 'default' case at line "
@@ -276,38 +276,45 @@
os << "Control jumps to 'case ";
- Expr* CondE = cast<SwitchStmt>(T)->getCond();
- unsigned bits = Ctx.getTypeSize(CondE->getType());
+ CaseStmt* Case = cast<CaseStmt>(S);
+ Expr* LHS = Case->getLHS()->IgnoreParenCasts();
- llvm::APSInt V1(bits, false);
+ // Determine if it is an enum.
- CaseStmt* Case = cast<CaseStmt>(S);
+ bool GetRawInt = true;
- if (!Case->getLHS()->isIntegerConstantExpr(V1, Ctx, 0, true)) {
- assert (false &&
- "Case condition must evaluate to an integer constant.");
- continue;
+ if (DeclRefExpr* DR = dyn_cast<DeclRefExpr>(LHS)) {
+
+ // FIXME: Maybe this should be an assertion. Are there cases
+ // were it is not an EnumConstantDecl?
+
+ EnumConstantDecl* D = dyn_cast<EnumConstantDecl>(DR->getDecl());
+
+ if (D) {
+ GetRawInt = false;
+ os << D->getName();
+ }
}
+
+ if (GetRawInt) {
- os << V1.toString();
-
- // Get the RHS of the case, if it exists.
-
- if (Expr* E = Case->getRHS()) {
-
- llvm::APSInt V2(bits, false);
+ // Not an enum.
+ Expr* CondE = cast<SwitchStmt>(T)->getCond();
+ unsigned bits = Ctx.getTypeSize(CondE->getType());
+ llvm::APSInt V(bits, false);
- if (!E->isIntegerConstantExpr(V2, Ctx, 0, true)) {
- assert (false &&
- "Case condition (RHS) must evaluate to an integer constant.");
+ if (!LHS->isIntegerConstantExpr(V, Ctx, 0, true)) {
+ assert (false && "Case condition must be constant.");
continue;
}
- os << " .. " << V2.toString();
+ os << V.toString();
}
+
+
os << ":' at line "
- << SMgr.getLogicalLineNumber(S->getLocStart()) << ".\n";
+ << SMgr.getLogicalLineNumber(S->getLocStart()) << ".\n";
break;
@@ -381,10 +388,9 @@
}
}
}
- else
- if (PathDiagnosticPiece* piece = R.VisitNode(N, NextNode,
- *ReportGraph, *this))
- PD.push_front(piece);
+
+ if (PathDiagnosticPiece* p = R.VisitNode(N, NextNode, *ReportGraph, *this))
+ PD.push_front(p);
}
}
More information about the cfe-commits
mailing list