Bug 980270 - namespace pollution with #define interface in mingw rpc.h
namespace pollution with #define interface in mingw rpc.h
Status: CLOSED WONTFIX
Product: Fedora
Classification: Fedora
Component: mingw-headers (Show other bugs)
18
Unspecified Unspecified
unspecified Severity unspecified
: ---
: ---
Assigned To: Erik van Pienbroek
Fedora Extras Quality Assurance
:
Depends On:
Blocks:
  Show dependency treegraph
 
Reported: 2013-07-01 19:23 EDT by Eric Blake
Modified: 2013-08-03 15:37 EDT (History)
6 users (show)

See Also:
Fixed In Version:
Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of:
Environment:
Last Closed: 2013-08-03 15:37:15 EDT
Type: Bug
Regression: ---
Mount Type: ---
Documentation: ---
CRM:
Verified Versions:
Category: ---
oVirt Team: ---
RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: ---


Attachments (Terms of Use)

  None (edit)
Description Eric Blake 2013-07-01 19:23:58 EDT
Description of problem:
When cross-compiling for mingw, and attempting to use the identifier 'interface' (which is reserved for the user according to C99), compilation fails under mingw.  While trying to cross-compile libvirt, I ended up with failed compilation where dbus tried to use 'interface' as a parameter name in a function prototype, but where an earlier '#define interface ...' in the system rpc.h caused syntax failures.  Although I noticed it with libvirt, the case below is stripped down to the bare minimum for easier testing.

Version-Release number of selected component (if applicable):
mingw32-headers-2.0.999-0.15.trunk.20121110.fc18.noarch
mingw32-dbus-1.6.8-1.fc18.noarch


How reproducible:
100%

Steps to Reproduce:
1. cat foo.c
2. i686-w64-mingw32-gcc -c \
   -I /usr/i686-w64-mingw32/sys-root/mingw/include/dbus-1.0 \
   -I /usr/i686-w64-mingw32/sys-root/mingw/lib/dbus-1.0/include \
   foo.c
3. cat bar.c
4. i686-w64-mingw32-gcc -c bar.c


Actual results:
1. #include <rpc.h>
#include <dbus/dbus.h>
int dummy;

2. In file included from /usr/i686-w64-mingw32/sys-root/mingw/include/dbus-1.0/dbus/dbus-connection.h:32:0,
                 from /usr/i686-w64-mingw32/sys-root/mingw/include/dbus-1.0/dbus/dbus-bus.h:30,
                 from /usr/i686-w64-mingw32/sys-root/mingw/include/dbus-1.0/dbus/dbus.h:31,
                 from foo.c:2:
/usr/i686-w64-mingw32/sys-root/mingw/include/dbus-1.0/dbus/dbus-message.h:74:58: error: expected ';', ',' or ')' before 'struct'
/usr/i686-w64-mingw32/sys-root/mingw/include/dbus-1.0/dbus/dbus-message.h:80:58: error: expected ';', ',' or ')' before 'struct'
/usr/i686-w64-mingw32/sys-root/mingw/include/dbus-1.0/dbus/dbus-message.h:111:58: error: expected ';', ',' or ')' before 'struct'
/usr/i686-w64-mingw32/sys-root/mingw/include/dbus-1.0/dbus/dbus-message.h:116:58: error: expected ';', ',' or ')' before 'struct'
/usr/i686-w64-mingw32/sys-root/mingw/include/dbus-1.0/dbus/dbus-message.h:149:58: error: expected ';', ',' or ')' before 'struct'
/usr/i686-w64-mingw32/sys-root/mingw/include/dbus-1.0/dbus/dbus-message.h:153:58: error: expected ';', ',' or ')' before 'struct'

3. #include <rpc.h>
#define interface
int dummy;

4. bar.c:2:0: warning: "interface" redefined [enabled by default]
In file included from /usr/i686-w64-mingw32/sys-root/mingw/include/oleidl.h:7:0,
                 from /usr/i686-w64-mingw32/sys-root/mingw/include/ole2.h:38,
                 from /usr/i686-w64-mingw32/sys-root/mingw/include/wtypes.h:12,
                 from /usr/i686-w64-mingw32/sys-root/mingw/include/winscard.h:10,
                 from /usr/i686-w64-mingw32/sys-root/mingw/include/windows.h:97,
                 from /usr/i686-w64-mingw32/sys-root/mingw/include/rpc.h:16,
                 from bar.c:1:
/usr/i686-w64-mingw32/sys-root/mingw/include/rpc.h:12:0: note: this is the location of the previous definition


Expected results:
rpc.h should be namespace-clean, and should not leave 'interface' defined to interfere with subsequent valid C99 use of this identifier.

Additional info:
Yes, it could also be argued that dbus shouldn't be using the name 'interface' in its header prototypes, so I'll file a bug there, too.
Comment 1 Eric Blake 2013-07-01 22:59:06 EDT
(In reply to Eric Blake from comment #0)

> 
> Additional info:
> Yes, it could also be argued that dbus shouldn't be using the name
> 'interface' in its header prototypes, so I'll file a bug there, too.

bug 980278 for that argument
Comment 2 Erik van Pienbroek 2013-08-03 15:37:15 EDT
I'm aware of the issue and I've also got hit by it on multiple occasions (as can be seen at https://bugzilla.gnome.org/show_bug.cgi?id=656402). However, the keyword 'interface' is a reserved keyword on Windows environments according to MSDN: http://msdn.microsoft.com/en-us/library/vstudio/2kb28261.aspx
Therefore I can't fix this in the mingw-w64 headers. If you still wish to pursue this issue I would recommend you to contact the upstream mingw-w64 developers and try to get it resolved there.

For downstream packages (like dbus) I would recommend to avoid using the 'interface' keyword in public headers. For this you've already created a separate bug report so I'll close this one.

Note You need to log in before you can comment on or make changes to this bug.