Skip to content

Commit

Permalink
[Clang] Error on extraneous template headers by default. (llvm#104046)
Browse files Browse the repository at this point in the history
As discussed here

llvm#99296 (comment)

Fixes llvm#99296
Fixes llvm#50294
  • Loading branch information
cor3ntin authored Aug 14, 2024
1 parent 539bf49 commit 2b959bd
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 4 deletions.
9 changes: 9 additions & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,15 @@ C++ Specific Potentially Breaking Changes
`-Wno-enum-constexpr-conversion`, to allow for a transition period for users.
Now, in Clang 20, **it is no longer possible to suppress the diagnostic**.

- Extraneous template headers are now ill-formed by default.
This error can be disable with ``-Wno-error=extraneous-template-head``.

.. code-block:: c++

template <> // error: extraneous template head
template <typename T>
void f();

ABI Changes in This Version
---------------------------

Expand Down
3 changes: 2 additions & 1 deletion clang/include/clang/Basic/DiagnosticSemaKinds.td
Original file line number Diff line number Diff line change
Expand Up @@ -5428,7 +5428,8 @@ def err_template_spec_extra_headers : Error<
"extraneous template parameter list in template specialization or "
"out-of-line template definition">;
def ext_template_spec_extra_headers : ExtWarn<
"extraneous template parameter list in template specialization">;
"extraneous template parameter list in template specialization">,
InGroup<DiagGroup<"extraneous-template-head">>, DefaultError;
def note_explicit_template_spec_does_not_need_header : Note<
"'template<>' header not required for explicitly-specialized class %0 "
"declared here">;
Expand Down
3 changes: 1 addition & 2 deletions clang/test/Misc/warning-flags.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,13 @@ This test serves two purposes:

The list of warnings below should NEVER grow. It should gradually shrink to 0.

CHECK: Warnings without flags (65):
CHECK: Warnings without flags (64):

CHECK-NEXT: ext_expected_semi_decl_list
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
Expand Down
7 changes: 6 additions & 1 deletion clang/test/SemaTemplate/temp_explicit.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// RUN: %clang_cc1 -fsyntax-only -verify -pedantic -Wc++11-compat %s
// RUN: %clang_cc1 -fsyntax-only -verify -pedantic -Wc++11-compat -std=c++98 %s
// RUN: %clang_cc1 -fsyntax-only -verify -pedantic -std=c++11 %s
// RUN: %clang_cc1 -fsyntax-only -verify -pedantic -std=c++20 %s
//
// Tests explicit instantiation of templates.
template<typename T, typename U = T> class X0 { };
Expand Down Expand Up @@ -128,11 +129,15 @@ struct Foo<int> // expected-note{{header not required for explicitly-specialized
{};
};

template <> // expected-warning{{extraneous template parameter list}}
template <> // expected-error{{extraneous template parameter list}}
template <>
struct Foo<int>::Bar<void>
{};

#if __cplusplus >= 202002L
template<> void f(auto); // expected-error{{extraneous template parameter list}}
#endif

namespace N1 {

template<typename T> struct X7 { }; // expected-note{{here}}
Expand Down

0 comments on commit 2b959bd

Please sign in to comment.