[Bug 53431] New: widl generates enum forward declarations in typedefs which are not valid in C++

WineHQ Bugzilla wine-bugs at winehq.org
Fri Jul 29 05:01:09 CDT 2022


https://bugs.winehq.org/show_bug.cgi?id=53431

            Bug ID: 53431
           Summary: widl generates enum forward declarations in typedefs
                    which are not valid in C++
           Product: Wine
           Version: 7.13
          Hardware: x86-64
                OS: Linux
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: tools
          Assignee: wine-bugs at winehq.org
          Reporter: gfw.kra at gmail.com
      Distribution: ---

Hi everyone,

I recently discovered an issue with C++ code in headers compiled from winrt
idl's using widl. It does not compile when included, when tried using mingw g++
v12.1.0.
There’s seems to be issue with how enum typedefs are translated within
namespaces.

Example:

When tried to include windows.media.speechsynthesis.h compiled from
windows.media.speechsynthesis.idl in cpp file, the following output is received
(compiler output shows headers from mingw, but these look the same when
compiled using widl in wine).

```
/usr/x86_64-w64-mingw32/include/windows.foundation.h:90:26: error: use of enum
‘PropertyType’ without previous declaration
   90 |             typedef enum PropertyType PropertyType;
      |                          ^~~~~~~~~~~~
/usr/x86_64-w64-mingw32/include/windows.foundation.h:164:18: error: using
typedef-name ‘ABI::Windows::Foundation::PropertyType’ after ‘enum’
  164 |             enum PropertyType {
      |                  ^~~~~~~~~~~~
/usr/x86_64-w64-mingw32/include/windows.foundation.h:90:39: note:
‘ABI::Windows::Foundation::PropertyType’ has a previous declaration here
   90 |             typedef enum PropertyType PropertyType;
      |                                       ^~~~~~~~~~~~
/usr/x86_64-w64-mingw32/include/windows.media.speechsynthesis.h:218:30: error:
use of enum ‘VoiceGender’ without previous declaration
  218 |                 typedef enum VoiceGender VoiceGender;
      |                              ^~~~~~~~~~~
/usr/x86_64-w64-mingw32/include/windows.media.speechsynthesis.h:476:22: error:
using typedef-name ‘ABI::Windows::Media::SpeechSynthesis::VoiceGender’ after
‘enum’
  476 |                 enum VoiceGender {
      |                      ^~~~~~~~~~~
/usr/x86_64-w64-mingw32/include/windows.media.speechsynthesis.h:218:42: note:
‘ABI::Windows::Media::SpeechSynthesis::VoiceGender’ has a previous declaration
here
  218 |                 typedef enum VoiceGender VoiceGender;
      |                                          ^~~~~~~~~~~
/usr/x86_64-w64-mingw32/include/windows.media.speechsynthesis.h:822:30: error:
using typedef-name ‘ABI::Windows::Media::SpeechSynthesis::VoiceGender’ after
‘enum’
  822 |                         enum VoiceGender *value) = 0;
      |                              ^~~~~~~~~~~
/usr/x86_64-w64-mingw32/include/windows.media.speechsynthesis.h:218:42: note:
‘ABI::Windows::Media::SpeechSynthesis::VoiceGender’ has a previous declaration
here
  218 |                 typedef enum VoiceGender VoiceGender;
```

windows.media.speechsynthesis.idl has typedef of enum VoiceGender, which is
defined later.
```
namespace Windows {
    namespace Foundation {
        interface IClosable;
    }
    namespace Media {
        namespace SpeechSynthesis {
            typedef enum VoiceGender VoiceGender;
```

This is translated to following:
```
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechSynthesis {
                typedef enum VoiceGender VoiceGender;
            }
        }
    }
}
#else /* __cplusplus */
typedef enum __x_ABI_CWindows_CMedia_CSpeechSynthesis_CVoiceGender
__x_ABI_CWindows_CMedia_CSpeechSynthesis_CVoiceGender;
#endif /* __cplusplus */
```

This typedef is not valid in C++. According to the standard, enum cannot be
forward declared using typedef. This could be replaced with just simple enum
declaration, but it would need to have type specifier (that goes for definition
as well).

Best regards.

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.


More information about the wine-bugs mailing list