diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2012-08-22 14:52:14 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2012-08-22 14:52:14 +0000 |
commit | 0c6c405e23d9933fc6c681473245e88dbfde4c97 (patch) | |
tree | 73610a2c5f53a17a22a754f5e67089bd92c5624f | |
parent | 4d520640ba437baff70fd518e445c8be929dbbe1 (diff) | |
download | bcm5719-llvm-0c6c405e23d9933fc6c681473245e88dbfde4c97.tar.gz bcm5719-llvm-0c6c405e23d9933fc6c681473245e88dbfde4c97.zip |
Merge existing attributes before processing pragmas in friend template
declarations.
Fixes pr13662.
llvm-svn: 162360
-rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 5 | ||||
-rw-r--r-- | clang/test/SemaCXX/pragma-visibility.cpp | 7 |
2 files changed, 10 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 4dbf3e45b38..98497cb64d1 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -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); diff --git a/clang/test/SemaCXX/pragma-visibility.cpp b/clang/test/SemaCXX/pragma-visibility.cpp index e3ef97a7444..18c59c8c10f 100644 --- a/clang/test/SemaCXX/pragma-visibility.cpp +++ b/clang/test/SemaCXX/pragma-visibility.cpp @@ -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 +} |