summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2003-08-01 18:48:50 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2003-08-01 18:48:50 +0000
commitc0b419db62bcd4ea0dfc10086ac18848e99b9bd3 (patch)
tree11282088f2347ed5579eceafb21ff924a97c8da1
parent3bdb6310cafe44e2a6e80e8678aabc12f1898233 (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--gcc/cp/decl.c11
-rw-r--r--gcc/cp/pt.c15
-rw-r--r--gcc/cp/semantics.c2
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/template/koenig2.C25
-rw-r--r--gcc/testsuite/g++.dg/template/using6.C14
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 "" }
+}
+