Index: cp/cvt.c =================================================================== --- cp/cvt.c (revision 196099) +++ cp/cvt.c (working copy) @@ -783,7 +783,14 @@ ocp_convert (tree type, tree expr, int convtype, i return ignore_overflows (converted, e); } if (NULLPTR_TYPE_P (type) && e && null_ptr_cst_p (e)) - return nullptr_node; + { + if ((complain & tf_warning) + && c_inhibit_evaluation_warnings == 0 + && !NULLPTR_TYPE_P (TREE_TYPE (e))) + warning_at (loc, OPT_Wzero_as_null_pointer_constant, + "zero as null pointer constant"); + return nullptr_node; + } if (POINTER_TYPE_P (type) || TYPE_PTRMEM_P (type)) return fold_if_not_in_template (cp_convert_to_pointer (type, e, complain)); if (code == VECTOR_TYPE) Index: testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-2.C =================================================================== --- testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-2.C (revision 0) +++ testsuite/g++.dg/cpp0x/Wzero-as-null-pointer-constant-2.C (working copy) @@ -0,0 +1,14 @@ +// PR c++/56373 +// { dg-options "-std=c++11 -Wzero-as-null-pointer-constant" } + +struct shared_ptr +{ + shared_ptr(decltype(nullptr)); +}; + +void f() +{ + shared_ptr a = 0; // { dg-warning "zero as null pointer" } + shared_ptr b(0); // { dg-warning "zero as null pointer" } + shared_ptr c{0}; // { dg-warning "zero as null pointer" } +}