diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-12-23 04:00:48 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-12-23 04:00:48 +0000 |
commit | 49ace5cd62ed988ddb0b0493b9e88146eb6f074c (patch) | |
tree | a476c7bbdb40505ab746494896b12e063e9d0658 | |
parent | c87915629b965cfd6d8db08ebe990de5fcb2b077 (diff) | |
download | bcm5719-llvm-49ace5cd62ed988ddb0b0493b9e88146eb6f074c.tar.gz bcm5719-llvm-49ace5cd62ed988ddb0b0493b9e88146eb6f074c.zip |
Fix CXXConstructExpr::getSourceRange() to not include the source ranges of CXXDefaultArgExprs when computing its range (since these expressions have no source range, and using them will make the encompassing range invalid).
llvm-svn: 91984
-rw-r--r-- | clang/include/clang/AST/ExprCXX.h | 8 | ||||
-rw-r--r-- | clang/lib/AST/ExprCXX.cpp | 12 |
2 files changed, 13 insertions, 7 deletions
diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index 4b540d9c54f..88e667a2c26 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -561,13 +561,7 @@ public: Args[Arg] = ArgExpr; } - virtual SourceRange getSourceRange() const { - // FIXME: Should we know where the parentheses are, if there are any? - if (NumArgs == 0) - return SourceRange(Loc); - - return SourceRange(Loc, Args[NumArgs - 1]->getLocEnd()); - } + virtual SourceRange getSourceRange() const; static bool classof(const Stmt *T) { return T->getStmtClass() == CXXConstructExprClass || diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index 9c14f741fdd..5444a7748cb 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -282,6 +282,18 @@ bool UnaryTypeTraitExpr::EvaluateTrait(ASTContext& C) const { } } +SourceRange CXXConstructExpr::getSourceRange() const { + // FIXME: Should we know where the parentheses are, if there are any? + for (std::reverse_iterator<Stmt**> I(&Args[NumArgs]), E(&Args[0]); I!=E;++I) { + // Ignore CXXDefaultExprs when computing the range, as they don't + // have a range. + if (!isa<CXXDefaultArgExpr>(*I)) + return SourceRange(Loc, (*I)->getLocEnd()); + } + + return SourceRange(Loc); +} + SourceRange CXXOperatorCallExpr::getSourceRange() const { OverloadedOperatorKind Kind = getOperator(); if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) { |