Pseudo-revirtualize CallExpr::getSourceRange by making it follow the

logic from CXXMemberCallExpr and by making it check for
CXXOperatorCallExpr in order to defer.  This is not really an awesome solution,
but I don't have a better idea.

llvm-svn: 126114
This commit is contained in:
John McCall 2011-02-21 06:23:05 +00:00
parent e9dab636df
commit 701417a0ac
4 changed files with 17 additions and 12 deletions

View File

@ -1843,9 +1843,7 @@ public:
SourceLocation getRParenLoc() const { return RParenLoc; }
void setRParenLoc(SourceLocation L) { RParenLoc = L; }
SourceRange getSourceRange() const {
return SourceRange(getCallee()->getLocStart(), RParenLoc);
}
SourceRange getSourceRange() const;
static bool classof(const Stmt *T) {
return T->getStmtClass() >= firstCallExprConstant &&

View File

@ -108,8 +108,6 @@ public:
/// FIXME: Returns 0 for member pointer call exprs.
CXXRecordDecl *getRecordDecl();
SourceRange getSourceRange() const;
static bool classof(const Stmt *T) {
return T->getStmtClass() == CXXMemberCallExprClass;
}

View File

@ -836,6 +836,19 @@ QualType CallExpr::getCallReturnType() const {
return FnType->getResultType();
}
SourceRange CallExpr::getSourceRange() const {
if (isa<CXXOperatorCallExpr>(this))
return cast<CXXOperatorCallExpr>(this)->getSourceRange();
SourceLocation begin = getCallee()->getLocStart();
if (begin.isInvalid() && getNumArgs() > 0)
begin = getArg(0)->getLocStart();
SourceLocation end = getRParenLoc();
if (end.isInvalid() && getNumArgs() > 0)
end = getArg(getNumArgs() - 1)->getLocEnd();
return SourceRange(begin, end);
}
OffsetOfExpr *OffsetOfExpr::Create(ASTContext &C, QualType type,
SourceLocation OperatorLoc,
TypeSourceInfo *tsi,

View File

@ -335,6 +335,9 @@ DependentScopeDeclRefExpr::CreateEmpty(ASTContext &C,
}
SourceRange CXXConstructExpr::getSourceRange() const {
if (isa<CXXTemporaryObjectExpr>(this))
return cast<CXXTemporaryObjectExpr>(this)->getSourceRange();
if (ParenRange.isValid())
return SourceRange(Loc, ParenRange.getEnd());
@ -397,13 +400,6 @@ CXXRecordDecl *CXXMemberCallExpr::getRecordDecl() {
return ThisArg->getType()->getAsCXXRecordDecl();
}
SourceRange CXXMemberCallExpr::getSourceRange() const {
SourceLocation LocStart = getCallee()->getLocStart();
if (LocStart.isInvalid() && getNumArgs() > 0)
LocStart = getArg(0)->getLocStart();
return SourceRange(LocStart, getRParenLoc());
}
//===----------------------------------------------------------------------===//
// Named casts