Fix crash w/BlockDecl and invalid qualified decl.

I'm not really satisfied with the ad-hoc nature of
Sema::diagnoseQualifiedDeclaration, but I'm not sure how to fix it.

Fixes <rdar://problem/14639501>.

llvm-svn: 188208
This commit is contained in:
Eli Friedman 2013-08-12 21:54:01 +00:00
parent 48a317663f
commit e2358c1deb
3 changed files with 8 additions and 2 deletions

View File

@ -5100,6 +5100,8 @@ def err_invalid_declarator_global_scope : Error<
"definition or redeclaration of %0 cannot name the global scope">; "definition or redeclaration of %0 cannot name the global scope">;
def err_invalid_declarator_in_function : Error< def err_invalid_declarator_in_function : Error<
"definition or redeclaration of %0 not allowed inside a function">; "definition or redeclaration of %0 not allowed inside a function">;
def err_invalid_declarator_in_block : Error<
"definition or redeclaration of %0 not allowed inside a block">;
def err_not_tag_in_scope : Error< def err_not_tag_in_scope : Error<
"no %select{struct|interface|union|class|enum}0 named %1 in %2">; "no %select{struct|interface|union|class|enum}0 named %1 in %2">;
def err_not_var_in_scope : Error< def err_not_var_in_scope : Error<

View File

@ -3998,7 +3998,7 @@ bool Sema::diagnoseQualifiedDeclaration(CXXScopeSpec &SS, DeclContext *DC,
DeclarationName Name, DeclarationName Name,
SourceLocation Loc) { SourceLocation Loc) {
DeclContext *Cur = CurContext; DeclContext *Cur = CurContext;
while (isa<LinkageSpecDecl>(Cur)) while (isa<LinkageSpecDecl>(Cur) || isa<CapturedDecl>(Cur))
Cur = Cur->getParent(); Cur = Cur->getParent();
// C++ [dcl.meaning]p1: // C++ [dcl.meaning]p1:
@ -4036,6 +4036,9 @@ bool Sema::diagnoseQualifiedDeclaration(CXXScopeSpec &SS, DeclContext *DC,
else if (isa<FunctionDecl>(Cur)) else if (isa<FunctionDecl>(Cur))
Diag(Loc, diag::err_invalid_declarator_in_function) Diag(Loc, diag::err_invalid_declarator_in_function)
<< Name << SS.getRange(); << Name << SS.getRange();
else if (isa<BlockDecl>(Cur))
Diag(Loc, diag::err_invalid_declarator_in_block)
<< Name << SS.getRange();
else else
Diag(Loc, diag::err_invalid_declarator_scope) Diag(Loc, diag::err_invalid_declarator_scope)
<< Name << cast<NamedDecl>(Cur) << cast<NamedDecl>(DC) << SS.getRange(); << Name << cast<NamedDecl>(Cur) << cast<NamedDecl>(DC) << SS.getRange();

View File

@ -1,4 +1,4 @@
// RUN: %clang_cc1 -fsyntax-only -std=c++98 -verify %s // RUN: %clang_cc1 -fsyntax-only -std=c++98 -verify -fblocks %s
namespace A { namespace A {
struct C { struct C {
static int cx; static int cx;
@ -50,6 +50,7 @@ namespace B {
void f1() { void f1() {
void A::Af(); // expected-error {{definition or redeclaration of 'Af' not allowed inside a function}} void A::Af(); // expected-error {{definition or redeclaration of 'Af' not allowed inside a function}}
void (^x)() = ^{ void A::Af(); }; // expected-error {{definition or redeclaration of 'Af' not allowed inside a block}}
} }
void f2() { void f2() {