diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index b4bb0b6b64408ad266d99cf0c26e5cd285af5654..4b77028a9125880bf51fd644c7135ae323237a53 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -2212,11 +2212,11 @@ public: /// getArg - Return the specified argument. Expr *getArg(unsigned Arg) { assert(Arg < NumArgs && "Arg access out of range!"); - return cast<Expr>(SubExprs[Arg+getNumPreArgs()+PREARGS_START]); + return cast_or_null<Expr>(SubExprs[Arg + getNumPreArgs() + PREARGS_START]); } const Expr *getArg(unsigned Arg) const { assert(Arg < NumArgs && "Arg access out of range!"); - return cast<Expr>(SubExprs[Arg+getNumPreArgs()+PREARGS_START]); + return cast_or_null<Expr>(SubExprs[Arg + getNumPreArgs() + PREARGS_START]); } /// setArg - Set the specified argument. diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 97f1b8826193909e41889380c01776cfae92dd3c..e1ebda245f2b8edf96ce7b61d35ec976a87157fe 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -1252,7 +1252,7 @@ SourceLocation CallExpr::getLocStart() const { return cast<CXXOperatorCallExpr>(this)->getLocStart(); SourceLocation begin = getCallee()->getLocStart(); - if (begin.isInvalid() && getNumArgs() > 0) + if (begin.isInvalid() && getNumArgs() > 0 && getArg(0)) begin = getArg(0)->getLocStart(); return begin; } @@ -1261,7 +1261,7 @@ SourceLocation CallExpr::getLocEnd() const { return cast<CXXOperatorCallExpr>(this)->getLocEnd(); SourceLocation end = getRParenLoc(); - if (end.isInvalid() && getNumArgs() > 0) + if (end.isInvalid() && getNumArgs() > 0 && getArg(getNumArgs() - 1)) end = getArg(getNumArgs() - 1)->getLocEnd(); return end; }