зеркало из https://github.com/microsoft/clang-1.git
dgregor accidentally killed this assert, but on investigation, it can fire
on invalid code and we don't really care, so kill it harder. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125068 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
8348de33e9
Коммит
da263795ab
|
@ -486,27 +486,19 @@ static void maybeSynthesizeBlockSignature(TypeProcessingState &state,
|
|||
return;
|
||||
}
|
||||
|
||||
// If there are any type objects, the type as written won't
|
||||
// name a function, regardless of the decl spec type. This
|
||||
// is because a block signature declarator is always an
|
||||
// abstract-declarator, and abstract-declarators can't just
|
||||
// be parentheses chunks. Therefore we need to build a function
|
||||
// chunk unless there are no type objects and the decl spec
|
||||
// type is a function.
|
||||
// If there are any type objects, the type as written won't name a
|
||||
// function, regardless of the decl spec type. This is because a
|
||||
// block signature declarator is always an abstract-declarator, and
|
||||
// abstract-declarators can't just be parentheses chunks. Therefore
|
||||
// we need to build a function chunk unless there are no type
|
||||
// objects and the decl spec type is a function.
|
||||
if (!declarator.getNumTypeObjects() && declSpecType->isFunctionType())
|
||||
return;
|
||||
|
||||
#ifndef NDEBUG
|
||||
if (declarator.getNumTypeObjects()) {
|
||||
bool isOnlyParens = true;
|
||||
for (unsigned i = 0, e = declarator.getNumTypeObjects(); i != e; ++i) {
|
||||
if (declarator.getTypeObject(i).Kind != DeclaratorChunk::Paren) {
|
||||
isOnlyParens = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
// Note that there *are* cases with invalid declarators where
|
||||
// declarators consist solely of parentheses. In general, these
|
||||
// occur only in failed efforts to make function declarators, so
|
||||
// faking up the function chunk is still the right thing to do.
|
||||
|
||||
// Otherwise, we need to fake up a function declarator.
|
||||
SourceLocation loc = declarator.getSourceRange().getBegin();
|
||||
|
|
|
@ -34,3 +34,9 @@ void f0() {
|
|||
^(int, double d, char) {}(1, 1.34, 'a'); // expected-error {{parameter name omitted}} \
|
||||
// expected-error {{parameter name omitted}}
|
||||
}
|
||||
|
||||
// rdar://problem/8962770
|
||||
void test4() {
|
||||
int (^f)() = ^((x)) { }; // expected-error {{expected ')'}} expected-warning {{type specifier missing}} expected-note {{to match this}}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче