diff options
| author | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-05-22 21:45:24 +0000 |
|---|---|---|
| committer | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-05-22 21:45:24 +0000 |
| commit | df6f8740af7d0dfa1062b5eed4a01fbaca88eb8f (patch) | |
| tree | cabf0f9cf2491b63e8e3ac86d48cc1e5fccdd9d3 /gcc | |
| parent | 0a4217004b25e7b2a9b4dc938fcdad98ad8fbdd6 (diff) | |
| download | ppe42-gcc-df6f8740af7d0dfa1062b5eed4a01fbaca88eb8f.tar.gz ppe42-gcc-df6f8740af7d0dfa1062b5eed4a01fbaca88eb8f.zip | |
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
Diffstat (limited to 'gcc')
| -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 063ea63f819..9af31d52885 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 043e3e467c2..c506609b7f1 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 2d7c928f9d0..c8f51f5297d 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 00000000000..bd6ce6b4758 --- /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 00000000000..0959a3de9f8 --- /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>); +} |

