Added method Expr::IgnoreParens(), which returns the first non-ParenExpr Expr*.

Refactored the use of this method into both the Sema module and Analysis module,
which were using their own static functions that did the same thing.

llvm-svn: 46129
This commit is contained in:
Ted Kremenek 2008-01-17 16:57:34 +00:00
parent 686dfe829e
commit fff70962bb
6 changed files with 25 additions and 23 deletions

View File

@ -439,6 +439,14 @@ bool Expr::hasStaticStorage() const {
}
}
Expr* Expr::IgnoreParens() {
Expr* E = this;
while (ParenExpr* P = dyn_cast<ParenExpr>(E))
E = P->getSubExpr();
return E;
}
bool Expr::isConstantExpr(ASTContext &Ctx, SourceLocation *Loc) const {
switch (getStmtClass()) {
default:

View File

@ -216,13 +216,6 @@ public:
};
} // end anonymous namespace
static inline Expr* IgnoreParen(Expr* E) {
while (ParenExpr* P = dyn_cast<ParenExpr>(E))
E = P->getSubExpr();
return E;
}
void GRConstants::ProcessStmt(Stmt* S, NodeBuilder& builder) {
Builder = &builder;
Nodes->clear();
@ -237,7 +230,7 @@ void GRConstants::ProcessStmt(Stmt* S, NodeBuilder& builder) {
ExprVariantTy GRConstants::GetBinding(Expr* E) {
DSPtr P(NULL);
E = IgnoreParen(E);
E = E->IgnoreParens();
switch (E->getStmtClass()) {
case Stmt::DeclRefExprClass:
@ -364,7 +357,7 @@ void GRConstants::VisitBinSub(BinaryOperator* B) {
void GRConstants::VisitBinAssign(BinaryOperator* B) {
if (DeclRefExpr* D = dyn_cast<DeclRefExpr>(IgnoreParen(B->getLHS())))
if (DeclRefExpr* D = dyn_cast<DeclRefExpr>(B->getLHS()->IgnoreParens()))
AddBinding(D->getDecl(), GetBinding(B->getRHS()));
}

View File

@ -751,8 +751,8 @@ static DeclRefExpr* EvalVal(Expr *E) {
void Sema::CheckFloatComparison(SourceLocation loc, Expr* lex, Expr *rex) {
bool EmitWarning = true;
Expr* LeftExprSansParen = IgnoreParen(lex);
Expr* RightExprSansParen = IgnoreParen(rex);
Expr* LeftExprSansParen = lex->IgnoreParens();
Expr* RightExprSansParen = lex->IgnoreParens();
// Special case: check for x == x (which is OK).
// Do not emit warnings for such cases.

View File

@ -1418,8 +1418,8 @@ inline QualType Sema::CheckCompareOperands( // C99 6.5.8
// x == x, x != x, x < x, etc. These always evaluate to a constant, and
// often indicate logic errors in the program.
if (!lType->isFloatingType()) {
if (DeclRefExpr* DRL = dyn_cast<DeclRefExpr>(IgnoreParen(lex)))
if (DeclRefExpr* DRR = dyn_cast<DeclRefExpr>(IgnoreParen(rex)))
if (DeclRefExpr* DRL = dyn_cast<DeclRefExpr>(lex->IgnoreParens()))
if (DeclRefExpr* DRR = dyn_cast<DeclRefExpr>(rex->IgnoreParens()))
if (DRL->getDecl() == DRR->getDecl())
Diag(loc, diag::warn_selfcomparison);
}

View File

@ -19,15 +19,6 @@
namespace clang {
/// Utility method to plow through parentheses to get the first nested
/// non-ParenExpr expr.
static inline Expr* IgnoreParen(Expr* E) {
while (ParenExpr* P = dyn_cast<ParenExpr>(E))
E = P->getSubExpr();
return E;
}
/// Utility method to plow through parenthesis and casts.
static inline Expr* IgnoreParenCasts(Expr* E) {
while(true) {

View File

@ -109,7 +109,17 @@ public:
/// hasStaticStorage - Return true if this expression has static storage
/// duration. This means that the address of this expression is a link-time
/// constant.
bool hasStaticStorage() const;
bool hasStaticStorage() const;
/// IgnoreParens - Ignore parentheses. If this Expr is a ParenExpr, return
/// its subexpression. If that subexpression is also a ParenExpr,
/// then this method recursively returns its subexpression, and so forth.
/// Otherwise, the method returns the current Expr.
Expr* IgnoreParens();
const Expr* IgnoreParens() const {
return const_cast<Expr*>(this)->IgnoreParens();
}
static bool classof(const Stmt *T) {
return T->getStmtClass() >= firstExprConstant &&