diff options
author | John McCall <rjmccall@apple.com> | 2010-05-07 21:34:32 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-05-07 21:34:32 +0000 |
commit | 3554283157190e67918fad4221a5e6faf9317362 (patch) | |
tree | fd5b9fcffcee3c2a40171b3fdb2da6de171dd4d0 /lib/AST/ExprConstant.cpp | |
parent | ce87e6d501e4c924f246d2ebf82d780690589351 (diff) |
Make that null-dereference fix a little clearer by rearranging some code.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103298 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/ExprConstant.cpp')
-rw-r--r-- | lib/AST/ExprConstant.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index c534d03a5e..30eaae14d7 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -113,12 +113,24 @@ static bool EvaluateComplex(const Expr *E, ComplexValue &Res, EvalInfo &Info); static bool EvalPointerValueAsBool(LValue& Value, bool& Result) { const Expr* Base = Value.Base; - Result = Base || !Value.Offset.isZero(); + // A null base expression indicates a null pointer. These are always + // evaluatable, and they are false unless the offset is zero. + if (!Base) { + Result = !Value.Offset.isZero(); + return true; + } + + // 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 + // runtime. + + Result = true; - const DeclRefExpr* DeclRef = dyn_cast_or_null<DeclRefExpr>(Base); + const DeclRefExpr* DeclRef = dyn_cast<DeclRefExpr>(Base); if (!DeclRef) return true; + // If it's a weak symbol, it isn't constant-evaluable. const ValueDecl* Decl = DeclRef->getDecl(); if (Decl->hasAttr<WeakAttr>() || Decl->hasAttr<WeakRefAttr>() || |