From: Steve Naroff Date: Wed, 10 Sep 2008 18:33:00 +0000 (+0000) Subject: Sema::ActOnIdentifierExpr(): Lookup block arguments. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1f3b0d5ccabbc47aef525baec10c15d9fd1c6236;p=clang Sema::ActOnIdentifierExpr(): Lookup block arguments. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56063 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 8a297ac1d7..80b33f2087 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -354,7 +354,12 @@ Sema::ExprResult Sema::ActOnIdentifierExpr(Scope *S, SourceLocation Loc, return new PredefinedExpr(Loc, T, PredefinedExpr::ObjCSuper); } } - + // If we are parsing a block, check the block parameter list. + if (CurBlock) { + for (unsigned i = 0, e = CurBlock->Params.size(); i != e; ++i) + if (CurBlock->Params[i]->getIdentifier() == &II) + D = CurBlock->Params[i]; + } if (D == 0) { // Otherwise, this could be an implicitly declared function reference (legal // in C90, extension in C99). diff --git a/test/Sema/block-args.c b/test/Sema/block-args.c new file mode 100644 index 0000000000..d85d582df8 --- /dev/null +++ b/test/Sema/block-args.c @@ -0,0 +1,24 @@ +// RUN: clang %s -fsyntax-only -verify + +void take(void*); + +void test() { + take(^(int x){}); + take(^(int x, int y){}); + take(^(int x, int y){}); + take(^(int x, int x){}); // expected-error {{redefinition of parameter 'x'}} + + + take(^(int x) { return x+1; }); + + int (^CP)(int) = ^(int x) { return x*x; }; + take(CP); + + int arg; + ^{return 1;}(); + ^{return 2;}(arg); // expected-error {{too many arguments to block call}} + ^(void){return 3;}(1); // expected-error {{too many arguments to block call}} + ^(){return 4;}(arg); // C style (...), ok. + ^(int x, ...){return 5;}(arg, arg); // Explicit varargs, ok. +} +