diff options
author | Dodji Seketeli <dodji@redhat.com> | 2009-12-23 00:31:33 +0000 |
---|---|---|
committer | Dodji Seketeli <dodji@gcc.gnu.org> | 2009-12-23 01:31:33 +0100 |
commit | 58326a562079d2a2a732fb869767c0611694ba96 (patch) | |
tree | bf27e39059a5d3b482c3c5aaacaccd3688912360 | |
parent | 79e2daa9a1608d88555a246d588960b68a55cb88 (diff) | |
download | gcc-58326a562079d2a2a732fb869767c0611694ba96.zip gcc-58326a562079d2a2a732fb869767c0611694ba96.tar.gz gcc-58326a562079d2a2a732fb869767c0611694ba96.tar.bz2 |
re PR c++/42260 (ICE looking up template conversion operator)
Fix PR c++/42260
gcc/cp/ChangeLog:
PR c++/42260
* cp-tree.h (lookup_conversions): Add new bool parameter to
declaration.
* search.c (lookup_conversion): Use new bool parameter in
definition.
* call.c (add_builtin_candidates): Don't lookup template conversion
(convert_class_to_reference, build_user_type_conversion_1,
build_op_call): Adjust.
* cvt.c (build_expr_type_conversion): Likewise
gcc/testsuite/ChangeLog:
PR c++/42260
* conversion/cast2.C: New test.
From-SVN: r155415
-rw-r--r-- | gcc/cp/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/cp/call.c | 10 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 2 | ||||
-rw-r--r-- | gcc/cp/cvt.c | 4 | ||||
-rw-r--r-- | gcc/cp/search.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/conversion/cast2.C | 11 |
7 files changed, 46 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 65d40e2..ecd0c7a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +2009-12-23 Dodji Seketeli <dodji@redhat.com> + + PR c++/42260 + * cp-tree.h (lookup_conversions): Add new bool parameter to + declaration. + * search.c (lookup_conversion): Use new bool parameter in + definition. + * call.c (add_builtin_candidates): Don't lookup template conversion + (convert_class_to_reference, build_user_type_conversion_1, + build_op_call): Adjust. + * cvt.c (build_expr_type_conversion): Likewise + 2009-12-22 Jason Merrill <jason@redhat.com> PR c++/42466 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 67f4465..3fcbccf 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -1009,7 +1009,7 @@ convert_class_to_reference (tree reference_type, tree s, tree expr, int flags) struct z_candidate *cand; bool any_viable_p; - conversions = lookup_conversions (s); + conversions = lookup_conversions (s, /*lookup_template_convs_p=*/true); if (!conversions) return NULL; @@ -2362,7 +2362,8 @@ add_builtin_candidates (struct z_candidate **candidates, enum tree_code code, if (i == 0 && code == MODIFY_EXPR && code2 == NOP_EXPR) return; - convs = lookup_conversions (argtypes[i]); + convs = lookup_conversions (argtypes[i], + /*lookup_template_convs_p=*/false); if (code == COND_EXPR) { @@ -2851,7 +2852,8 @@ build_user_type_conversion_1 (tree totype, tree expr, int flags) reference to it)... */ } else - conv_fns = lookup_conversions (fromtype); + conv_fns = lookup_conversions (fromtype, + /*lookup_template_convs_p=*/true); } candidates = 0; @@ -3399,7 +3401,7 @@ build_op_call (tree obj, VEC(tree,gc) **args, tsubst_flags_t complain) if (LAMBDA_TYPE_P (type)) convs = NULL_TREE; else - convs = lookup_conversions (type); + convs = lookup_conversions (type, /*lookup_template_convs_p=*/true); for (; convs; convs = TREE_CHAIN (convs)) { diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 469dcec..531ede1 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4989,7 +4989,7 @@ extern int at_function_scope_p (void); extern bool at_class_scope_p (void); extern bool at_namespace_scope_p (void); extern tree context_for_name_lookup (tree); -extern tree lookup_conversions (tree); +extern tree lookup_conversions (tree, bool); extern tree binfo_from_vbase (tree); extern tree binfo_for_vbase (tree, tree); extern tree look_for_overrides_here (tree, tree); diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index 6f3b56e..b4cc2b3 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -1196,7 +1196,9 @@ build_expr_type_conversion (int desires, tree expr, bool complain) if (!TYPE_HAS_CONVERSION (basetype)) return NULL_TREE; - for (conv = lookup_conversions (basetype); conv; conv = TREE_CHAIN (conv)) + for (conv = lookup_conversions (basetype, /*lookup_template_convs_p=*/true); + conv; + conv = TREE_CHAIN (conv)) { int win = 0; tree candidate; diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 3e9bec0..c07a5e6 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -2419,10 +2419,13 @@ lookup_conversions_r (tree binfo, functions in this node were selected. This function is effectively performing a set of member lookups as lookup_fnfield does, but using the type being converted to as the unique key, rather than the - field name. */ + field name. + If LOOKUP_TEMPLATE_CONVS_P is TRUE, the returned TREE_LIST contains + the non-hidden user-defined template conversion functions too. */ tree -lookup_conversions (tree type) +lookup_conversions (tree type, + bool lookup_template_convs_p) { tree convs, tpl_convs; tree list = NULL_TREE; @@ -2449,6 +2452,9 @@ lookup_conversions (tree type) } } + if (lookup_template_convs_p == false) + tpl_convs = NULL_TREE; + for (; tpl_convs; tpl_convs = TREE_CHAIN (tpl_convs)) { tree probe, next; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 59d3a09..6740287 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-12-23 Dodji Seketeli <dodji@redhat.com> + + PR c++/42260 + * conversion/cast2.C: New test. + 2009-12-22 Jason Merrill <jason@redhat.com> PR c++/42466 diff --git a/gcc/testsuite/g++.dg/conversion/cast2.C b/gcc/testsuite/g++.dg/conversion/cast2.C new file mode 100644 index 0000000..3868d74 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cast2.C @@ -0,0 +1,11 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/42260 +// { dg-do compile } + +struct A +{ + template<typename T> operator T*(); +}; + +int i = *A();// { dg-error "no match" } + |