Subject: Re: pkg/32670: multimedia/vlc (in pkgsrc-2005Q4) does not compile [with fix]
To: None <gnats-bugs@netbsd.org>
From: Rhialto <rhialto@falu.nl>
List: pkgsrc-bugs
Date: 01/30/2006 23:07:07
On Mon 30 Jan 2006 at 20:30:02 +0000, joerg@britannica.bec.de wrote:
>  This patches are incorrect or rather the use is absolutely correct.

Maybe the use is correct - yet it does not compile.

From comp.std.c I have learned that NULL should always be cast to the
correct type. In C++ where more type conversions are made this seems
even more important.

>  Please check your build environment where the incorrect (C-style void *)
>  declaration of NULL comes from.

My build environment is a plain 3.0/amd64 into a chroot made with
pkg_comp.  Of course I have my preferences in /etc/mk.conf but none that
would influence NULL, I'd say (and if they did I would call it a bug).

I recall another package that needed similar fixes before, also due to
wxWidgets, but I don't remember which it was (maybe it was even vlc).

I don't think a C-style (void *) version of NULL is the problem, since the
compiler complains about ambiguous overloading, and the arguments it
can't decide between are const wxString* and long int. That could happen
only if NULL is 0, not if it is (void *)0. (Aside: even in C NULL should
not be defined as (void *)0 since it that is a data pointer, and those
cannot be converted to a function pointer, i.e. (void (*)())NULL would
fail to compile).

Looking at the error message which prints "NULL" explicitly it would
even seem that it doesn't matter - that g++ is painfully aware of the
NULLness of the pointer.

With some trouble I got the pre-processed text (g++ -E -dD -C) and this
is how it defines NULL:

# 1 "/usr/include/sys/null.h" 1 3 4
/*      $NetBSD: null.h,v 1.6 2003/10/24 21:45:09 enami Exp $   */ 
# 11 "/usr/include/sys/null.h" 3 4
#define NULL __null 

I expect that this definition can hardly be improved. From the errors, I
conclude that __null behaves as plain 0.

pkg_comp:default.conf# gcc -v
Using built-in specs.
Configured with: /home/nick/work/netbsd/src/tools/gcc/../../gnu/dist/gcc/configure --enable-long-long --disable-multilib --enable-threads --disable-symvers --build=i386-unknown-netbsdelf2.0. --host=x86_64--netbsd --target=x86_64--netbsd
Thread model: posix
gcc version 3.3.3 (NetBSD nb3 20040520)

These are the errors (there are lots of warnings too):

if c++ -DHAVE_CONFIG_H -I. -I. -I../../..   -I/usr/pkg/include -I/usr/include -D
GLX_GLXEXT_LEGACY -I/usr/pkg/include/freetype2 -I/usr/X11R6/include -DSYS_NETBSD
 -I../../../include `top_builddir="../../.." ../../../vlc-config --cxxflags plug
in wxwindows` -Wsign-compare -Wsign-compare -Wall -O2 -I/usr/pkg/include -I/usr/
include -DGLX_GLXEXT_LEGACY -I/usr/pkg/include/freetype2 -I/usr/X11R6/include -p
thread -finline-limit-30000 -pipe -MT libwxwindows_plugin_a-open.o -MD -MP -MF "
.deps/libwxwindows_plugin_a-open.Tpo" \
  -c -o libwxwindows_plugin_a-open.o `test -f 'open.cpp' || echo './'`open.cpp; 
\
then mv -f ".deps/libwxwindows_plugin_a-open.Tpo" ".deps/libwxwindows_plugin_a-o
pen.Po"; \
else rm -f ".deps/libwxwindows_plugin_a-open.Tpo"; exit 1; \
fi

...

open.cpp: In constructor `wxvlc::OpenDialog::OpenDialog(intf_thread_t*,
   wxWindow*, int, int, int)':
open.cpp:385: error: call of overloaded `wxComboBox(wxPanel*&, <anonymous
   enum>, const char[1], wxPoint, wxSize, int, NULL)' is ambiguous
/pkg_comp/obj/pkgsrc/multimedia/vlc/default/.buildlink/include/wx-2.6/wx/gtk/com
bobox.h:65: error: candidates
   are: wxComboBox::wxComboBox(wxWindow*, int, const wxString&, const wxPoint&,
   const wxSize&, const wxArrayString&, long int, const wxValidator&, const
   wxString&)
/pkg_comp/obj/pkgsrc/multimedia/vlc/default/.buildlink/include/wx-2.6/wx/gtk/com
bobox.h:54: error:
                  wxComboBox::wxComboBox(wxWindow*, int, const wxString&, const
   wxPoint&, const wxSize&, int, const wxString*, long int, const wxValidator&,
   const wxString&)

open.cpp:442: warning: `__comp_ctor' is deprecated (declared at
   /pkg_comp/obj/pkgsrc/multimedia/vlc/default/.buildlink/include/wx-2.6/wx/sizer.h
   :788)

open.cpp: In member function `wxPanel* wxvlc::OpenDialog::FilePanel(wxWindow*)
   ':
open.cpp:566: error: call of overloaded `wxComboBox(wxPanel*&, <anonymous
   enum>, const char[1], wxPoint, wxSize, int, NULL)' is ambiguous
/pkg_comp/obj/pkgsrc/multimedia/vlc/default/.buildlink/include/wx-2.6/wx/gtk/combobox.h:65: error: candidates
   are: wxComboBox::wxComboBox(wxWindow*, int, const wxString&, const wxPoint&,
   const wxSize&, const wxArrayString&, long int, const wxValidator&, const
   wxString&)
/pkg_comp/obj/pkgsrc/multimedia/vlc/default/.buildlink/include/wx-2.6/wx/gtk/combobox.h:54: error:
                  wxComboBox::wxComboBox(wxWindow*, int, const wxString&, const
   wxPoint&, const wxSize&, int, const wxString*, long int, const wxValidator&,
   const wxString&)

So, concluding, I can see why the compiler produces the error that it
does, it can't be that NULL is somehow (void *)0 which would be
incorrect for other reasons as well, and disambiguation of the NULL
argument makes a lot of sense. Hence, my patch.

>  Joerg
-Olaf.
-- 
___ Olaf 'Rhialto' Seibert      -- You author it, and I'll reader it.
\X/ rhialto/at/xs4all.nl        -- Cetero censeo "authored" delendum esse.