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
>

Reply via email to