-pedantic anyone?

August 23, 2008

Everyone knows that C++ plays nicely with C, until you engage with somehow stricter validation from the compiler. After that, you are on your own...

During my recent work on emountd (new EDE mount/unmount notify daemon with HAL support), I was surprised to learn that I'm not able to compile program which uses libhal with -pedantic flag.

I got this:

...found 95 target(s)...
...updating 2 target(s)...
C++ emountd.o
/usr/include/hal/libhal-storage.h:283: error: comma at end of enumerator list
cc -c -o emountd.o -Wno-long-long -Wall -pedantic -g3 -D_DEBUG -I.. -I/opt/ede/include -DDBUS_API_SUBJECT_TO_CHANGE -I/usr/include/hal -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I. emountd.cpp
...failed
C++ emountd.o ...
...skipped emountd for lack of
emountd.o...
...failed updating 1 target(s)...
...skipped 1
target(s)...

At first I thought compiler went nuts after 5 hour compile/recompile torture; to be honest, I get used to errors like this in my code, but in code which lives under /usr/, that is completely different thing.

Quick peek in libhal-storage.h, revealed this:

typedef enum {
  // ...
  LIBHAL_VOLUME_DISC_TYPE_HDDVDRW = 0x0f,
  LIBHAL_VOLUME_DISC_TYPE_MO = 0x10,
} LibHalVolumeDiscType;

See that last LIBHAL_VOLUME_DISC_TYPE_MO and comma at the end?

Well, both C and C++ standards doesn't allow that and -pedantic flag is here to reminds that. Set aside syntax check enforcement, long long type, heavily used in DBus, is not supported by C++ either.

Possible solutions for this is to either forget on -pedantic or to add -Wno-long-long, where warnings and errors about non standard long long will be inhibited. Since I'm much more fond of -pedantic, I took second approach.

EDIT: just checked the code for recent libhal version and seems that comma issue is fixed, so I'll have to think how to mitigate -pedantic flag for 0.5.9 version of libhal. Maybe with autoconf.