diff options
author | Steve Naroff <snaroff@apple.com> | 2008-09-10 18:33:00 +0000 |
---|---|---|
committer | Steve Naroff <snaroff@apple.com> | 2008-09-10 18:33:00 +0000 |
commit | 1f3b0d5ccabbc47aef525baec10c15d9fd1c6236 (patch) | |
tree | bee60acc8d69e40bb3c3547eb29433290db6c45d | |
parent | 957163829d04d89177b97be11a05a21242f4e10e (diff) |
Sema::ActOnIdentifierExpr(): Lookup block arguments.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56063 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 7 | ||||
-rw-r--r-- | test/Sema/block-args.c | 24 |
2 files changed, 30 insertions, 1 deletions
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. +} + |