From: Abramo Bagnara Date: Fri, 14 May 2010 17:07:14 +0000 (+0000) Subject: Added Expr::EvaluateAsAnyLValue. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e17a6436b429e4b18a5e157061fb13bbc677b3b0;p=clang Added Expr::EvaluateAsAnyLValue. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103780 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index aff6376aee..66639e2ef7 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -248,6 +248,15 @@ public: SourceLocation DiagLoc; EvalResult() : HasSideEffects(false), Diag(0), DiagExpr(0) {} + + // isGlobalLValue - Return true if the evaluated lvalue expression + // is global. + bool isGlobalLValue() const; + // hasSideEffects - Return true if the evaluated expression has + // side effects. + bool hasSideEffects() const { + return HasSideEffects; + } }; /// Evaluate - Return true if this is a constant which we can fold using @@ -279,6 +288,9 @@ public: /// with link time known address. bool EvaluateAsLValue(EvalResult &Result, ASTContext &Ctx) const; + /// EvaluateAsLValue - Evaluate an expression to see if it's a lvalue. + bool EvaluateAsAnyLValue(EvalResult &Result, ASTContext &Ctx) const; + /// \brief Enumeration used to describe how \c isNullPointerConstant() /// should cope with value-dependent expressions. enum NullPointerConstantValueDependence { diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index b2a192927f..f903035d22 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -106,8 +106,7 @@ static bool EvaluateComplex(const Expr *E, ComplexValue &Res, EvalInfo &Info); // Misc utilities //===----------------------------------------------------------------------===// -static bool IsGlobalLValue(LValue &Value) { - const Expr *E = Value.Base; +static bool IsGlobalLValue(const Expr* E) { if (!E) return true; if (const DeclRefExpr *DRE = dyn_cast(E)) { @@ -135,7 +134,7 @@ static bool EvalPointerValueAsBool(LValue& Value, bool& Result) { } // Require the base expression to be a global l-value. - if (!IsGlobalLValue(Value)) return false; + if (!IsGlobalLValue(Base)) return false; // We have a non-null base expression. These are generally known to // be true, but if it'a decl-ref to a weak symbol it can be null at @@ -2187,7 +2186,7 @@ bool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const { LValue LV; if (!EvaluatePointer(E, LV, Info)) return false; - if (!IsGlobalLValue(LV)) + if (!IsGlobalLValue(LV.Base)) return false; LV.moveInto(Info.EvalResult.Val); } else if (E->getType()->isRealFloatingType()) { @@ -2220,7 +2219,18 @@ bool Expr::EvaluateAsLValue(EvalResult &Result, ASTContext &Ctx) const { LValue LV; if (EvaluateLValue(this, LV, Info) && !Result.HasSideEffects && - IsGlobalLValue(LV)) { + IsGlobalLValue(LV.Base)) { + LV.moveInto(Result.Val); + return true; + } + return false; +} + +bool Expr::EvaluateAsAnyLValue(EvalResult &Result, ASTContext &Ctx) const { + EvalInfo Info(Ctx, Result); + + LValue LV; + if (EvaluateLValue(this, LV, Info)) { LV.moveInto(Result.Val); return true; } @@ -2250,6 +2260,12 @@ APSInt Expr::EvaluateAsInt(ASTContext &Ctx) const { return EvalResult.Val.getInt(); } + bool Expr::EvalResult::isGlobalLValue() const { + assert(Val.isLValue()); + return IsGlobalLValue(Val.getLValueBase()); + } + + /// isIntegerConstantExpr - this recursive routine will test if an expression is /// an integer constant expression.