When we generate a redeclaration for an

elaborated-type-specifier, place it in the correct
context.

llvm-svn: 208799
This commit is contained in:
John McCall 2014-05-14 18:31:48 +00:00
parent f662f0a65e
commit a16fc89206
3 changed files with 26 additions and 1 deletions

View File

@ -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

View File

@ -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}}
}
};
}

View File

@ -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}}
};
}