diff options
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 { |