Hi,
On 03/11/2015 09:26 PM, Jason Merrill wrote:
On 03/06/2015 03:36 AM, Paolo Carlini wrote:
this is a regression about duplicate warnings with
-Wzero-as-null-pointer-constant. The regression is rather old, affects
4_8-branch too, and started when check_default_argument got a
perform_implicit_conversion_flags call which warns a first time, then
maybe_warn_zero_as_null_pointer_constant as called by
check_default_argument itself warns a second time. The latter call is
even older, dates back to c++/52718, I think we can now safely remove it
and keep on returning nullptr_node to avoid warning later still at the
call sites (that was the point of c++/52718). Tested x86_64-linux.
Do we need this special handling at all? When I remove that whole
'if' block I still only get one warning from the 52718 testcase.
I just tried again for this reduced version of 52718 (I added a 0 && to
the 'if'):
void* fun(void* a = 0);
void* f2 = fun();
and I got (removed the irrelevant carets):
52718_red.C:1:22: warning: zero as null pointer constant
[-Wzero-as-null-pointer-constant]
void* fun(void* a = 0);
52718_red.C:2:16: warning: zero as null pointer constant
[-Wzero-as-null-pointer-constant]
void* f2 = fun();
That is, as far as I can see, the rationale that led to an early
*return* for 52718 still stand: no matter what we do at the beginning of
check_default_argument, whether we warn via
perform_implicit_conversion_flags or immediately, we still want to early
return to avoid warning again at the call site.
Paolo.