On Tue, 17 Dec 2019 at 22:46, Jason Merrill <[email protected]> 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
>