diff options
-rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 3 | ||||
-rw-r--r-- | clang/test/SemaCXX/access.cpp | 12 |
2 files changed, 13 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index b8b1f3a5bb5..697582c82c3 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -503,6 +503,9 @@ Sema::ActOnClassTemplate(Scope *S, unsigned TagSpec, TagKind TK, NewClass, PrevClassTemplate); NewClass->setDescribedClassTemplate(NewTemplate); + // Set the access specifier. + SetMemberAccessSpecifier(NewTemplate, PrevClassTemplate, AS); + // Set the lexical context of these templates NewClass->setLexicalDeclContext(CurContext); NewTemplate->setLexicalDeclContext(CurContext); diff --git a/clang/test/SemaCXX/access.cpp b/clang/test/SemaCXX/access.cpp index d95781c1b76..cfbc9c80692 100644 --- a/clang/test/SemaCXX/access.cpp +++ b/clang/test/SemaCXX/access.cpp @@ -2,8 +2,8 @@ class C { struct S; // expected-note {{previously declared 'private' here}} - public: + struct S {}; // expected-error {{'S' redeclared with 'public' access}} }; @@ -12,4 +12,12 @@ struct S { private: class C { }; // expected-error {{'C' redeclared with 'private' access}} -};
\ No newline at end of file +}; + +class T { +protected: + template<typename T> struct A; // expected-note {{previously declared 'protected' here}} + +private: + template<typename T> struct A {}; // expected-error {{'A' redeclared with 'private' access}} +}; |