c++: Check uniqueness of concepts/variable templates [PR94553]
authorMarek Polacek <polacek@redhat.com>
Fri, 26 Jun 2020 16:40:59 +0000 (12:40 -0400)
committerMarek Polacek <polacek@redhat.com>
Mon, 29 Jun 2020 15:01:58 +0000 (11:01 -0400)
commit54980635c537f3130481da2d8b1109c775db8bb0
treefa66658f274fc2274a323c83c1fc709fc3232a62
parentb1005f553d3543bb56dc6b9b34ee35455d697ca4
c++: Check uniqueness of concepts/variable templates [PR94553]

This patch wraps up PR94553.  Variable template names have no C
compatibility implications so they should be unique in their
declarative region.  It occurred to me that this applies to concepts
as well.  This is not specified in [basic.scope.declarative]/4.2
but that seems like a bug in the standard.

I couldn't use variable_template_p because that uses PRIMARY_TEMPLATE_P
which uses DECL_PRIMARY_TEMPLATE and that might not have been set up yet
(push_template_decl hasn't yet been called).  PRIMARY_TEMPLATE_P is
important to distinguish between a variable template and a variable in a
function template.  But I think we don't have to worry about that in
duplicate_decls: a template declaration cannot appear at block scope,
and additional checks in duplicate_decls suggest that it won't ever
see a TEMPLATE_DECL for a variable in a function template.  So
checking that the DECL_TEMPLATE_RESULT is a VAR_DECL seems to be fine.
I could have added a default argument to variable_template_p too to
avoid checking PRIMARY_TEMPLATE_P but it didn't seem worth the effort.

gcc/cp/ChangeLog:

PR c++/94553
* decl.c (duplicate_decls): Make sure a concept or a variable
template is unique in its declarative region.

gcc/testsuite/ChangeLog:

PR c++/94553
* g++.dg/cpp1y/pr68578.C: Adjust dg-error.
* g++.dg/cpp1y/var-templ66.C: New test.
* g++.dg/cpp2a/concepts-redecl1.C: New test.
gcc/cp/decl.c
gcc/testsuite/g++.dg/cpp1y/pr68578.C
gcc/testsuite/g++.dg/cpp1y/var-templ66.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/concepts-redecl1.C [new file with mode: 0644]