On Tue, 17 Dec 2019 at 22:46, Jason Merrill <ja...@redhat.com> wrote: > > 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.
Hi, This patch introduced regressions on aarch64: g++.dg/ext/sve-sizeless-1.C -std=gnu++14 (test for errors, line 77) g++.dg/ext/sve-sizeless-1.C -std=gnu++17 (test for errors, line 77) g++.dg/ext/sve-sizeless-1.C -std=gnu++2a (test for errors, line 77) g++.dg/ext/sve-sizeless-2.C -std=gnu++14 (test for errors, line 77) g++.dg/ext/sve-sizeless-2.C -std=gnu++17 (test for errors, line 77) g++.dg/ext/sve-sizeless-2.C -std=gnu++2a (test for errors, line 77) Christophe > --- > 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 >