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