aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2004-05-22 21:45:24 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2004-05-22 21:45:24 +0000
commit0deb916ce9b997d494a4f5e14ac33ad0c9fe5df7 (patch)
treecabf0f9cf2491b63e8e3ac86d48cc1e5fccdd9d3
parent52ceb03971fb7f878b8a610fa97b07a4de510057 (diff)
downloadgcc-0deb916ce9b997d494a4f5e14ac33ad0c9fe5df7.zip
gcc-0deb916ce9b997d494a4f5e14ac33ad0c9fe5df7.tar.gz
gcc-0deb916ce9b997d494a4f5e14ac33ad0c9fe5df7.tar.bz2
re PR c++/15285 (instantiate_type ICE when forming pointer to template function)
PR c++/15285 PR c++/15299 * pt.c (build_non_dependent_expr): Expand the set of tree nodes recognized as overloaded functions. PR c++/15285 PR c++/15299 * g++.dg/template/non-dependent5.C: New test. * g++.dg/template/non-dependent6.C: New test. From-SVN: r82149
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/pt.c11
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/template/non-dependent5.C8
-rw-r--r--gcc/testsuite/g++.dg/template/non-dependent6.C13
5 files changed, 43 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 063ea63..9af31d5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,12 @@
2004-05-22 Mark Mitchell <mark@codesourcery.com>
+ PR c++/15285
+ PR c++/15299
+ * pt.c (build_non_dependent_expr): Expand the set of tree nodes
+ recognized as overloaded functions.
+
+2004-05-22 Mark Mitchell <mark@codesourcery.com>
+
PR c++/15507
* class.c (layout_nonempty_base_or_field): Do not try to avoid
layout conflicts for unions.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 043e3e4..c506609 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -12158,15 +12158,20 @@ resolve_typename_type (tree type, bool only_current_p)
tree
build_non_dependent_expr (tree expr)
{
+ tree inner_expr;
+
/* Preserve null pointer constants so that the type of things like
"p == 0" where "p" is a pointer can be determined. */
if (null_ptr_cst_p (expr))
return expr;
/* Preserve OVERLOADs; the functions must be available to resolve
types. */
- if (TREE_CODE (expr) == OVERLOAD
- || TREE_CODE (expr) == FUNCTION_DECL
- || TREE_CODE (expr) == TEMPLATE_DECL)
+ inner_expr = (TREE_CODE (expr) == ADDR_EXPR ?
+ TREE_OPERAND (expr, 0) : expr);
+ if (TREE_CODE (inner_expr) == OVERLOAD
+ || TREE_CODE (inner_expr) == FUNCTION_DECL
+ || TREE_CODE (inner_expr) == TEMPLATE_DECL
+ || TREE_CODE (inner_expr) == TEMPLATE_ID_EXPR)
return expr;
/* Preserve string constants; conversions from string constants to
"char *" are allowed, even though normally a "const char *"
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2d7c928..c8f51f5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,12 @@
2004-05-22 Mark Mitchell <mark@codesourcery.com>
+ PR c++/15285
+ PR c++/15299
+ * g++.dg/template/non-dependent5.C: New test.
+ * g++.dg/template/non-dependent6.C: New test.
+
+2004-05-22 Mark Mitchell <mark@codesourcery.com>
+
PR c++/15507
* g++.dg/inherit/union1.C: New test.
diff --git a/gcc/testsuite/g++.dg/template/non-dependent5.C b/gcc/testsuite/g++.dg/template/non-dependent5.C
new file mode 100644
index 0000000..bd6ce6b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/non-dependent5.C
@@ -0,0 +1,8 @@
+// PR c++/15299
+
+template <class T> void fun_ptr(T (*)());
+template <class T> T bar();
+
+template <class> void foo () {
+ fun_ptr(bar<int>);
+}
diff --git a/gcc/testsuite/g++.dg/template/non-dependent6.C b/gcc/testsuite/g++.dg/template/non-dependent6.C
new file mode 100644
index 0000000..0959a3d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/non-dependent6.C
@@ -0,0 +1,13 @@
+// PR c++/15285
+
+void foo(void (*func)()) {}
+
+template<typename T>
+void bar()
+{}
+
+template<typename T>
+void baz()
+{
+ foo(&bar<long>);
+}