The variable templates patch way back when forgot to add handling here. The simplest answer seems to be recursing to the underlying declaration.
Tested x86_64-pc-linux-gnu, applying to trunk. * decl.c (redeclaration_error_message): Recurse for variable templates. --- gcc/cp/decl.c | 16 +++++----------- gcc/testsuite/g++.dg/cpp1y/var-templ32.C | 2 +- gcc/testsuite/g++.dg/cpp1y/var-templ65.C | 5 +++++ 3 files changed, 11 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/var-templ65.C diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 6dec5838303..86717dc8fed 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -2977,20 +2977,14 @@ redeclaration_error_message (tree newdecl, tree olddecl) { tree nt, ot; - if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL) - { - if (COMPLETE_TYPE_P (TREE_TYPE (newdecl)) - && COMPLETE_TYPE_P (TREE_TYPE (olddecl))) - return G_("redefinition of %q#D"); - return NULL; - } - if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == CONCEPT_DECL) return G_("redefinition of %q#D"); - if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) != FUNCTION_DECL - || (DECL_TEMPLATE_RESULT (newdecl) - == DECL_TEMPLATE_RESULT (olddecl))) + if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) != FUNCTION_DECL) + return redeclaration_error_message (DECL_TEMPLATE_RESULT (newdecl), + DECL_TEMPLATE_RESULT (olddecl)); + + if (DECL_TEMPLATE_RESULT (newdecl) == DECL_TEMPLATE_RESULT (olddecl)) return NULL; nt = DECL_TEMPLATE_RESULT (newdecl); diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ32.C b/gcc/testsuite/g++.dg/cpp1y/var-templ32.C index 80077a16b56..6767ff1d9c6 100644 --- a/gcc/testsuite/g++.dg/cpp1y/var-templ32.C +++ b/gcc/testsuite/g++.dg/cpp1y/var-templ32.C @@ -4,4 +4,4 @@ template<typename T> bool V1 = true; template<typename T> -bool V1<int> = false; // { dg-error "primary template|not deducible" } +bool V1<int> = false; // { dg-error "primary template|redefinition|not deducible" } diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ65.C b/gcc/testsuite/g++.dg/cpp1y/var-templ65.C new file mode 100644 index 00000000000..10398bb793f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/var-templ65.C @@ -0,0 +1,5 @@ +// PR c++/84255 +// { dg-do compile { target c++14 } } + +template<typename T> constexpr int var; +template<typename T> constexpr int var = 1; // { dg-error "redefinition" } base-commit: adbad0a15e032b7be2d89f7bff0590714fe05476 -- 2.18.1