diff options
author | Mark Mitchell <mark@codesourcery.com> | 2004-05-22 21:45:24 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2004-05-22 21:45:24 +0000 |
commit | 0deb916ce9b997d494a4f5e14ac33ad0c9fe5df7 (patch) | |
tree | cabf0f9cf2491b63e8e3ac86d48cc1e5fccdd9d3 | |
parent | 52ceb03971fb7f878b8a610fa97b07a4de510057 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/pt.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/non-dependent5.C | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/non-dependent6.C | 13 |
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>); +} |