From: Chris Lattner Date: Wed, 13 Feb 2008 01:02:39 +0000 (+0000) Subject: Move IgnoreParenCasts to be a method on Expr. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=56f349400c5932a196509c0480ff6f99a9a0b48f;p=clang Move IgnoreParenCasts to be a method on Expr. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47040 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/AST/Expr.cpp b/AST/Expr.cpp index 00ff897ffb..c7a2005bc8 100644 --- a/AST/Expr.cpp +++ b/AST/Expr.cpp @@ -474,6 +474,23 @@ Expr* Expr::IgnoreParens() { return E; } +/// IgnoreParenCasts - Ignore parentheses and casts. Strip off any ParenExpr +/// or CastExprs or ImplicitCastExprs, returning their operand. +Expr *Expr::IgnoreParenCasts() { + Expr *E = this; + while (true) { + if (ParenExpr *P = dyn_cast(E)) + E = P->getSubExpr(); + else if (CastExpr *P = dyn_cast(E)) + E = P->getSubExpr(); + else if (ImplicitCastExpr *P = dyn_cast(E)) + E = P->getSubExpr(); + else + return E; + } +} + + bool Expr::isConstantExpr(ASTContext &Ctx, SourceLocation *Loc) const { switch (getStmtClass()) { default: diff --git a/Sema/SemaChecking.cpp b/Sema/SemaChecking.cpp index 76363c9dc0..1dfb145db8 100644 --- a/Sema/SemaChecking.cpp +++ b/Sema/SemaChecking.cpp @@ -88,7 +88,7 @@ Sema::CheckFunctionCall(FunctionDecl *FDecl, CallExpr *TheCall) { /// CheckBuiltinCFStringArgument - Checks that the argument to the builtin /// CFString constructor is correct bool Sema::CheckBuiltinCFStringArgument(Expr* Arg) { - Arg = IgnoreParenCasts(Arg); + Arg = Arg->IgnoreParenCasts(); StringLiteral *Literal = dyn_cast(Arg); @@ -267,7 +267,7 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg, return; } - Expr *OrigFormatExpr = IgnoreParenCasts(TheCall->getArg(format_idx)); + Expr *OrigFormatExpr = TheCall->getArg(format_idx)->IgnoreParenCasts(); // CHECK: format string is not a string literal. // @@ -527,7 +527,7 @@ static DeclRefExpr* EvalAddr(Expr* E); void Sema::CheckReturnStackAddr(Expr *RetValExp, QualType lhsType, SourceLocation ReturnLoc) { - + // Perform checking for returned stack addresses. if (lhsType->isPointerType()) { if (DeclRefExpr *DR = EvalAddr(RetValExp)) diff --git a/Sema/SemaUtil.h b/Sema/SemaUtil.h index 9be668bc54..35452b18e6 100644 --- a/Sema/SemaUtil.h +++ b/Sema/SemaUtil.h @@ -19,23 +19,9 @@ namespace clang { -/// Utility method to plow through parenthesis and casts. -static inline Expr* IgnoreParenCasts(Expr* E) { - while(true) { - if (ParenExpr* P = dyn_cast(E)) - E = P->getSubExpr(); - else if (CastExpr* P = dyn_cast(E)) - E = P->getSubExpr(); - else if (ImplicitCastExpr* P = dyn_cast(E)) - E = P->getSubExpr(); - else - return E; - } -} - /// Utility method to determine if a CallExpr is a call to a builtin. static inline bool isCallBuiltin(CallExpr* cexp) { - Expr* sub = IgnoreParenCasts(cexp->getCallee()); + Expr* sub = cexp->getCallee()->IgnoreParenCasts(); if (DeclRefExpr* E = dyn_cast(sub)) if (E->getDecl()->getIdentifier()->getBuiltinID() > 0) diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index ae1ae6c644..47f2269f48 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -116,11 +116,18 @@ public: /// then this method recursively returns its subexpression, and so forth. /// Otherwise, the method returns the current Expr. Expr* IgnoreParens(); + + /// IgnoreParenCasts - Ignore parentheses and casts. Strip off any ParenExpr + /// or CastExprs or ImplicitCastExprs, returning their operand. + Expr *IgnoreParenCasts(); const Expr* IgnoreParens() const { return const_cast(this)->IgnoreParens(); } - + const Expr *IgnoreParenCasts() const { + return const_cast(this)->IgnoreParenCasts(); + } + static bool classof(const Stmt *T) { return T->getStmtClass() >= firstExprConstant && T->getStmtClass() <= lastExprConstant;