Don't warn about undefined varargs argument behavior in unreachable code.

Fixes <rdar://problem/12322000>.

llvm-svn: 171831
This commit is contained in:
Ted Kremenek 2013-01-08 01:50:40 +00:00
parent f7e654e3a7
commit a046169000
2 changed files with 19 additions and 5 deletions

View File

@ -9716,11 +9716,11 @@ ExprResult Sema::BuildVAArgExpr(SourceLocation BuiltinLoc,
if (TInfo->getType()->isSpecificBuiltinType(BuiltinType::Float)) if (TInfo->getType()->isSpecificBuiltinType(BuiltinType::Float))
PromoteType = Context.DoubleTy; PromoteType = Context.DoubleTy;
if (!PromoteType.isNull()) if (!PromoteType.isNull())
Diag(TInfo->getTypeLoc().getBeginLoc(), DiagRuntimeBehavior(TInfo->getTypeLoc().getBeginLoc(), E,
diag::warn_second_parameter_to_va_arg_never_compatible) PDiag(diag::warn_second_parameter_to_va_arg_never_compatible)
<< TInfo->getType() << TInfo->getType()
<< PromoteType << PromoteType
<< TInfo->getTypeLoc().getSourceRange(); << TInfo->getTypeLoc().getSourceRange());
} }
QualType T = TInfo->getType().getNonLValueExprType(Context); QualType T = TInfo->getType().getNonLValueExprType(Context);

View File

@ -0,0 +1,14 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-apple-darwin9
// expected-no-diagnostics
// From <rdar://problem/12322000>. Do not warn about undefined behavior of parameter
// argument types in unreachable code in a macro.
#define VA_ARG_RDAR12322000(Marker, TYPE) ((sizeof (TYPE) < sizeof (UINTN_RDAR12322000)) ? (TYPE)(__builtin_va_arg (Marker, UINTN_RDAR12322000)) : (TYPE)(__builtin_va_arg (Marker, TYPE)))
// 64-bit system
typedef unsigned long long UINTN_RDAR12322000;
int test_VA_ARG_RDAR12322000 (__builtin_va_list Marker)
{
return VA_ARG_RDAR12322000 (Marker, short); // no-warning
}