[clang-tidy] Fix an assert failure in `modernize-loop-convert`.

Summary:
The test code will trigger following an assert failure:

assert.h assertion failed at LoopConvertUtils.cpp:560 in
bool clang::tidy::modernize::ForLoopIndexUseVisitor::TraverseMemberExpr(clang::MemberExpr*): ExprType->isPointerType() && "Operator-> returned non-pointer type"

Reviewers: alexfh

Differential Revision: http://reviews.llvm.org/D17287

llvm-svn: 260953
This commit is contained in:
Haojian Wu 2016-02-16 10:36:51 +00:00
parent 67f880641c
commit 6b4c0b5b66
2 changed files with 21 additions and 1 deletions

View File

@ -557,7 +557,9 @@ bool ForLoopIndexUseVisitor::TraverseMemberExpr(MemberExpr *Member) {
if (ExprType.isNull())
ExprType = Obj->getType();
assert(ExprType->isPointerType() && "Operator-> returned non-pointer type");
if (!ExprType->isPointerType())
return false;
// FIXME: This works around not having the location of the arrow operator.
// Consider adding OperatorLoc to MemberExpr?
SourceLocation ArrowLoc = Lexer::getLocForEndOfToken(

View File

@ -0,0 +1,18 @@
// RUN: clang-tidy %s -checks=-*,modernize-loop-convert --
// Note: this test expects no assert failure happened in clang-tidy.
class LinguisticItem {
LinguisticItem *x0;
class x1 {
bool operator!= ( const x1 &;
operator* ( ;
LinguisticItem * &operator-> ( ;
operator++ (
} begin() const;
x1 end() const {
LinguisticStream x2;
for (x1 x3 = x2.begin x3 != x2.end; ++x3)
x3->x0
}
};