Merge existing attributes before processing pragmas in friend template

declarations.
Fixes pr13662.

llvm-svn: 162360
This commit is contained in:
Rafael Espindola 2012-08-22 14:52:14 +00:00
parent 4d520640ba
commit 0c6c405e23
2 changed files with 10 additions and 2 deletions

View File

@ -1104,6 +1104,9 @@ Sema::CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK,
if (Attr)
ProcessDeclAttributeList(S, NewClass, Attr);
if (PrevClassTemplate)
mergeDeclAttributes(NewClass, PrevClassTemplate->getTemplatedDecl());
AddPushedVisibilityAttribute(NewClass);
if (TUK != TUK_Friend)
@ -1138,8 +1141,6 @@ Sema::CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK,
NewTemplate->setInvalidDecl();
NewClass->setInvalidDecl();
}
if (PrevClassTemplate)
mergeDeclAttributes(NewClass, PrevClassTemplate->getTemplatedDecl());
ActOnDocumentableDecl(NewTemplate);

View File

@ -21,3 +21,10 @@ void f() {
#pragma GCC visibility push(protected)
#pragma GCC visibility pop
}
namespace pr13662 {
#pragma GCC visibility push(hidden)
template<class T> class __attribute__((__visibility__("default"))) foo;
class bar { template<class T> friend class foo; };
#pragma GCC visibility pop
}