error: cannot combine with previous 'type-name' declaration specifier

Hi,

encouraged by the recent improvement in clang's C++ support, I tried building DragonFly's devd(8) with it but am getting:

clang -fno-color-diagnostics -O -pipe -I. -I/home/s/projects/dragonfly/src/sbin/devd -g -c devd.cc
In file included from devd.cc:59:
In file included from /usr/include/c++/4.1/algorithm:64:
In file included from /usr/include/c++/4.1/bits/stl_algobase.h:69:
In file included from /usr/include/c++/4.1/iosfwd:48:
In file included from /usr/include/c++/4.1/bits/postypes.h:45:
In file included from /usr/include/c++/4.1/cwchar:54:
/usr/include/wchar.h:78:19: error: cannot combine with previous 'type-name' declaration specifier
typedef __wchar_t wchar_t;
                         ^
/usr/include/wchar.h:78:1: error: declaration does not declare anything
typedef __wchar_t wchar_t;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 diagnostics generated.
*** Error code 1

But what is the problem here?

Regards,
Sascha

The wchar.h header looks suspicious. wchar_t is a built-in type in C++, and cannot be a typedef. Somehow, your wchar.h should protect against defining wchar_t when in C++ mode. I suggest looking through /usr/include/wchar.h to determine which preprocessor macros control that definition.

  - Doug

wchar_t is a built-in type specifier and it looks like that libstdc++
version, old as it is, is not checking for this, so it's like trying
to typedef __int int; which obviously won't work.

Perhaps this is another place where we special-case a typedef rule to
support older versions of libstdc++?

Sean

P.S. This message was orinally sent directly to Sascha; I still have
not gotten a hang of this list. Sorry for the duplicate, Sascha!

It appears Dragonfly BSD expects stddef.h to define _WCHAR_T_DECLARED,
which doesn't happen in clang at the moment.

-Eli

It turned out we didn't have #ifndef __cplusplus around our wchar_t typedef in wchar.h. With this being added, it at least gets through compilation but fails linking. I'm investigating currently and will get back in case I found something.

Just one note: gcc obviously doesn't have a problem with this (typedef wchar_t in C++). I've tried clang with -std=gnu++98 (gcc's default setting) but it didn't make a difference. Not sure if that qualifies as a "gcc compatibility bug" or so.

Thanks to all who answered,
Sascha

I'm sorry, my testing was wrong there, g++ errors just the same.

Sascha

Hi Sascha,

Not sure here however on some systems you need to define wchar_t
builtin as part of the toolchain support, here is a *example* for
DragonflyBSD,

Index: lib/Basic/Targets.cpp