зеркало из https://github.com/microsoft/clang-1.git
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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46129 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
847794a762
Коммит
4e99a5fc3b
|
@ -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:
|
||||
|
|
|
@ -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()));
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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 &&
|
||||
|
|
Загрузка…
Ссылка в новой задаче