erichkeane created this revision. erichkeane added reviewers: cfe-commits, chandlerc, majnemer. erichkeane set the repository for this revision to rL LLVM.
Based on the comment in the test, and my reading of the standard, a deprecated warning should be issued in the following case: template<typename T> [[deprecated]] class Foo{}; Foo<int> f; This was not the case, because the ClassTemplateSpecializationDecl creation did not also copy the deprecated attribute. Note: I did NOT audit the complete set of attributes to see WHICH ones should be copied, so instead I simply copy ONLY the deprecated attribute. Repository: rL LLVM https://reviews.llvm.org/D27486 Files: lib/Sema/SemaTemplate.cpp test/CXX/dcl.dcl/dcl.attr/dcl.attr.deprecated/p1.cpp Index: lib/Sema/SemaTemplate.cpp =================================================================== --- lib/Sema/SemaTemplate.cpp +++ lib/Sema/SemaTemplate.cpp @@ -2352,6 +2352,10 @@ ClassTemplate->getLocation(), ClassTemplate, Converted, nullptr); + if (auto *attr = ClassTemplate->getTemplatedDecl() + ->getAttr<clang::DeprecatedAttr>()) { + Decl->addAttr(attr->clone(Context)); + } ClassTemplate->AddSpecialization(Decl, InsertPos); if (ClassTemplate->isOutOfLine()) Decl->setLexicalDeclContext(ClassTemplate->getLexicalDeclContext()); Index: test/CXX/dcl.dcl/dcl.attr/dcl.attr.deprecated/p1.cpp =================================================================== --- test/CXX/dcl.dcl/dcl.attr/dcl.attr.deprecated/p1.cpp +++ test/CXX/dcl.dcl/dcl.attr/dcl.attr.deprecated/p1.cpp @@ -23,7 +23,8 @@ X<char> x1; X<int> x2; // expected-warning {{'X<int>' is deprecated}} -template <typename T> class [[deprecated]] X2 {}; +template <typename T> class [[deprecated]] X2 {}; //expected-note {{'X2<char>' has been explicitly marked deprecated here}} template <> class X2<int> {}; -X2<char> x3; // FIXME: no warning! -X2<int> x4; +X2<char> x3; // expected-warning {{'X2<char>' is deprecated}} +X2<int> x4; // No warning, the specialization removes it. +
Index: lib/Sema/SemaTemplate.cpp =================================================================== --- lib/Sema/SemaTemplate.cpp +++ lib/Sema/SemaTemplate.cpp @@ -2352,6 +2352,10 @@ ClassTemplate->getLocation(), ClassTemplate, Converted, nullptr); + if (auto *attr = ClassTemplate->getTemplatedDecl() + ->getAttr<clang::DeprecatedAttr>()) { + Decl->addAttr(attr->clone(Context)); + } ClassTemplate->AddSpecialization(Decl, InsertPos); if (ClassTemplate->isOutOfLine()) Decl->setLexicalDeclContext(ClassTemplate->getLexicalDeclContext()); Index: test/CXX/dcl.dcl/dcl.attr/dcl.attr.deprecated/p1.cpp =================================================================== --- test/CXX/dcl.dcl/dcl.attr/dcl.attr.deprecated/p1.cpp +++ test/CXX/dcl.dcl/dcl.attr/dcl.attr.deprecated/p1.cpp @@ -23,7 +23,8 @@ X<char> x1; X<int> x2; // expected-warning {{'X<int>' is deprecated}} -template <typename T> class [[deprecated]] X2 {}; +template <typename T> class [[deprecated]] X2 {}; //expected-note {{'X2<char>' has been explicitly marked deprecated here}} template <> class X2<int> {}; -X2<char> x3; // FIXME: no warning! -X2<int> x4; +X2<char> x3; // expected-warning {{'X2<char>' is deprecated}} +X2<int> x4; // No warning, the specialization removes it. +
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits