aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Sema/SemaDeclObjC.cpp2
-rw-r--r--include/clang/AST/DeclObjC.h3
-rw-r--r--test/Sema/va-method-1.m17
-rw-r--r--test/Sema/va-method.m2
4 files changed, 22 insertions, 2 deletions
diff --git a/Sema/SemaDeclObjC.cpp b/Sema/SemaDeclObjC.cpp
index 5e15753af6..60d8ce42e3 100644
--- a/Sema/SemaDeclObjC.cpp
+++ b/Sema/SemaDeclObjC.cpp
@@ -64,7 +64,7 @@ void Sema::ObjCActOnStartOfMethodDef(Scope *FnBodyScope, DeclTy *D) {
PI.Ident = PDecl->getIdentifier();
PI.IdentLoc = PDecl->getLocation(); // user vars have a real location.
PI.TypeInfo = PDecl->getType().getAsOpaquePtr();
- ActOnParamDeclarator(PI, FnBodyScope);
+ MDecl->setParamDecl(i, ActOnParamDeclarator(PI, FnBodyScope));
}
}
diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h
index fb81437772..c2048115c3 100644
--- a/include/clang/AST/DeclObjC.h
+++ b/include/clang/AST/DeclObjC.h
@@ -135,6 +135,9 @@ public:
assert(i < getNumParams() && "Illegal param #");
return ParamInfo[i];
}
+ void setParamDecl(int i, ParmVarDecl *pDecl) {
+ ParamInfo[i] = pDecl;
+ }
void setMethodParams(ParmVarDecl **NewParamInfo, unsigned NumParams);
AttributeList *getMethodAttrs() const {return MethodAttrs;}
diff --git a/test/Sema/va-method-1.m b/test/Sema/va-method-1.m
new file mode 100644
index 0000000000..077982abbf
--- /dev/null
+++ b/test/Sema/va-method-1.m
@@ -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);
+ while (*types) ;
+ va_end(ap);
+}
+
+@end
+
diff --git a/test/Sema/va-method.m b/test/Sema/va-method.m
index 1393af1eb2..258286937f 100644
--- a/test/Sema/va-method.m
+++ b/test/Sema/va-method.m
@@ -8,7 +8,7 @@
@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}}
+ va_start(ap, types);
while (*types) ;
va_end(ap);
}