re PR c++/58878 (Template parameter name can be hidden in a template member function defined inside the class specifier)

/cp
2013-10-25  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/58878
	* pt.c (check_template_shadow): Don't skip declarations in inline
	member templates.

/testsuite
2013-10-25  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/58878
	* g++.dg/template/pr58878.C: New.

From-SVN: r204071
This commit is contained in:
Paolo Carlini 2013-10-25 16:26:10 +00:00 committed by Paolo Carlini
parent 3475937054
commit b02ef56d8d
4 changed files with 74 additions and 1 deletions

View file

@ -1,3 +1,9 @@
2013-10-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/58878
* pt.c (check_template_shadow): Don't skip declarations in inline
member templates.
2013-10-25 Tobias Burnus <burnus@net-b.de>
PR other/33426

View file

@ -3511,7 +3511,8 @@ check_template_shadow (tree decl)
name inside a class. We check TPFI to avoid duplicate errors for
inline member templates. */
if (decl == olddecl
|| TEMPLATE_PARMS_FOR_INLINE (current_template_parms))
|| (DECL_TEMPLATE_PARM_P (decl)
&& TEMPLATE_PARMS_FOR_INLINE (current_template_parms)))
return true;
error ("declaration of %q+#D", decl);

View file

@ -1,3 +1,8 @@
2013-10-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/58878
* g++.dg/template/pr58878.C: New.
2013-10-25 Marc Glisse <marc.glisse@inria.fr>
* gcc.dg/tree-ssa/alias-23.c: New file.

View file

@ -0,0 +1,61 @@
// PR c++/58878
// Template-members of non-template class
struct A
{
template <typename t> // { dg-error "shadows" }
void f()
{
int t = 1; // { dg-error "declaration" }
}
template <typename t>
void g();
};
template <typename t> // { dg-error "shadows" }
void A::g()
{
int t = 2; // { dg-error "declaration" }
}
// (Non-template) Members of template class
template <typename t> // { dg-error "shadows" }
struct B
{
void f()
{
int t = 3; // { dg-error "declaration" }
}
void g();
};
template <typename t> // { dg-error "shadows" }
void B<t>::g()
{
int t = 4; // { dg-error "declaration" }
}
// Template members of template class
template <typename t> // { dg-error "shadows" }
struct C
{
template <typename s> // { dg-error "shadows" }
void f()
{
int t = 5; // { dg-error "declaration" }
int s = 6; // { dg-error "declaration" }
}
template <typename s>
void g();
};
template <typename t> // { dg-error "shadows" }
template <typename s> // { dg-error "shadows" }
void C<t>::g()
{
int t = 7; // { dg-error "declaration" }
int s = 8; // { dg-error "declaration" }
}