Fixed some corner cases due to implicit int TypeLoc and simplified the logic.
authorAbramo Bagnara <abramo.bagnara@bugseng.com>
Thu, 18 Oct 2012 08:29:37 +0000 (08:29 +0000)
committerAbramo Bagnara <abramo.bagnara@bugseng.com>
Thu, 18 Oct 2012 08:29:37 +0000 (08:29 +0000)
llvm-svn: 166174

clang/lib/AST/TypeLoc.cpp

index c9c084a..58c4cbd 100644 (file)
@@ -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 {