]> granicus.if.org Git - clang/commitdiff
Make that null-dereference fix a little clearer by rearranging some code.
authorJohn McCall <rjmccall@apple.com>
Fri, 7 May 2010 21:34:32 +0000 (21:34 +0000)
committerJohn McCall <rjmccall@apple.com>
Fri, 7 May 2010 21:34:32 +0000 (21:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103298 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExprConstant.cpp

index c534d03a5ed84492e7637bd8c45d013e0766b66b..30eaae14d71816e43dda8050b966c7cb62344619 100644 (file)
@@ -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>() ||