forked from OSchip/llvm-project
Don't require nullability on 'va_list'.
There are many non-portable typedefs, but va_list is one that nobody ever thinks of as a pointer or an array. (When's the last time you saw someone check for a NULL va_list?) Make an exception for this one special type. Part of rdar://problem/25846421. llvm-svn: 286522
This commit is contained in:
parent
3b917fe019
commit
16d52a2a72
|
@ -3919,8 +3919,22 @@ static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state,
|
||||||
attr->setUsedAsTypeAttr();
|
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;
|
||||||
|
typedefTy = typedefTy->desugar()->getAs<TypedefType>();
|
||||||
|
} while (typedefTy);
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
if (complainAboutMissingNullability == CAMN_Yes &&
|
if (complainAboutMissingNullability == CAMN_Yes &&
|
||||||
T->isArrayType() && !T->getNullability(S.Context) &&
|
T->isArrayType() && !T->getNullability(S.Context) && !isVaList(T) &&
|
||||||
D.isPrototypeContext() &&
|
D.isPrototypeContext() &&
|
||||||
!hasOuterPointerLikeChunk(D, D.getNumTypeObjects())) {
|
!hasOuterPointerLikeChunk(D, D.getNumTypeObjects())) {
|
||||||
checkNullabilityConsistency(S, SimplePointerKind::Array,
|
checkNullabilityConsistency(S, SimplePointerKind::Array,
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
void firstThingInTheFileThatNeedsNullabilityIsAnArray(int ints[]);
|
void firstThingInTheFileThatNeedsNullabilityIsAnArray(int ints[]);
|
||||||
#if ARRAYS_CHECKED
|
#if ARRAYS_CHECKED
|
||||||
// expected-warning@-2 {{array parameter is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)}}
|
// expected-warning@-2 {{array parameter is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)}}
|
||||||
|
@ -33,6 +35,26 @@ void testAllOK(
|
||||||
void * _Nullable ptrs[_Nonnull],
|
void * _Nullable ptrs[_Nonnull],
|
||||||
void * _Nullable * _Nullable nestedPtrs[_Nonnull]);
|
void * _Nullable * _Nullable nestedPtrs[_Nonnull]);
|
||||||
|
|
||||||
|
void testVAList(va_list ok); // no warning
|
||||||
|
|
||||||
|
#if __cplusplus
|
||||||
|
// Carefully construct a test case such that if a platform's va_list is an array
|
||||||
|
// or pointer type, it gets tested, but otherwise it does not.
|
||||||
|
template<class T, class F>
|
||||||
|
struct pointer_like_or { typedef F type; };
|
||||||
|
template<class T, class F>
|
||||||
|
struct pointer_like_or<T*, F> { typedef T *type; };
|
||||||
|
template<class T, class F>
|
||||||
|
struct pointer_like_or<T* const, F> { typedef T * const type; };
|
||||||
|
template<class T, class F>
|
||||||
|
struct pointer_like_or<T[], F> { typedef T type[]; };
|
||||||
|
template<class T, class F, unsigned size>
|
||||||
|
struct pointer_like_or<T[size], F> { typedef T type[size]; };
|
||||||
|
|
||||||
|
void testVAListWithNullability(
|
||||||
|
pointer_like_or<va_list, void*>::type _Nonnull x); // no errors
|
||||||
|
#endif
|
||||||
|
|
||||||
void nestedArrays(int x[5][1]) {}
|
void nestedArrays(int x[5][1]) {}
|
||||||
#if ARRAYS_CHECKED
|
#if ARRAYS_CHECKED
|
||||||
// expected-warning@-2 {{array parameter is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)}}
|
// expected-warning@-2 {{array parameter is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)}}
|
||||||
|
|
Loading…
Reference in New Issue