diff options
author | Jason Merrill <jason@redhat.com> | 2024-02-12 21:00:53 -0500 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2024-02-13 11:15:36 -0500 |
commit | 19ac327de421fe05916e234e3450e6e1cc5c935c (patch) | |
tree | 53a6d971b7761e7fd606f45faff7dde9d752547c | |
parent | 7eac19be5f7dd92fcbcfe13f6edbb4f9bd45c15c (diff) | |
download | gcc-19ac327de421fe05916e234e3450e6e1cc5c935c.zip gcc-19ac327de421fe05916e234e3450e6e1cc5c935c.tar.gz gcc-19ac327de421fe05916e234e3450e6e1cc5c935c.tar.bz2 |
c++: variable partial spec redeclaration [PR113612]
If register_specialization finds a previous declaration and throws the new
one away, we shouldn't still add the new one to
DECL_TEMPLATE_SPECIALIZATIONS.
PR c++/113612
gcc/cp/ChangeLog:
* pt.cc (process_partial_specialization): Return early
on redeclaration.
gcc/testsuite/ChangeLog:
* g++.dg/cpp1y/var-templ85.C: New test.
-rw-r--r-- | gcc/cp/pt.cc | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ85.C | 6 |
2 files changed, 14 insertions, 3 deletions
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 475f218..2803824 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -5417,9 +5417,14 @@ process_partial_specialization (tree decl) } if (VAR_P (decl)) - /* We didn't register this in check_explicit_specialization so we could - wait until the constraints were set. */ - decl = register_specialization (decl, maintmpl, specargs, false, 0); + { + /* We didn't register this in check_explicit_specialization so we could + wait until the constraints were set. */ + tree reg = register_specialization (decl, maintmpl, specargs, false, 0); + if (reg != decl) + /* Redeclaration. */ + return reg; + } else associate_classtype_constraints (type); diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ85.C b/gcc/testsuite/g++.dg/cpp1y/var-templ85.C new file mode 100644 index 0000000..33c24e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/var-templ85.C @@ -0,0 +1,6 @@ +// PR c++/113612 +// { dg-do compile { target c++14 } } + +template <typename T> T t; +template <typename T> extern T *t<T *>; +template <typename T> T *t<T *> = t<int>; |