aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2019-12-17 16:46:11 -0500
committerJason Merrill <jason@gcc.gnu.org>2019-12-17 16:46:11 -0500
commit9c7b2b0ba8687f92f7beab2e3615a1107c7063db (patch)
treeca9bda481734a541628ddfb427d57217045f8c22
parent490a091fa7397e34b04e72634c3d37d8a4e223a4 (diff)
downloadgcc-9c7b2b0ba8687f92f7beab2e3615a1107c7063db.zip
gcc-9c7b2b0ba8687f92f7beab2e3615a1107c7063db.tar.gz
gcc-9c7b2b0ba8687f92f7beab2e3615a1107c7063db.tar.bz2
PR c++/92576 - redeclaration of variable template.
The variable templates patch way back when forgot to add handling here. The simplest answer seems to be recursing to the underlying declaration. * decl.c (redeclaration_error_message): Recurse for variable templates. From-SVN: r279472
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c16
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ32.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ65.C5
4 files changed, 17 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e8a94f4..e5824d5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,11 @@
2019-12-17 Jason Merrill <jason@redhat.com>
+ PR c++/92576 - redeclaration of variable template.
+ * decl.c (redeclaration_error_message): Recurse for variable
+ templates.
+
+2019-12-17 Jason Merrill <jason@redhat.com>
+
* name-lookup.c (get_std_name_hint): Add std::byte.
2019-12-17 Jakub Jelinek <jakub@redhat.com>
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 6dec583..86717dc 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 80077a1..6767ff1 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 0000000..10398bb
--- /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" }