forked from OSchip/llvm-project
When complaining about a non-POD second argument to va_arg, use a
special diagnostic for ARC ownership-qualified types. We wouldn't want to expose Objective-C programmers to the term "POD", would we? Fixes <rdar://problem/9772982>. llvm-svn: 136558
This commit is contained in:
parent
d8575e1e1d
commit
7e1eb935db
|
@ -4275,6 +4275,9 @@ def err_second_parameter_to_va_arg_abstract: Error<
|
|||
def warn_second_parameter_to_va_arg_not_pod : Warning<
|
||||
"second argument to 'va_arg' is of non-POD type %0">,
|
||||
InGroup<DiagGroup<"non-pod-varargs">>, DefaultError;
|
||||
def warn_second_parameter_to_va_arg_ownership_qualified : Warning<
|
||||
"second argument to 'va_arg' is of ARC ownership-qualified type %0">,
|
||||
InGroup<DiagGroup<"non-pod-varargs">>, DefaultError;
|
||||
def warn_second_parameter_to_va_arg_never_compatible : Warning<
|
||||
"second argument to 'va_arg' is of promotable type %0; this va_arg has "
|
||||
"undefined behavior because arguments will be promoted to %1">;
|
||||
|
|
|
@ -8591,11 +8591,14 @@ ExprResult Sema::BuildVAArgExpr(SourceLocation BuiltinLoc,
|
|||
<< TInfo->getTypeLoc().getSourceRange()))
|
||||
return ExprError();
|
||||
|
||||
if (!TInfo->getType().isPODType(Context))
|
||||
if (!TInfo->getType().isPODType(Context)) {
|
||||
Diag(TInfo->getTypeLoc().getBeginLoc(),
|
||||
diag::warn_second_parameter_to_va_arg_not_pod)
|
||||
TInfo->getType()->isObjCLifetimeType()
|
||||
? diag::warn_second_parameter_to_va_arg_ownership_qualified
|
||||
: diag::warn_second_parameter_to_va_arg_not_pod)
|
||||
<< TInfo->getType()
|
||||
<< TInfo->getTypeLoc().getSourceRange();
|
||||
}
|
||||
|
||||
// Check for va_arg where arguments of the given type will be promoted
|
||||
// (i.e. this va_arg is guaranteed to have undefined behavior).
|
||||
|
|
|
@ -53,3 +53,11 @@ void test(id __strong *sip, id __weak *wip, id __autoreleasing *aip,
|
|||
// expected-note{{explicitly cast the pointer to silence this warning}}
|
||||
memmove(ptr, uip, 17);
|
||||
}
|
||||
|
||||
void rdar9772982(int i, ...) {
|
||||
__builtin_va_list ap;
|
||||
|
||||
__builtin_va_start(ap, i);
|
||||
__builtin_va_arg(ap, __strong id); // expected-error{{second argument to 'va_arg' is of ARC ownership-qualified type '__strong id'}}
|
||||
__builtin_va_end(ap);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue