Commit ee935db4 by Mark Mitchell Committed by Mark Mitchell

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
parent f91f41b2
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> 2003-08-01 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/8442, c++/8806 PR c++/8442, c++/8806
......
...@@ -2758,16 +2758,17 @@ decls_match (tree newdecl, tree olddecl) ...@@ -2758,16 +2758,17 @@ decls_match (tree newdecl, tree olddecl)
} }
else if (TREE_CODE (newdecl) == TEMPLATE_DECL) 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)) if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl))
!= TREE_CODE (DECL_TEMPLATE_RESULT (olddecl))) != TREE_CODE (DECL_TEMPLATE_RESULT (olddecl)))
return 0; 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) 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 else
types_match = decls_match (DECL_TEMPLATE_RESULT (olddecl), types_match = decls_match (DECL_TEMPLATE_RESULT (olddecl),
DECL_TEMPLATE_RESULT (newdecl)); DECL_TEMPLATE_RESULT (newdecl));
......
...@@ -8116,8 +8116,21 @@ tsubst_copy_and_build (tree t, ...@@ -8116,8 +8116,21 @@ tsubst_copy_and_build (tree t,
tree function; tree function;
tree call_args; tree call_args;
bool qualified_p; bool qualified_p;
bool koenig_p;
function = TREE_OPERAND (t, 0); 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) if (TREE_CODE (function) == SCOPE_REF)
{ {
qualified_p = true; qualified_p = true;
...@@ -8140,7 +8153,7 @@ tsubst_copy_and_build (tree t, ...@@ -8140,7 +8153,7 @@ tsubst_copy_and_build (tree t,
if (BASELINK_P (function)) if (BASELINK_P (function))
qualified_p = 1; qualified_p = 1;
if (!qualified_p if (koenig_p
&& TREE_CODE (function) != TEMPLATE_ID_EXPR && TREE_CODE (function) != TEMPLATE_ID_EXPR
&& (is_overloaded_fn (function) && (is_overloaded_fn (function)
|| DECL_P (function) || DECL_P (function)
......
...@@ -2354,7 +2354,7 @@ finish_id_expression (tree id_expression, ...@@ -2354,7 +2354,7 @@ finish_id_expression (tree id_expression,
required. If the template-id was for a template-class, we required. If the template-id was for a template-class, we
will sometimes have a TYPE_DECL at this point. */ will sometimes have a TYPE_DECL at this point. */
else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
|| TREE_CODE (decl) == TYPE_DECL) || TREE_CODE (decl) == TYPE_DECL)
; ;
/* Look up the name. */ /* Look up the name. */
else else
......
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> 2003-08-01 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/7983 PR c++/7983
......
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());
}
namespace foo {
template<typename T>
struct A {};
}
namespace bar {
template<typename T>
struct A {};
}
namespace foo {
using bar::A; // { dg-error "" }
}
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