Don't require nullability on 'va_list', even when it's a pointer.

Take 3! This should finally fix the Hexagon, PPC, and Windows bots.

rdar://problem/25846421

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@286542 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp
index fa65b67..3b8345f 100644
--- a/lib/Sema/SemaType.cpp
+++ b/lib/Sema/SemaType.cpp
@@ -3804,6 +3804,23 @@
     }
   }
 
+  // Local function that returns true if its argument looks like a va_list.
+  auto isVaList = [&S](QualType T) -> bool {
+    auto *typedefTy = T->getAs<TypedefType>();
+    if (!typedefTy)
+      return false;
+    TypedefDecl *vaListTypedef = S.Context.getBuiltinVaListDecl();
+    do {
+      if (typedefTy->getDecl() == vaListTypedef)
+        return true;
+      if (auto *name = typedefTy->getDecl()->getIdentifier())
+        if (name->isStr("va_list"))
+          return true;
+      typedefTy = typedefTy->desugar()->getAs<TypedefType>();
+    } while (typedefTy);
+    return false;
+  };
+
   // Local function that checks the nullability for a given pointer declarator.
   // Returns true if _Nonnull was inferred.
   auto inferPointerNullability = [&](SimplePointerKind pointerKind,
@@ -3882,37 +3899,27 @@
   // nullability and perform consistency checking.
   if (S.ActiveTemplateInstantiations.empty()) {
     if (T->canHaveNullability() && !T->getNullability(S.Context)) {
-      SimplePointerKind pointerKind = SimplePointerKind::Pointer;
-      if (T->isBlockPointerType())
-        pointerKind = SimplePointerKind::BlockPointer;
-      else if (T->isMemberPointerType())
-        pointerKind = SimplePointerKind::MemberPointer;
+      if (isVaList(T)) {
+        // Record that we've seen a pointer, but do nothing else.
+        if (NumPointersRemaining > 0)
+          --NumPointersRemaining;
+      } else {
+        SimplePointerKind pointerKind = SimplePointerKind::Pointer;
+        if (T->isBlockPointerType())
+          pointerKind = SimplePointerKind::BlockPointer;
+        else if (T->isMemberPointerType())
+          pointerKind = SimplePointerKind::MemberPointer;
 
-      if (auto *attr = inferPointerNullability(
-                         pointerKind, D.getDeclSpec().getTypeSpecTypeLoc(),
-                         D.getMutableDeclSpec().getAttributes().getListRef())) {
-        T = Context.getAttributedType(
-              AttributedType::getNullabilityAttrKind(*inferNullability), T, T);
-        attr->setUsedAsTypeAttr();
+        if (auto *attr = inferPointerNullability(
+              pointerKind, D.getDeclSpec().getTypeSpecTypeLoc(),
+              D.getMutableDeclSpec().getAttributes().getListRef())) {
+          T = Context.getAttributedType(
+                AttributedType::getNullabilityAttrKind(*inferNullability),T,T);
+          attr->setUsedAsTypeAttr();
+        }
       }
     }
 
-    auto isVaList = [&S](QualType T) -> bool {
-      auto *typedefTy = T->getAs<TypedefType>();
-      if (!typedefTy)
-        return false;
-      TypedefDecl *vaListTypedef = S.Context.getBuiltinVaListDecl();
-      do {
-        if (typedefTy->getDecl() == vaListTypedef)
-          return true;
-        if (auto *name = typedefTy->getDecl()->getIdentifier())
-          if (name->isStr("va_list"))
-            return true;
-        typedefTy = typedefTy->desugar()->getAs<TypedefType>();
-      } while (typedefTy);
-      return false;
-    };
-
     if (complainAboutMissingNullability == CAMN_Yes &&
         T->isArrayType() && !T->getNullability(S.Context) && !isVaList(T) &&
         D.isPrototypeContext() &&