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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155415
138bc75d-0d04-0410-961f-
82ee72b054a4
+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
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;
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)
{
reference to it)... */
}
else
- conv_fns = lookup_conversions (fromtype);
+ conv_fns = lookup_conversions (fromtype,
+ /*lookup_template_convs_p=*/true);
}
candidates = 0;
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))
{
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);
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;
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;
}
}
+ if (lookup_template_convs_p == false)
+ tpl_convs = NULL_TREE;
+
for (; tpl_convs; tpl_convs = TREE_CHAIN (tpl_convs))
{
tree probe, next;
+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
--- /dev/null
+// 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" }
+