https://github.com/premanandrao updated https://github.com/llvm/llvm-project/pull/97619
>From e1076942f07b1d2de857688c88de6ff966861650 Mon Sep 17 00:00:00 2001 From: Premanand M Rao <premanand.m....@intel.com> Date: Wed, 3 Jul 2024 11:20:42 -0700 Subject: [PATCH 1/3] [clang] Diagnose use of deprecated template alias Issue a warning diagnostic when a template alias with a deprecated attribute is used. --- clang/lib/Sema/SemaAvailability.cpp | 6 ++ clang/lib/Sema/SemaTemplate.cpp | 4 ++ .../alias-template-deprecated.cpp | 58 +++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 clang/test/SemaTemplate/alias-template-deprecated.cpp diff --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp index df83bbfb7aac8..17566c226ec80 100644 --- a/clang/lib/Sema/SemaAvailability.cpp +++ b/clang/lib/Sema/SemaAvailability.cpp @@ -107,6 +107,12 @@ ShouldDiagnoseAvailabilityOfDecl(Sema &S, const NamedDecl *D, break; } + // For alias templates, get the underlying declaration. + if (const auto *ADecl = dyn_cast<TypeAliasTemplateDecl>(D)) { + D = ADecl->getTemplatedDecl(); + Result = D->getAvailability(Message); + } + // Forward class declarations get their attributes from their definition. if (const auto *IDecl = dyn_cast<ObjCInterfaceDecl>(D)) { if (IDecl->getDefinition()) { diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 6879a9a274b5c..0e7663b82f437 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -4539,6 +4539,10 @@ QualType Sema::CheckTemplateIdType(TemplateName Name, *this, /*PointOfInstantiation=*/TemplateLoc, /*Entity=*/AliasTemplate, /*TemplateArgs=*/TemplateArgLists.getInnermost()); + + // Diagnose uses of this alias. + (void)DiagnoseUseOfDecl(AliasTemplate, TemplateLoc); + if (Inst.isInvalid()) return QualType(); diff --git a/clang/test/SemaTemplate/alias-template-deprecated.cpp b/clang/test/SemaTemplate/alias-template-deprecated.cpp new file mode 100644 index 0000000000000..10242d7a810b0 --- /dev/null +++ b/clang/test/SemaTemplate/alias-template-deprecated.cpp @@ -0,0 +1,58 @@ +// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s +// +// This test checks that a deprecated attribute on an alias +// template triggers a warning diagnostic when it is used. + +template <typename T> +struct NoAttr { + void foo() {} +}; + +// expected-note@+2 5{{'UsingWithAttr' has been explicitly marked deprecated here}} +template <typename T> +using UsingWithAttr __attribute__((deprecated)) = NoAttr<T>; + +// expected-note@+1 {{'UsingInstWithAttr' has been explicitly marked deprecated here}} +using UsingInstWithAttr __attribute__((deprecated)) = NoAttr<int>; + +// expected-note@+1 {{'TDWithAttr' has been explicitly marked deprecated here}} +typedef NoAttr<int> TDWithAttr __attribute__((deprecated)); + +// expected-warning@+1 {{'UsingWithAttr' is deprecated}} +typedef UsingWithAttr<int> TDUsingWithAttr; + +typedef NoAttr<int> TDNoAttr; + +// expected-note@+1 {{'UsingTDWithAttr' has been explicitly marked deprecated here}} +using UsingTDWithAttr __attribute__((deprecated)) = TDNoAttr; + +struct S { + NoAttr<float> f1; + // expected-warning@+1 {{'UsingWithAttr' is deprecated}} + UsingWithAttr<float> f2; +}; + +// expected-warning@+1 {{'UsingWithAttr' is deprecated}} +void foo(NoAttr<short> s1, UsingWithAttr<short> s2) { +} + +void bar() { + NoAttr<int> obj; // Okay + + // expected-warning@+2 {{'UsingWithAttr' is deprecated}} + // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}} + UsingWithAttr<int> objUsingWA; + + // expected-warning@+2 {{'UsingWithAttr' is deprecated}} + // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}} + UsingWithAttr<int>().foo(); + + // expected-warning@+1 {{'UsingInstWithAttr' is deprecated}} + UsingInstWithAttr objUIWA; + + // expected-warning@+1 {{'TDWithAttr' is deprecated}} + TDWithAttr objTDWA; + + // expected-warning@+1 {{'UsingTDWithAttr' is deprecated}} + UsingTDWithAttr objUTDWA; +} >From edfde66fb644eceb4751e1cc55c95028cdb8c483 Mon Sep 17 00:00:00 2001 From: Premanand M Rao <premanand.m....@intel.com> Date: Tue, 16 Jul 2024 11:23:13 -0700 Subject: [PATCH 2/3] Address CR comments: add case with c++ attribute syntax --- .../SemaTemplate/alias-template-deprecated.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/clang/test/SemaTemplate/alias-template-deprecated.cpp b/clang/test/SemaTemplate/alias-template-deprecated.cpp index 10242d7a810b0..2273606d27143 100644 --- a/clang/test/SemaTemplate/alias-template-deprecated.cpp +++ b/clang/test/SemaTemplate/alias-template-deprecated.cpp @@ -36,6 +36,13 @@ struct S { void foo(NoAttr<short> s1, UsingWithAttr<short> s2) { } +// expected-note@+2 {{'UsingWithCPPAttr' has been explicitly marked deprecated here}} +template <typename T> +using UsingWithCPPAttr [[deprecated]] = NoAttr<T>; + +// expected-note@+1 {{'UsingInstWithCPPAttr' has been explicitly marked deprecated here}} +using UsingInstWithCPPAttr [[deprecated("Do not use this")]] = NoAttr<int>; + void bar() { NoAttr<int> obj; // Okay @@ -55,4 +62,11 @@ void bar() { // expected-warning@+1 {{'UsingTDWithAttr' is deprecated}} UsingTDWithAttr objUTDWA; + + // expected-warning@+2 {{'UsingWithCPPAttr' is deprecated}} + // expected-note@+1 {{in instantiation of template type alias 'UsingWithCPPAttr' requested here}} + UsingWithCPPAttr<int> objUsingWCPPA; + + // expected-warning@+1 {{'UsingInstWithCPPAttr' is deprecated: Do not use this}} + UsingInstWithCPPAttr objUICPPWA; } >From cefe33eb7ad4b787bfb9a4137b5d8734937cb008 Mon Sep 17 00:00:00 2001 From: Premanand M Rao <premanand.m....@intel.com> Date: Thu, 18 Jul 2024 11:42:53 -0700 Subject: [PATCH 3/3] Address more code-review comments about test coverage --- .../test/SemaTemplate/alias-template-deprecated.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/clang/test/SemaTemplate/alias-template-deprecated.cpp b/clang/test/SemaTemplate/alias-template-deprecated.cpp index 2273606d27143..7418e222bcfc5 100644 --- a/clang/test/SemaTemplate/alias-template-deprecated.cpp +++ b/clang/test/SemaTemplate/alias-template-deprecated.cpp @@ -8,7 +8,7 @@ struct NoAttr { void foo() {} }; -// expected-note@+2 5{{'UsingWithAttr' has been explicitly marked deprecated here}} +// expected-note@+2 7{{'UsingWithAttr' has been explicitly marked deprecated here}} template <typename T> using UsingWithAttr __attribute__((deprecated)) = NoAttr<T>; @@ -50,6 +50,17 @@ void bar() { // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}} UsingWithAttr<int> objUsingWA; + // expected-warning@+2 {{'UsingWithAttr' is deprecated}} + // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}} + NoAttr<UsingWithAttr<int>> s; + + // expected-note@+1 {{'DepInt' has been explicitly marked deprecated here}} + using DepInt [[deprecated]] = int; + // expected-warning@+3 {{'UsingWithAttr' is deprecated}} + // expected-warning@+2 {{'DepInt' is deprecated}} + // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}} + using X = UsingWithAttr<DepInt>; + // expected-warning@+2 {{'UsingWithAttr' is deprecated}} // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}} UsingWithAttr<int>().foo(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits