https://github.com/dwblaikie updated 
https://github.com/llvm/llvm-project/pull/96699

>From a539afc7b81502ffcab7028bfe8266b8e32951d9 Mon Sep 17 00:00:00 2001
From: David Blaikie <dblai...@gmail.com>
Date: Tue, 25 Jun 2024 21:02:50 +0000
Subject: [PATCH 1/2] Clang: Add warning flag for storage class specifiers on
 explicit specializations

With the recent fix for this situation in class members (#93873) (for
which the fixed code is invalid prior to this patch - making migrating
code difficult as it must be in lock-step with the compiler migration,
if building with -Werror) it'd be really useful to be able to disable
this warning during the compiler migration/decouple the compiler
migration from the source fixes.

In theory this approach will regress the codebase to the previous
non-member cases of this issue that were already being held back by the
warning (as opposed to if we carved out the new cases into a separate
warning from the existing cases) but I think this'll be so rare and the
cleanup so simple, that the extra regressions of disabling the warning
broadly won't be too much of a problem. (but if folks disagree, I'm open
to making the warning more fine-grained)
---
 clang/include/clang/Basic/DiagnosticGroups.td    | 4 ++++
 clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 +-
 clang/test/Misc/warning-flags.c                  | 3 +--
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/clang/include/clang/Basic/DiagnosticGroups.td 
b/clang/include/clang/Basic/DiagnosticGroups.td
index 9b37d4bd3205b..8c5cbbc160ba1 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -1535,3 +1535,7 @@ def BitIntExtension : DiagGroup<"bit-int-extension">;
 
 // Warnings about misuse of ExtractAPI options.
 def ExtractAPIMisuse : DiagGroup<"extractapi-misuse">;
+
+// Warnings about using the non-standard extension having an explicit 
specialization
+// with a storage class specifier.
+def ExplicitSpecializationStorageClass : 
DiagGroup<"explicit-specialization-storage-class">;
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 25a87078a5709..f12121f065783 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -5366,7 +5366,7 @@ def err_not_class_template_specialization : Error<
   "cannot specialize a %select{dependent template|template template "
   "parameter}0">;
 def ext_explicit_specialization_storage_class : ExtWarn<
-  "explicit specialization cannot have a storage class">;
+  "explicit specialization cannot have a storage class">, 
InGroup<ExplicitSpecializationStorageClass>;
 def err_dependent_function_template_spec_no_match : Error<
   "no candidate function template was found for dependent"
   " %select{member|friend}0 function template specialization">;
diff --git a/clang/test/Misc/warning-flags.c b/clang/test/Misc/warning-flags.c
index dd73331913c6f..ae14720959a0e 100644
--- a/clang/test/Misc/warning-flags.c
+++ b/clang/test/Misc/warning-flags.c
@@ -18,10 +18,9 @@ This test serves two purposes:
 
 The list of warnings below should NEVER grow.  It should gradually shrink to 0.
 
-CHECK: Warnings without flags (66):
+CHECK: Warnings without flags (65):
 
 CHECK-NEXT:   ext_expected_semi_decl_list
-CHECK-NEXT:   ext_explicit_specialization_storage_class
 CHECK-NEXT:   ext_missing_whitespace_after_macro_name
 CHECK-NEXT:   ext_new_paren_array_nonconst
 CHECK-NEXT:   ext_plain_complex

>From b3facc9dffc762e3cef93886df23026d502afcae Mon Sep 17 00:00:00 2001
From: David Blaikie <dblai...@gmail.com>
Date: Wed, 26 Jun 2024 00:01:46 +0000
Subject: [PATCH 2/2] Add test

---
 clang/test/CXX/dcl.dcl/dcl.spec/dcl.stc/p1.cpp | 16 ++++++++++++----
 ...n-explicit-specialization-storage-class.cpp | 18 ++++++++++++++++++
 2 files changed, 30 insertions(+), 4 deletions(-)
 create mode 100644 
clang/test/SemaCXX/warn-explicit-specialization-storage-class.cpp

diff --git a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.stc/p1.cpp 
b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.stc/p1.cpp
index f6b5d2487e73d..9efa7b67f5bdb 100644
--- a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.stc/p1.cpp
+++ b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.stc/p1.cpp
@@ -1,4 +1,5 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify=expected,spec %s
+// RUN: %clang_cc1 -fsyntax-only -verify 
-Wno-explicit-specialization-storage-class %s
 
 // A storage-class-specifier shall not be specified in an explicit
 // specialization (14.7.3) or an explicit instantiation (14.7.2)
@@ -7,13 +8,13 @@ template<typename T> void f(T) {}
 template<typename T> static void g(T) {}
 
 
-template<> static void f<int>(int); // expected-warning{{explicit 
specialization cannot have a storage class}}
+template<> static void f<int>(int); // spec-warning{{explicit specialization 
cannot have a storage class}}
 template static void f<float>(float); // expected-error{{explicit 
instantiation cannot have a storage class}}
 
 template<> void f<double>(double);
 template void f<long>(long);
 
-template<> static void g<int>(int); // expected-warning{{explicit 
specialization cannot have a storage class}}
+template<> static void g<int>(int); // spec-warning{{explicit specialization 
cannot have a storage class}}
 template static void g<float>(float); // expected-error{{explicit 
instantiation cannot have a storage class}}
 
 template<> void g<double>(double);
@@ -29,5 +30,12 @@ int X<T>::value = 17;
 
 template static int X<int>::value; // expected-error{{explicit instantiation 
cannot have a storage class}}
 
-template<> static int X<float>::value; // expected-warning{{explicit 
specialization cannot have a storage class}}
+template<> static int X<float>::value; // spec-warning{{explicit 
specialization cannot have a storage class}}
                                        // expected-error@-1{{'static' can only 
be specified inside the class definition}}
+
+struct t1 {
+  template<typename>
+  static void f1();
+  template<>
+  static void f1<int>(); // spec-warning{{explicit specialization cannot have 
a storage class}}
+};
diff --git a/clang/test/SemaCXX/warn-explicit-specialization-storage-class.cpp 
b/clang/test/SemaCXX/warn-explicit-specialization-storage-class.cpp
new file mode 100644
index 0000000000000..5d9ace292dc06
--- /dev/null
+++ b/clang/test/SemaCXX/warn-explicit-specialization-storage-class.cpp
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only -verify %s
+// RUN: %clang_cc1 -triple i686-pc-linux-gnu -fsyntax-only 
-Wno-explicit-specialization-storage-class -verify=expnone %s
+
+// expnone-no-diagnostics
+
+struct A {
+    template<typename T>
+    static constexpr int x = 0;
+
+    template<>
+    static constexpr int x<void> = 1; // expected-warning{{explicit 
specialization cannot have a storage class}}
+};
+
+template<typename T>
+static constexpr int x = 0;
+
+template<>
+static constexpr int x<void> = 1; // expected-warning{{explicit specialization 
cannot have a storage class}}

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to