Commit b02ef56d by Paolo Carlini Committed by Paolo Carlini

re PR c++/58878 (Template parameter name can be hidden in a template member…

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
parent 34759370
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
......
......@@ -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);
......
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.
......
// 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" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment