Fixe bogus error for variable argument methods. Sema::ObjcGetTypeForMethodDefinition() wasn't preserving the isVariadic boolean. Another fix is to avoid synthsizing the function decl entirely, however this is a separate issue that I don't want to deal with now. Also added a FIXME to Sema::CheckFunctionCall(), which is currently emitting a bogus warning.

llvm-svn: 45146
This commit is contained in:
Steve Naroff 2007-12-18 03:41:15 +00:00
parent aa5c91980e
commit b74406ba98
3 changed files with 19 additions and 2 deletions

View File

@ -62,7 +62,7 @@ Sema::CheckFunctionCall(Expr *Fn,
diag::err_va_start_used_in_non_variadic_function);
return true;
}
// FIXME: This isn't correct for methods (results in bogus warning).
bool SecondArgIsLastNamedArgument = false;
if (DeclRefExpr *DR = dyn_cast<DeclRefExpr>(Args[1])) {
if (ParmVarDecl *PV = dyn_cast<ParmVarDecl>(DR->getDecl())) {

View File

@ -366,7 +366,7 @@ QualType Sema::ObjcGetTypeForMethodDefinition(DeclTy *D) {
ArgTys.push_back(ArgTy);
}
T = Context.getFunctionType(T, &ArgTys[0], ArgTys.size(),
false);
MDecl->isVariadic());
return T;
}

View File

@ -0,0 +1,17 @@
// RUN: clang -fsyntax-only -verify %s
#include <stdarg.h>
@interface NSObject @end
@interface XX : NSObject @end
@implementation XX
- (void)encodeValuesOfObjCTypes:(const char *)types, ... {
va_list ap;
va_start(ap, types); // expected-warning {{second parameter of 'va_start' not last named argument}}
while (*types) ;
va_end(ap);
}
@end