[cfe-commits] r69201 - in /cfe/trunk: lib/Sema/SemaChecking.cpp test/Sema/variadic-block.c
Chris Lattner
clattner at apple.com
Wed Apr 15 12:54:59 PDT 2009
On Apr 15, 2009, at 12:33 PM, Steve Naroff wrote:
> 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.
Thanks Steve, can you verify that codegen works for this construct also?
-Chris
>
>
> 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;
> +}
> +
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list