From: Jordan Rose Date: Fri, 11 Nov 2016 01:29:18 +0000 (+0000) Subject: Don't require nullability on 'va_list', even when it's a pointer. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bd1ee4830debd0c5b2622f25e2b9847b0f1d58e1;p=platform%2Fupstream%2Fllvm.git 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 llvm-svn: 286542 --- diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index e987379..2f776f9 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -3827,6 +3827,23 @@ static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state, } } + // Local function that returns true if its argument looks like a va_list. + auto isVaList = [&S](QualType T) -> bool { + auto *typedefTy = T->getAs(); + 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(); + } 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, @@ -3905,37 +3922,27 @@ static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state, // 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 (auto *attr = inferPointerNullability( - pointerKind, D.getDeclSpec().getTypeSpecTypeLoc(), - D.getMutableDeclSpec().getAttributes().getListRef())) { - T = Context.getAttributedType( - AttributedType::getNullabilityAttrKind(*inferNullability), T, T); - attr->setUsedAsTypeAttr(); + 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(); + } } } - auto isVaList = [&S](QualType T) -> bool { - auto *typedefTy = T->getAs(); - 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(); - } while (typedefTy); - return false; - }; - if (complainAboutMissingNullability == CAMN_Yes && T->isArrayType() && !T->getNullability(S.Context) && !isVaList(T) && D.isPrototypeContext() &&