[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