re PR c++/11697 (Failure to diagnose class template redeclaration via using declaration)

PR c++/11697
	* decl.c (decls_match): Don't ignore the types of template
	classes.

	PR c++/11744
	* pt.c (tsubst_copy_and_build): Refine Koenig lookup logic.

	PR c++/11697
	* g++.dg/template/using6.C: New test.

	PR c++/11744
	* g++.dg/template/koenig2.C: New test.

From-SVN: r70062
This commit is contained in:
Mark Mitchell 2003-08-01 18:48:50 +00:00 committed by Mark Mitchell
parent f91f41b294
commit ee935db4b6
7 changed files with 77 additions and 7 deletions

View File

@ -1,3 +1,12 @@
2003-08-01 Mark Mitchell <mark@codesourcery.com>
PR c++/11697
* decl.c (decls_match): Don't ignore the types of template
classes.
PR c++/11744
* pt.c (tsubst_copy_and_build): Refine Koenig lookup logic.
2003-08-01 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/8442, c++/8806

View File

@ -2758,16 +2758,17 @@ decls_match (tree newdecl, tree olddecl)
}
else if (TREE_CODE (newdecl) == TEMPLATE_DECL)
{
if (!comp_template_parms (DECL_TEMPLATE_PARMS (newdecl),
DECL_TEMPLATE_PARMS (olddecl)))
return 0;
if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl))
!= TREE_CODE (DECL_TEMPLATE_RESULT (olddecl)))
return 0;
if (!comp_template_parms (DECL_TEMPLATE_PARMS (newdecl),
DECL_TEMPLATE_PARMS (olddecl)))
return 0;
if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL)
types_match = 1;
types_match = same_type_p (TREE_TYPE (DECL_TEMPLATE_RESULT (olddecl)),
TREE_TYPE (DECL_TEMPLATE_RESULT (newdecl)));
else
types_match = decls_match (DECL_TEMPLATE_RESULT (olddecl),
DECL_TEMPLATE_RESULT (newdecl));

View File

@ -8116,8 +8116,21 @@ tsubst_copy_and_build (tree t,
tree function;
tree call_args;
bool qualified_p;
bool koenig_p;
function = TREE_OPERAND (t, 0);
/* To determine whether or not we should perform Koenig lookup
we must look at the form of the FUNCTION. */
koenig_p = !(/* Koenig lookup does not apply to qualified
names. */
TREE_CODE (function) == SCOPE_REF
/* Or to references to members of classes. */
|| TREE_CODE (function) == COMPONENT_REF
/* If it is a FUNCTION_DECL or a baselink, then
the name was already resolved when the
template was parsed. */
|| TREE_CODE (function) == FUNCTION_DECL
|| TREE_CODE (function) == BASELINK);
if (TREE_CODE (function) == SCOPE_REF)
{
qualified_p = true;
@ -8140,7 +8153,7 @@ tsubst_copy_and_build (tree t,
if (BASELINK_P (function))
qualified_p = 1;
if (!qualified_p
if (koenig_p
&& TREE_CODE (function) != TEMPLATE_ID_EXPR
&& (is_overloaded_fn (function)
|| DECL_P (function)

View File

@ -2354,7 +2354,7 @@ finish_id_expression (tree id_expression,
required. If the template-id was for a template-class, we
will sometimes have a TYPE_DECL at this point. */
else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
|| TREE_CODE (decl) == TYPE_DECL)
|| TREE_CODE (decl) == TYPE_DECL)
;
/* Look up the name. */
else

View File

@ -1,3 +1,11 @@
2003-08-01 Mark Mitchell <mark@codesourcery.com>
PR c++/11697
* g++.dg/template/using6.C: New test.
PR c++/11744
* g++.dg/template/koenig2.C: New test.
2003-08-01 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/7983

View File

@ -0,0 +1,25 @@
namespace nsp_foo {
struct A {};
struct foo {};
}
namespace nsp_bar {
void foo(nsp_foo::A) {}
template <class T>
void bar(T t)
{
nsp_bar::foo(t); // line 16
}
}
int main()
{
nsp_bar::bar(nsp_foo::A());
}

View File

@ -0,0 +1,14 @@
namespace foo {
template<typename T>
struct A {};
}
namespace bar {
template<typename T>
struct A {};
}
namespace foo {
using bar::A; // { dg-error "" }
}