[cfe-commits] r69201 - in /cfe/trunk: lib/Sema/SemaChecking.cpp test/Sema/variadic-block.c

steve naroff snaroff at apple.com
Wed Apr 15 13:36:02 PDT 2009


On Apr 15, 2009, at 3:54 PM, Chris Lattner wrote:

> 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?
>

Will do...

snaroff

> -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