aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2003-03-11 17:43:44 -0500
committerJason Merrill <jason@gcc.gnu.org>2003-03-11 17:43:44 -0500
commitcf237c199cde6ed297fcf41bc6ea2a6a9723387a (patch)
treeb9e1f312dd3771fa7604f4de2dfa9976baf38be7
parentea45c4b0b3c2ea92cb571e7ad6d44113745769ad (diff)
downloadgcc-cf237c199cde6ed297fcf41bc6ea2a6a9723387a.zip
gcc-cf237c199cde6ed297fcf41bc6ea2a6a9723387a.tar.gz
gcc-cf237c199cde6ed297fcf41bc6ea2a6a9723387a.tar.bz2
re PR c++/9820 (ice in build_baselink (templates))
PR c++/9820 * search.c (lookup_member): Fix handling of functions in a class being defined. From-SVN: r64193
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/search.c6
-rw-r--r--gcc/testsuite/g++.dg/template/init2.C10
3 files changed, 21 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 121c2ae..679cd11 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2003-03-11 Jason Merrill <jason@redhat.com>
+
+ PR c++/9820
+ * search.c (lookup_member): Fix handling of functions in a class
+ being defined.
+
2003-03-11 Mark Mitchell <mark@codesourcery.com>
PR c++/8700
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index f97cb74..3d23766 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -1212,11 +1212,15 @@ lookup_member (tree xbasetype, tree name, int protect, bool want_type)
const char *errstr = 0;
+ /* Sanity check. */
+ if (TREE_CODE (name) != IDENTIFIER_NODE)
+ abort ();
+
if (xbasetype == current_class_type && TYPE_BEING_DEFINED (xbasetype)
&& IDENTIFIER_CLASS_VALUE (name))
{
tree field = IDENTIFIER_CLASS_VALUE (name);
- if (TREE_CODE (field) != FUNCTION_DECL
+ if (! is_overloaded_fn (field)
&& ! (want_type && TREE_CODE (field) != TYPE_DECL))
/* We're in the scope of this class, and the value has already
been looked up. Just return the cached value. */
diff --git a/gcc/testsuite/g++.dg/template/init2.C b/gcc/testsuite/g++.dg/template/init2.C
new file mode 100644
index 0000000..b81e4be
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/init2.C
@@ -0,0 +1,10 @@
+// PR c++/9820
+
+template <typename T> struct X {
+ template<typename> static int test(...);
+ template<typename> static int test(int *);
+
+ static const int i = sizeof(X<T>::template test<int>(0));
+};
+
+template class X<int>;