diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 59b162df7f9..865d76461e1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2011-09-26 Jason Merrill + PR c++/50523 + * call.c (implicit_conversion): Mask out inappropriate LOOKUP + flags at the top of the function. + * pt.c (tsubst_copy) [PARM_DECL]: Handle 'this' in NSDMI. 2011-09-26 Paolo Carlini diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 6a7dfd39874..579e563ea1c 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -1660,6 +1660,12 @@ implicit_conversion (tree to, tree from, tree expr, bool c_cast_p, || expr == error_mark_node) return NULL; + /* Other flags only apply to the primary function in overload + resolution, or after we've chosen one. */ + flags &= (LOOKUP_ONLYCONVERTING|LOOKUP_NO_CONVERSION|LOOKUP_COPY_PARM + |LOOKUP_NO_TEMP_BIND|LOOKUP_NO_RVAL_BIND|LOOKUP_PREFER_RVALUE + |LOOKUP_NO_NARROWING|LOOKUP_PROTECT); + if (TREE_CODE (to) == REFERENCE_TYPE) conv = reference_binding (to, from, expr, c_cast_p, flags); else @@ -1716,15 +1722,13 @@ implicit_conversion (tree to, tree from, tree expr, bool c_cast_p, && (flags & LOOKUP_NO_CONVERSION) == 0) { struct z_candidate *cand; - int convflags = (flags & (LOOKUP_NO_TEMP_BIND|LOOKUP_ONLYCONVERTING - |LOOKUP_NO_NARROWING)); if (CLASS_TYPE_P (to) && BRACE_ENCLOSED_INITIALIZER_P (expr) && !CLASSTYPE_NON_AGGREGATE (complete_type (to))) return build_aggr_conv (to, expr, flags); - cand = build_user_type_conversion_1 (to, expr, convflags); + cand = build_user_type_conversion_1 (to, expr, flags); if (cand) conv = cand->second_conv; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e0250194a90..500fbf577ee 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2011-09-26 Jason Merrill + PR c++/50523 + * g++.dg/overload/ref-conv2.C: New. + * g++.dg/cpp0x/nsdmi-template1.C: New. 2011-09-26 Paolo Carlini diff --git a/gcc/testsuite/g++.dg/overload/ref-conv2.C b/gcc/testsuite/g++.dg/overload/ref-conv2.C new file mode 100644 index 00000000000..bb0ad39d6b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/ref-conv2.C @@ -0,0 +1,15 @@ +// PR c++/50523 + +template +struct A +{ + A(const T&); + operator T&() const; + operator const T&() const; +}; + +int main() +{ + A a(1); + A a2(a); +}