From: Richard Smith Date: Wed, 11 Dec 2013 03:35:27 +0000 (+0000) Subject: When performing a delayed access check, use the surrounding lexical context for X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=537efc0429415ab25937fd1dce2c00d149d7f36f;p=clang When performing a delayed access check, use the surrounding lexical context for any local extern declaration, not just a local extern function. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@197000 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaAccess.cpp b/lib/Sema/SemaAccess.cpp index 61dc157f85..b7df3244ca 100644 --- a/lib/Sema/SemaAccess.cpp +++ b/lib/Sema/SemaAccess.cpp @@ -1482,11 +1482,10 @@ void Sema::HandleDelayedAccessCheck(DelayedDiagnostic &DD, Decl *D) { // However, this does not apply to local extern declarations. DeclContext *DC = D->getDeclContext(); - if (FunctionDecl *FN = dyn_cast(D)) { - if (D->getLexicalDeclContext()->isFunctionOrMethod()) - DC = D->getLexicalDeclContext(); - else - DC = FN; + if (D->isLocalExternDecl()) { + DC = D->getLexicalDeclContext(); + } else if (FunctionDecl *FN = dyn_cast(D)) { + DC = FN; } else if (TemplateDecl *TD = dyn_cast(D)) { DC = cast(TD->getTemplatedDecl()); } diff --git a/test/SemaCXX/access.cpp b/test/SemaCXX/access.cpp index 5ccd418c1b..5fa1509c53 100644 --- a/test/SemaCXX/access.cpp +++ b/test/SemaCXX/access.cpp @@ -136,3 +136,25 @@ namespace PR7434 { }; } } + +namespace LocalExternVar { + class test { + private: + struct private_struct { // expected-note 2{{here}} + int x; + }; + int use_private(); + }; + + int test::use_private() { + extern int array[sizeof(test::private_struct)]; // ok + return array[0]; + } + + int f() { + extern int array[sizeof(test::private_struct)]; // expected-error {{private}} + return array[0]; + } + + int array[sizeof(test::private_struct)]; // expected-error {{private}} +}