Skip to content

Commit e7b6903

Browse files
authored
Make guid constexpr on Clang and improve error reporting (#1191)
1 parent 64cdc7c commit e7b6903

File tree

6 files changed

+29
-39
lines changed

6 files changed

+29
-39
lines changed

Directory.Build.Props

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@
2525
-->
2626

2727
<PropertyGroup Condition="'$(Clang)'=='1'">
28-
<CLToolExe>clang-cl.exe</CLToolExe>
29-
<CLToolPath>C:\Program Files\LLVM\bin</CLToolPath>
28+
<PlatformToolset>ClangCL</PlatformToolset>
29+
<!-- The experimental coroutines aren't supported under Clang -->
30+
<CppWinRTLanguageStandard>20</CppWinRTLanguageStandard>
31+
<!-- Disable vcpkg autolink because it's not compatible with lld-link -->
32+
<VcpkgAutoLink>false</VcpkgAutoLink>
3033
</PropertyGroup>
3134

3235
<PropertyGroup>
@@ -51,7 +54,7 @@
5154
<MultiProcessorCompilation>true</MultiProcessorCompilation>
5255
<AdditionalOptions>/bigobj</AdditionalOptions>
5356
<AdditionalOptions Condition="'$(CppWinRTLanguageStandard)'==''">/await %(AdditionalOptions)</AdditionalOptions>
54-
<AdditionalOptions Condition="'$(Clang)'=='1'">-Wno-unused-command-line-argument -fno-delayed-template-parsing -Xclang -fcoroutines-ts -mcx16</AdditionalOptions>
57+
<AdditionalOptions Condition="'$(Clang)'=='1'">-Wno-unused-command-line-argument -fno-delayed-template-parsing -mcx16</AdditionalOptions>
5558
</ClCompile>
5659
<Link>
5760
<AdditionalDependencies>onecore.lib</AdditionalDependencies>

natvis/cppwinrtvisualizer.vcxproj

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,9 @@
105105
<WarningLevel>Level4</WarningLevel>
106106
<Optimization>Disabled</Optimization>
107107
<SDLCheck>false</SDLCheck>
108-
<PreprocessorDefinitions>WIN32;_DEBUG;VISUALIZER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
108+
<PreprocessorDefinitions>VSDEBUGENG_USE_CPP11_SCOPED_ENUMS;WIN32;_DEBUG;VISUALIZER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
109109
<AdditionalIncludeDirectories>$(IntDir);..\cppwinrt;..\strings;$(DIASDKInc);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
110-
<LanguageStandard>stdcpp17</LanguageStandard>
111-
<AdditionalOptions>/await</AdditionalOptions>
110+
<LanguageStandard>stdcpp20</LanguageStandard>
112111
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
113112
</ClCompile>
114113
<ResourceCompile>
@@ -131,11 +130,10 @@
131130
<WarningLevel>Level4</WarningLevel>
132131
<Optimization>Disabled</Optimization>
133132
<SDLCheck>false</SDLCheck>
134-
<PreprocessorDefinitions>_DEBUG;VISUALIZER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
133+
<PreprocessorDefinitions>VSDEBUGENG_USE_CPP11_SCOPED_ENUMS;_DEBUG;VISUALIZER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
135134
<AdditionalIncludeDirectories>$(IntDir);..\cppwinrt;..\strings;$(DIASDKInc);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
136-
<LanguageStandard>stdcpp17</LanguageStandard>
135+
<LanguageStandard>stdcpp20</LanguageStandard>
137136
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
138-
<AdditionalOptions>/await</AdditionalOptions>
139137
</ClCompile>
140138
<ResourceCompile>
141139
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -156,11 +154,10 @@
156154
<WarningLevel>Level4</WarningLevel>
157155
<Optimization>Disabled</Optimization>
158156
<SDLCheck>false</SDLCheck>
159-
<PreprocessorDefinitions>_DEBUG;VISUALIZER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
157+
<PreprocessorDefinitions>VSDEBUGENG_USE_CPP11_SCOPED_ENUMS;_DEBUG;VISUALIZER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
160158
<AdditionalIncludeDirectories>$(IntDir);..\cppwinrt;..\strings;$(DIASDKInc);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
161-
<LanguageStandard>stdcpp17</LanguageStandard>
159+
<LanguageStandard>stdcpp20</LanguageStandard>
162160
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
163-
<AdditionalOptions>/await</AdditionalOptions>
164161
</ClCompile>
165162
<ResourceCompile>
166163
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -183,11 +180,10 @@
183180
<FunctionLevelLinking>true</FunctionLevelLinking>
184181
<IntrinsicFunctions>true</IntrinsicFunctions>
185182
<SDLCheck>false</SDLCheck>
186-
<PreprocessorDefinitions>WIN32;NDEBUG;VISUALIZER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
183+
<PreprocessorDefinitions>VSDEBUGENG_USE_CPP11_SCOPED_ENUMS;WIN32;NDEBUG;VISUALIZER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
187184
<AdditionalIncludeDirectories>$(IntDir);..\cppwinrt;..\strings;$(DIASDKInc);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
188-
<LanguageStandard>stdcpp17</LanguageStandard>
185+
<LanguageStandard>stdcpp20</LanguageStandard>
189186
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
190-
<AdditionalOptions>/await</AdditionalOptions>
191187
</ClCompile>
192188
<ResourceCompile>
193189
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -213,11 +209,10 @@
213209
<FunctionLevelLinking>true</FunctionLevelLinking>
214210
<IntrinsicFunctions>true</IntrinsicFunctions>
215211
<SDLCheck>false</SDLCheck>
216-
<PreprocessorDefinitions>NDEBUG;VISUALIZER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
212+
<PreprocessorDefinitions>VSDEBUGENG_USE_CPP11_SCOPED_ENUMS;NDEBUG;VISUALIZER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
217213
<AdditionalIncludeDirectories>$(IntDir);..\cppwinrt;..\strings;$(DIASDKInc);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
218-
<LanguageStandard>stdcpp17</LanguageStandard>
214+
<LanguageStandard>stdcpp20</LanguageStandard>
219215
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
220-
<AdditionalOptions>/await</AdditionalOptions>
221216
</ClCompile>
222217
<ResourceCompile>
223218
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -243,11 +238,10 @@
243238
<FunctionLevelLinking>true</FunctionLevelLinking>
244239
<IntrinsicFunctions>true</IntrinsicFunctions>
245240
<SDLCheck>false</SDLCheck>
246-
<PreprocessorDefinitions>NDEBUG;VISUALIZER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
241+
<PreprocessorDefinitions>VSDEBUGENG_USE_CPP11_SCOPED_ENUMS;NDEBUG;VISUALIZER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
247242
<AdditionalIncludeDirectories>$(IntDir);..\cppwinrt;..\strings;$(DIASDKInc);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
248-
<LanguageStandard>stdcpp17</LanguageStandard>
243+
<LanguageStandard>stdcpp20</LanguageStandard>
249244
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
250-
<AdditionalOptions>/await</AdditionalOptions>
251245
</ClCompile>
252246
<ResourceCompile>
253247
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

strings/base_identity.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -458,12 +458,8 @@ namespace winrt::impl
458458
};
459459

460460
template <typename T>
461-
#ifdef __clang__
462-
inline static const auto name_v
463-
#else
464461
#pragma warning(suppress: 4307)
465462
inline constexpr auto name_v
466-
#endif
467463
{
468464
combine
469465
(

strings/base_meta.h

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,17 +117,22 @@ namespace winrt::impl
117117
static constexpr auto data{ category_signature<category_t<T>, T>::data };
118118
};
119119

120-
template <typename T>
121120
#if defined(__clang__)
121+
template <typename T>
122+
struct classic_com_guid
123+
{
122124
#if __has_declspec_attribute(uuid) && defined(WINRT_IMPL_IUNKNOWN_DEFINED)
123-
inline const guid guid_v{ __uuidof(T) };
125+
static constexpr guid value{ __uuidof(T) };
124126
#else
125-
inline constexpr guid guid_v{};
127+
static_assert(std::is_void_v<T> /* dependent_false */, "To use classic COM interfaces, you must compile with -fms-extensions and include <unknwn.h> before including C++/WinRT headers.");
126128
#endif
127-
#elif defined(_MSC_VER) && defined(WINRT_IMPL_IUNKNOWN_DEFINED)
128-
inline constexpr guid guid_v{ __uuidof(T) };
129+
};
130+
131+
template <typename T>
132+
inline constexpr guid guid_v = classic_com_guid<T>::value;
129133
#else
130-
inline constexpr guid guid_v{};
134+
template <typename T>
135+
inline constexpr guid guid_v{ __uuidof(T) };
131136
#endif
132137

133138
template <typename T>

test/test/generic_types.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,5 @@ TEST_CASE("generic_types")
88
REQUIRE_EQUAL_NAME(L"Windows.Foundation.Uri", Uri);
99
REQUIRE_EQUAL_NAME(L"Windows.Foundation.PropertyType", PropertyType);
1010
REQUIRE_EQUAL_NAME(L"Windows.Foundation.Point", Point);
11-
12-
// Clang 9 doesn't think this is a constant expression.
13-
#ifndef __clang__
1411
REQUIRE_EQUAL_NAME(L"Windows.Foundation.IStringable", IStringable);
15-
#endif
1612
}

test/test_win7/generic_types.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,5 @@ TEST_CASE("generic_types")
88
REQUIRE_EQUAL_NAME(L"Windows.Foundation.Uri", Uri);
99
REQUIRE_EQUAL_NAME(L"Windows.Foundation.PropertyType", PropertyType);
1010
REQUIRE_EQUAL_NAME(L"Windows.Foundation.Point", Point);
11-
12-
// Clang 9 doesn't think this is a constant expression.
13-
#ifndef __clang__
1411
REQUIRE_EQUAL_NAME(L"Windows.Foundation.IStringable", IStringable);
15-
#endif
1612
}

0 commit comments

Comments
 (0)