diff options
author | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-08-01 18:48:50 +0000 |
---|---|---|
committer | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-08-01 18:48:50 +0000 |
commit | c0b419db62bcd4ea0dfc10086ac18848e99b9bd3 (patch) | |
tree | 11282088f2347ed5579eceafb21ff924a97c8da1 | |
parent | 3bdb6310cafe44e2a6e80e8678aabc12f1898233 (diff) | |
download | gcc-c0b419db62bcd4ea0dfc10086ac18848e99b9bd3.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@70062 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/decl.c | 11 | ||||
-rw-r--r-- | gcc/cp/pt.c | 15 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/koenig2.C | 25 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/using6.C | 14 |
7 files changed, 77 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c50f99f6fb3..9ce5c5e3d69 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 95984c9be06..593dcede6e6 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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)); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index d2e6bf33f81..2c9668f94a8 100644 --- a/gcc/cp/pt.c +++ b/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) diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 80a3d60136d..a5130a5bfbe 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b8e827c0f85..fef0f33d221 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/g++.dg/template/koenig2.C b/gcc/testsuite/g++.dg/template/koenig2.C new file mode 100644 index 00000000000..be072a4a0ec --- /dev/null +++ b/gcc/testsuite/g++.dg/template/koenig2.C @@ -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()); +} + diff --git a/gcc/testsuite/g++.dg/template/using6.C b/gcc/testsuite/g++.dg/template/using6.C new file mode 100644 index 00000000000..ee8d5be96ec --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using6.C @@ -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 "" } +} + |