Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Clang][Sema] Convert warning for extraneous template parameter lists to an extension warning #82277

Merged
merged 1 commit into from
Feb 20, 2024

Conversation

sdkrystian
Copy link
Member

@sdkrystian sdkrystian commented Feb 19, 2024

We currently accept the following explicit specialization with a warning for the extraneous template parameter list:

template<typename T>
void f();

template<>
template<>
void f<int>(); // warning: extraneous template parameter list in template specialization

This should really be an extension warning so we reject with -pedantic-errors. This patch converts the warning to an extension warning.

(Note: This still needs a release note & a few new tests... I'll be taking care of that tomorrow)

@llvmbot llvmbot added clang Clang issues not falling into any other category clang:frontend Language frontend issues, e.g. anything involving "Sema" labels Feb 19, 2024
@llvmbot
Copy link
Collaborator

llvmbot commented Feb 19, 2024

@llvm/pr-subscribers-clang

Author: Krystian Stasiowski (sdkrystian)

Changes

We currently accept the following explicit specialization with a warning for the extraneous template parameter list:

template&lt;typename T&gt;
void f();

template&lt;&gt;
template&lt;&gt;
void f&lt;int&gt;(); // warning: extraneous template parameter list in template specialization

This should really be an extension warning so we reject with -pedantic-errors. This patch converts the warning to an extension warning.


Full diff: https://github.com/llvm/llvm-project/pull/82277.diff

5 Files Affected:

  • (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (+1-1)
  • (modified) clang/lib/Sema/SemaTemplate.cpp (+1-1)
  • (modified) clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p23.cpp (+2-4)
  • (modified) clang/test/CXX/drs/dr5xx.cpp (+4-6)
  • (modified) clang/test/Misc/warning-flags.c (+1-1)
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index b4dc4feee8e63a..1a7b91bb4b45b6 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -5323,7 +5323,7 @@ def err_alias_template_extra_headers : Error<
 def err_template_spec_extra_headers : Error<
   "extraneous template parameter list in template specialization or "
   "out-of-line template definition">;
-def warn_template_spec_extra_headers : Warning<
+def ext_template_spec_extra_headers : ExtWarn<
   "extraneous template parameter list in template specialization">;
 def note_explicit_template_spec_does_not_need_header : Note<
   "'template<>' header not required for explicitly-specialized class %0 "
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index cf781e0e1bf3f4..73c0167ab75778 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -3667,7 +3667,7 @@ TemplateParameterList *Sema::MatchTemplateParametersToScopeSpecifier(
 
     if (!SuppressDiagnostic)
       Diag(ParamLists[ParamIdx]->getTemplateLoc(),
-           AllExplicitSpecHeaders ? diag::warn_template_spec_extra_headers
+           AllExplicitSpecHeaders ? diag::ext_template_spec_extra_headers
                                   : diag::err_template_spec_extra_headers)
           << SourceRange(ParamLists[ParamIdx]->getTemplateLoc(),
                          ParamLists[ParamLists.size() - 2]->getRAngleLoc());
diff --git a/clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p23.cpp b/clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p23.cpp
index 469c4e091953c3..683392c5891538 100644
--- a/clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p23.cpp
+++ b/clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p23.cpp
@@ -1,7 +1,6 @@
 // RUN: %clang_cc1 -std=c++20 -pedantic-errors -verify %s
 
-// FIXME: This should be an error with -pedantic-errors.
-template<> // expected-warning {{extraneous template parameter list in template specialization}}
+template<> // expected-error {{extraneous template parameter list in template specialization}}
 void f(auto);
 
 template<typename>
@@ -18,7 +17,6 @@ void A<T>::g(auto) { }
 template<>
 void A<int>::g(auto) { }
 
-// FIXME: This should be an error with -pedantic-errors.
 template<>
-template<> // expected-warning {{extraneous template parameter list in template specialization}}
+template<> // expected-error {{extraneous template parameter list in template specialization}}
 void A<long>::g(auto) { }
diff --git a/clang/test/CXX/drs/dr5xx.cpp b/clang/test/CXX/drs/dr5xx.cpp
index 21a6646d4abcf1..0e1de342f6706f 100644
--- a/clang/test/CXX/drs/dr5xx.cpp
+++ b/clang/test/CXX/drs/dr5xx.cpp
@@ -354,17 +354,15 @@ namespace dr531 { // dr531: partial
 
     template<> void A<char>::f(char) {}
     // expected-error@-1 {{no function template matches function template specialization 'f'}}
-    // FIXME: This is ill-formed; -pedantic-errors should reject.
     template<> template<typename U> void A<char>::g(char, U) {}
-    // expected-warning@-1 {{extraneous template parameter list in template specialization}}
+    // expected-error@-1 {{extraneous template parameter list in template specialization}}
     //   expected-note@#dr531-A-char {{'template<>' header not required for explicitly-specialized class 'dr531::bad::A<char>' declared here}}
     template<> struct A<char>::B {};
     // expected-error@-1 {{extraneous 'template<>' in declaration of struct 'B'}}
     // expected-error@-2 {{specialization of member 'dr531::bad::A<char>::B' does not specialize an instantiated member}}
     //  expected-note@#dr531-B {{attempt to specialize declaration here}}
-    // FIXME: This is ill-formed; -pedantic-errors should reject.
     template<> template<typename U> struct A<char>::C {};
-    // expected-warning@-1 {{extraneous template parameter list in template specialization}}
+    // expected-error@-1 {{extraneous template parameter list in template specialization}}
     //   expected-note@#dr531-A-char {{'template<>' header not required for explicitly-specialized class 'dr531::bad::A<char>' declared here}}
     template<> char A<char>::n = 0;
     // expected-error@-1 {{extraneous 'template<>' in declaration of variable 'n'}}
@@ -808,7 +806,7 @@ namespace dr571 { // dr571 unknown
   int n;
   // FIXME: Test if this has internal linkage.
   const ir r = n;
-  // expected-warning@-1 {{'const' qualifier on reference type 'ir' (aka 'int &') has no effect}} 
+  // expected-warning@-1 {{'const' qualifier on reference type 'ir' (aka 'int &') has no effect}}
 }
 
 namespace dr572 { // dr572: yes
@@ -990,7 +988,7 @@ namespace dr580 { // dr580: partial
       // FIXME: We incorrectly accept this
       // because we think C2::Y::A<...> might
       // instantiate to C2::X::A
-      template<X::I> struct A {}; 
+      template<X::I> struct A {};
     };
   };
 
diff --git a/clang/test/Misc/warning-flags.c b/clang/test/Misc/warning-flags.c
index 07a75046d4e01b..9d4cac9e39b420 100644
--- a/clang/test/Misc/warning-flags.c
+++ b/clang/test/Misc/warning-flags.c
@@ -26,6 +26,7 @@ CHECK-NEXT:   ext_missing_whitespace_after_macro_name
 CHECK-NEXT:   ext_new_paren_array_nonconst
 CHECK-NEXT:   ext_plain_complex
 CHECK-NEXT:   ext_template_arg_extra_parens
+CHECK-NEXT:   ext_template_spec_extra_headers
 CHECK-NEXT:   ext_typecheck_cond_incompatible_operands
 CHECK-NEXT:   ext_typecheck_ordered_comparison_of_pointer_integer
 CHECK-NEXT:   ext_using_undefined_std
@@ -78,7 +79,6 @@ CHECK-NEXT:   warn_register_objc_catch_parm
 CHECK-NEXT:   warn_related_result_type_compatibility_class
 CHECK-NEXT:   warn_related_result_type_compatibility_protocol
 CHECK-NEXT:   warn_template_export_unsupported
-CHECK-NEXT:   warn_template_spec_extra_headers
 CHECK-NEXT:   warn_tentative_incomplete_array
 CHECK-NEXT:   warn_typecheck_function_qualifiers
 CHECK-NEXT:   warn_undef_interface

@sdkrystian sdkrystian merged commit 8302cef into llvm:main Feb 20, 2024
4 of 5 checks passed
@sdkrystian sdkrystian deleted the extra-tpl branch February 26, 2024 15:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
clang:frontend Language frontend issues, e.g. anything involving "Sema" clang Clang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants