From df6f8740af7d0dfa1062b5eed4a01fbaca88eb8f Mon Sep 17 00:00:00 2001 From: mmitchel Date: Sat, 22 May 2004 21:45:24 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@82149 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/pt.c | 11 ++++++++--- gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/g++.dg/template/non-dependent5.C | 8 ++++++++ gcc/testsuite/g++.dg/template/non-dependent6.C | 13 +++++++++++++ 5 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/non-dependent5.C create mode 100644 gcc/testsuite/g++.dg/template/non-dependent6.C 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 + 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 * 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 + 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 * 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 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 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 +void bar() +{} + +template +void baz() +{ + foo(&bar); +} -- 2.7.4