diff options
author | Abramo Bagnara <abramo.bagnara@bugseng.com> | 2012-10-18 08:29:37 +0000 |
---|---|---|
committer | Abramo Bagnara <abramo.bagnara@bugseng.com> | 2012-10-18 08:29:37 +0000 |
commit | 278eafa2cd8296f8128d13c6466a0ace3d03a872 (patch) | |
tree | be4eaa1020fdaeb565886765f2d0b0566b58b2ee /lib/AST/TypeLoc.cpp | |
parent | 49c67c4099fc238b49a849553f2275eb43ea6675 (diff) |
Fixed some corner cases due to implicit int TypeLoc and simplified the logic.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@166174 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/TypeLoc.cpp')
-rw-r--r-- | lib/AST/TypeLoc.cpp | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/lib/AST/TypeLoc.cpp b/lib/AST/TypeLoc.cpp index c9c084ab83..58c4cbd00c 100644 --- a/lib/AST/TypeLoc.cpp +++ b/lib/AST/TypeLoc.cpp @@ -98,27 +98,38 @@ void TypeLoc::initializeImpl(ASTContext &Context, TypeLoc TL, SourceLocation TypeLoc::getBeginLoc() const { TypeLoc Cur = *this; + TypeLoc LeftMost = Cur; while (true) { switch (Cur.getTypeLocClass()) { + case Elaborated: + LeftMost = Cur; + break; case FunctionProto: - if (cast<FunctionProtoTypeLoc>(&Cur)->getTypePtr()->hasTrailingReturn()) - return Cur.getLocalSourceRange().getBegin(); + if (cast<FunctionProtoTypeLoc>(&Cur)->getTypePtr()->hasTrailingReturn()) { + LeftMost = Cur; + break; + } + /* Fall through */ + case FunctionNoProto: + case ConstantArray: + case DependentSizedArray: + case IncompleteArray: + case VariableArray: + // FIXME: Currently QualifiedTypeLoc does not have a source range + case Qualified: Cur = Cur.getNextTypeLoc(); - assert(!Cur.isNull()); continue; - - // FIXME: Currently QualifiedTypeLoc does not have a source range - // case Qualified: - case Elaborated: - return Cur.getLocalSourceRange().getBegin(); - default: - if (Cur.getNextTypeLoc().isNull()) - return Cur.getLocalSourceRange().getBegin(); + if (!Cur.getLocalSourceRange().getBegin().isInvalid()) + LeftMost = Cur; Cur = Cur.getNextTypeLoc(); + if (Cur.isNull()) + break; continue; } // switch + break; } // while + return LeftMost.getLocalSourceRange().getBegin(); } SourceLocation TypeLoc::getEndLoc() const { |