Message ID | 54737F2D.6090504@oracle.com |
---|---|
State | New |
Headers | show |
On 11/24/2014 01:55 PM, Paolo Carlini wrote: > in this rejects-valid, as part of build_user_type_conversion_1, > standard_conversion is called by implicit_conversion with a *null* expr, > thus the condition in standard_conversion > > /* [conv.ptr] > A null pointer constant can be converted to a pointer type; ... A > null pointer constant of integral type can be converted to an > rvalue of type std::nullptr_t. */ > if ((tcode == POINTER_TYPE || TYPE_PTRMEM_P (to) > || NULLPTR_TYPE_P (to)) > && expr && null_ptr_cst_p (expr)) > conv = build_conv (ck_std, to, conv); > > is false and the snippet is rejected. Should we pass a nullptr_node as > expr in such cases, ie, when handling conversions functions returning > std::nullptr_t?!? I'd prefer to change the test quoted above to not require expr to be non-null in the case of NULLPTR_TYPE_P. Jason
Index: cp/call.c =================================================================== --- cp/call.c (revision 218022) +++ cp/call.c (working copy) @@ -3685,7 +3685,8 @@ build_user_type_conversion_1 (tree totype, tree ex conversion *ics = implicit_conversion (totype, rettype, - 0, + NULLPTR_TYPE_P (rettype) + ? nullptr_node : NULL_TREE, /*c_cast_p=*/false, convflags, complain); Index: testsuite/g++.dg/cpp0x/nullptr33.C =================================================================== --- testsuite/g++.dg/cpp0x/nullptr33.C (revision 0) +++ testsuite/g++.dg/cpp0x/nullptr33.C (working copy) @@ -0,0 +1,19 @@ +// PR c++/63757 +// { dg-do compile { target c++11 } } + +typedef decltype(nullptr) nullptr_t; + +void bar(void*) {} + +struct foo +{ + operator nullptr_t() + { + return nullptr; + } +}; + +int main() +{ + bar(foo()); +}