Fix an error with the declaration of block parameters that depend

on previous block parameters that crept in as part of my captures
work a month or so ago.

llvm-svn: 128121
This commit is contained in:
John McCall 2011-03-22 23:15:50 +00:00
parent 122a6304ef
commit 92d627e1b0
2 changed files with 19 additions and 5 deletions

View File

@ -782,11 +782,20 @@ diagnoseUncapturableValueReference(Sema &S, SourceLocation loc,
// diagnose this.
if (!S.CurContext->isFunctionOrMethod()) return CR_NoCapture;
// This particular madness can happen in ill-formed default
// arguments; claim it's okay and let downstream code handle it.
if (isa<ParmVarDecl>(var) &&
S.CurContext == var->getDeclContext()->getParent())
return CR_NoCapture;
// Certain madnesses can happen with parameter declarations, which
// we want to ignore.
if (isa<ParmVarDecl>(var)) {
// - If the parameter still belongs to the translation unit, then
// we're actually just using one parameter in the declaration of
// the next. This is useful in e.g. VLAs.
if (isa<TranslationUnitDecl>(var->getDeclContext()))
return CR_NoCapture;
// - This particular madness can happen in ill-formed default
// arguments; claim it's okay and let downstream code handle it.
if (S.CurContext == var->getDeclContext()->getParent())
return CR_NoCapture;
}
DeclarationName functionName;
if (FunctionDecl *fn = dyn_cast<FunctionDecl>(var->getDeclContext()))

View File

@ -40,3 +40,8 @@ void test4() {
int (^f)() = ^((x)) { }; // expected-error {{expected ')'}} expected-warning {{type specifier missing}} expected-note {{to match this}}
}
// rdar://problem/9170609
void test5_helper(void (^)(int, int[*]));
void test5(void) {
test5_helper(^(int n, int array[n]) {});
}