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:
parent
f91f41b294
commit
ee935db4b6
|
@ -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
|
||||
|
|
|
@ -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));
|
||||
|
|
15
gcc/cp/pt.c
15
gcc/cp/pt.c
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
@ -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 "" }
|
||||
}
|
||||
|
Loading…
Reference in New Issue