[clang] d8e0b0d - [clang] Diagnose use of deprecated template alias (#97619)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 22 07:57:32 PDT 2024
Author: premanandrao
Date: 2024-07-22T10:57:28-04:00
New Revision: d8e0b0d6854757c4fc0c120995cf76457c347a1e
URL: https://github.com/llvm/llvm-project/commit/d8e0b0d6854757c4fc0c120995cf76457c347a1e
DIFF: https://github.com/llvm/llvm-project/commit/d8e0b0d6854757c4fc0c120995cf76457c347a1e.diff
LOG: [clang] Diagnose use of deprecated template alias (#97619)
Issue a warning diagnostic when a template alias with a deprecated
attribute is used.
Added:
clang/test/SemaTemplate/alias-template-deprecated.cpp
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaAvailability.cpp
clang/lib/Sema/SemaTemplate.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 61629ff30aeeb..8e24087b3dcdb 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -744,6 +744,19 @@ Improvements to Clang's diagnostics
- Clang now diagnoses dangling assignments for pointer-like objects (annotated with `[[gsl::Pointer]]`) under `-Wdangling-assignment-gsl` (off by default)
Fixes #GH63310.
+
+- Clang now diagnoses uses of alias templates with a deprecated attribute. (Fixes #GH18236).
+
+ .. code-block:: c++
+
+ template <typename T>
+ struct NoAttr {
+ };
+
+ template <typename T>
+ using UsingWithAttr __attribute__((deprecated)) = NoAttr<T>;
+
+ UsingWithAttr<int> objUsingWA; // warning: 'UsingWithAttr' is deprecated
Improvements to Clang's time-trace
----------------------------------
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 9d96201625389..87b1f98bbe5ac 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -3344,6 +3344,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..7418e222bcfc5
--- /dev/null
+++ b/clang/test/SemaTemplate/alias-template-deprecated.cpp
@@ -0,0 +1,83 @@
+// 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 at +2 7{{'UsingWithAttr' has been explicitly marked deprecated here}}
+template <typename T>
+using UsingWithAttr __attribute__((deprecated)) = NoAttr<T>;
+
+// expected-note at +1 {{'UsingInstWithAttr' has been explicitly marked deprecated here}}
+using UsingInstWithAttr __attribute__((deprecated)) = NoAttr<int>;
+
+// expected-note at +1 {{'TDWithAttr' has been explicitly marked deprecated here}}
+typedef NoAttr<int> TDWithAttr __attribute__((deprecated));
+
+// expected-warning at +1 {{'UsingWithAttr' is deprecated}}
+typedef UsingWithAttr<int> TDUsingWithAttr;
+
+typedef NoAttr<int> TDNoAttr;
+
+// expected-note at +1 {{'UsingTDWithAttr' has been explicitly marked deprecated here}}
+using UsingTDWithAttr __attribute__((deprecated)) = TDNoAttr;
+
+struct S {
+ NoAttr<float> f1;
+ // expected-warning at +1 {{'UsingWithAttr' is deprecated}}
+ UsingWithAttr<float> f2;
+};
+
+// expected-warning at +1 {{'UsingWithAttr' is deprecated}}
+void foo(NoAttr<short> s1, UsingWithAttr<short> s2) {
+}
+
+// expected-note at +2 {{'UsingWithCPPAttr' has been explicitly marked deprecated here}}
+template <typename T>
+using UsingWithCPPAttr [[deprecated]] = NoAttr<T>;
+
+// expected-note at +1 {{'UsingInstWithCPPAttr' has been explicitly marked deprecated here}}
+using UsingInstWithCPPAttr [[deprecated("Do not use this")]] = NoAttr<int>;
+
+void bar() {
+ NoAttr<int> obj; // Okay
+
+ // expected-warning at +2 {{'UsingWithAttr' is deprecated}}
+ // expected-note at +1 {{in instantiation of template type alias 'UsingWithAttr' requested here}}
+ UsingWithAttr<int> objUsingWA;
+
+ // expected-warning at +2 {{'UsingWithAttr' is deprecated}}
+ // expected-note at +1 {{in instantiation of template type alias 'UsingWithAttr' requested here}}
+ NoAttr<UsingWithAttr<int>> s;
+
+ // expected-note at +1 {{'DepInt' has been explicitly marked deprecated here}}
+ using DepInt [[deprecated]] = int;
+ // expected-warning at +3 {{'UsingWithAttr' is deprecated}}
+ // expected-warning at +2 {{'DepInt' is deprecated}}
+ // expected-note at +1 {{in instantiation of template type alias 'UsingWithAttr' requested here}}
+ using X = UsingWithAttr<DepInt>;
+
+ // expected-warning at +2 {{'UsingWithAttr' is deprecated}}
+ // expected-note at +1 {{in instantiation of template type alias 'UsingWithAttr' requested here}}
+ UsingWithAttr<int>().foo();
+
+ // expected-warning at +1 {{'UsingInstWithAttr' is deprecated}}
+ UsingInstWithAttr objUIWA;
+
+ // expected-warning at +1 {{'TDWithAttr' is deprecated}}
+ TDWithAttr objTDWA;
+
+ // expected-warning at +1 {{'UsingTDWithAttr' is deprecated}}
+ UsingTDWithAttr objUTDWA;
+
+ // expected-warning at +2 {{'UsingWithCPPAttr' is deprecated}}
+ // expected-note at +1 {{in instantiation of template type alias 'UsingWithCPPAttr' requested here}}
+ UsingWithCPPAttr<int> objUsingWCPPA;
+
+ // expected-warning at +1 {{'UsingInstWithCPPAttr' is deprecated: Do not use this}}
+ UsingInstWithCPPAttr objUICPPWA;
+}
More information about the cfe-commits
mailing list