From: Mark Mitchell Date: Sat, 22 May 2004 21:45:24 +0000 (+0000) Subject: re PR c++/15285 (instantiate_type ICE when forming pointer to template function) X-Git-Tag: releases/gcc-4.0.0~8193 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0deb916ce9b997d494a4f5e14ac33ad0c9fe5df7;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 063ea63f819c..9af31d528852 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2004-05-22 Mark Mitchell + + 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 PR c++/15507 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 043e3e467c25..c506609b7f1c 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 2d7c928f9d0f..c8f51f5297d6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2004-05-22 Mark Mitchell + + 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 PR c++/15507 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 000000000000..bd6ce6b47588 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent5.C @@ -0,0 +1,8 @@ +// PR c++/15299 + +template void fun_ptr(T (*)()); +template T bar(); + +template void foo () { + fun_ptr(bar); +} 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 000000000000..0959a3de9f88 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent6.C @@ -0,0 +1,13 @@ +// PR c++/15285 + +void foo(void (*func)()) {} + +template +void bar() +{} + +template +void baz() +{ + foo(&bar); +}