[cfe-commits] r69201 - in /cfe/trunk: lib/Sema/SemaChecking.cpp test/Sema/variadic-block.c
Steve Naroff
snaroff at apple.com
Wed Apr 15 12:33:47 PDT 2009
Author: snaroff
Date: Wed Apr 15 14:33:47 2009
New Revision: 69201
URL: http://llvm.org/viewvc/llvm-project?rev=69201&view=rev
Log:
Fix <rdar://problem/6786597> varargs not supported for Blocks under clang.
Teach Sema::SemaBuiltinVAStart() about blocks.
Added:
cfe/trunk/test/Sema/variadic-block.c
Modified:
cfe/trunk/lib/Sema/SemaChecking.cpp
Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=69201&r1=69200&r2=69201&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Wed Apr 15 14:33:47 2009
@@ -209,7 +209,9 @@
// Determine whether the current function is variadic or not.
bool isVariadic;
- if (getCurFunctionDecl()) {
+ if (CurBlock)
+ isVariadic = CurBlock->isVariadic;
+ else if (getCurFunctionDecl()) {
if (FunctionProtoType* FTP =
dyn_cast<FunctionProtoType>(getCurFunctionDecl()->getType()))
isVariadic = FTP->isVariadic();
@@ -234,7 +236,9 @@
// FIXME: This isn't correct for methods (results in bogus warning).
// Get the last formal in the current function.
const ParmVarDecl *LastArg;
- if (FunctionDecl *FD = getCurFunctionDecl())
+ if (CurBlock)
+ LastArg = *(CurBlock->TheDecl->param_end()-1);
+ else if (FunctionDecl *FD = getCurFunctionDecl())
LastArg = *(FD->param_end()-1);
else
LastArg = *(getCurMethodDecl()->param_end()-1);
Added: cfe/trunk/test/Sema/variadic-block.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/variadic-block.c?rev=69201&view=auto
==============================================================================
--- cfe/trunk/test/Sema/variadic-block.c (added)
+++ cfe/trunk/test/Sema/variadic-block.c Wed Apr 15 14:33:47 2009
@@ -0,0 +1,41 @@
+// RUN: clang-cc %s -verify -fsyntax-only -fblocks
+
+#include <stdarg.h>
+
+int main(int argc, char *argv[]) {
+
+ long (^addthem)(const char *, ...) = ^long (const char *format, ...){
+ va_list argp;
+ const char *p;
+ int i;
+ char c;
+ double d;
+ long result = 0;
+ va_start(argp, format);
+ for (p = format; *p; p++) switch (*p) {
+ case 'i':
+ i = va_arg(argp, int);
+ result += i;
+ break;
+ case 'd':
+ d = va_arg(argp, double);
+ result += (int)d;
+ break;
+ case 'c':
+ c = va_arg(argp, int);
+ result += c;
+ break;
+ }
+ return result;
+ };
+ long testresult = addthem("ii", 10, 20);
+ if (testresult != 30) {
+ return 1;
+ }
+ testresult = addthem("idc", 30, 40.0, 'a');
+ if (testresult != (70+'a')) {
+ return 1;
+ }
+ return 0;
+}
+
More information about the cfe-commits
mailing list