From: John McCall Date: Wed, 14 May 2014 18:31:48 +0000 (+0000) Subject: When we generate a redeclaration for an X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6c2c5c652482721febec7208ba669646ca7a1aa9;p=clang When we generate a redeclaration for an elaborated-type-specifier, place it in the correct context. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@208799 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index c43c881f1e..2f434cedfe 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -10981,7 +10981,15 @@ Decl *Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, } // Okay, this is definition of a previously declared or referenced - // tag PrevDecl. We're going to create a new Decl for it. + // tag. We're going to create a new Decl for it. + } + + // Okay, we're going to make a redeclaration. If this is some kind + // of reference, make sure we build the redeclaration in the same DC + // as the original, and ignore the current access specifier. + if (TUK == TUK_Friend || TUK == TUK_Reference) { + SearchDC = PrevTagDecl->getDeclContext(); + AS = AS_none; } } // If we get here we have (another) forward declaration or we diff --git a/test/SemaCXX/elaborated-type-specifier.cpp b/test/SemaCXX/elaborated-type-specifier.cpp index 1b1770a89f..81c5cb4eac 100644 --- a/test/SemaCXX/elaborated-type-specifier.cpp +++ b/test/SemaCXX/elaborated-type-specifier.cpp @@ -43,3 +43,12 @@ int test_funcparam_scope(struct S5 * s5) { if (s5 == s5_2) return 1; // expected-error {{comparison of distinct pointer types ('struct S5 *' and 'struct S5 *')}} return 0; } + +namespace test5 { + struct A { + class __attribute__((visibility("hidden"))) B {}; + + void test(class __attribute__((visibility("hidden"), noreturn)) B b) { // expected-warning {{'noreturn' attribute only applies to functions and methods}} + } + }; +} diff --git a/test/SemaCXX/friend.cpp b/test/SemaCXX/friend.cpp index aed2ab2c7d..03589101e1 100644 --- a/test/SemaCXX/friend.cpp +++ b/test/SemaCXX/friend.cpp @@ -288,3 +288,11 @@ namespace test10 { ::test10::f10_d(z); } } + +namespace test11 { + class __attribute__((visibility("hidden"))) B; + + class A { + friend class __attribute__((visibility("hidden"), noreturn)) B; // expected-warning {{'noreturn' attribute only applies to functions and methods}} + }; +}