[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