Clang не хочет канпелять MSVC-шный код
От: пффф  
Дата: 04.05.23 16:15
Оценка:
Привет!

Есть шаблон с таким началом:
template<typename THandle, THandle InvalidHandleValue, auto Deleter>
class WinHandle_t

Далее, определяются основные типы хэндлов с их инвалидом и делетером:
using WinHandle      = WinHandle_t<HANDLE, INVALID_HANDLE_VALUE, &CloseHandle>;


Кланг не хочет это кушать:
C:\work\project\src/Common\WinHandle.h:43:44: error: non-type template argument is not a constant expression
using WinHandle      = WinHandle_t<HANDLE, INVALID_HANDLE_VALUE, &CloseHandle>;
                                           ^~~~~~~~~~~~~~~~~~~~
C:\Program Files (x86)\Windows Kits\10\Include\10.0.20348.0\um\handleapi.h:27:30: note: expanded from macro 'INVALID_HANDLE_VALUE'
#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)


Это можно как-то поправить без правки сорцов? Ключик совместимости какой ему подсунуть? О себе он так говорит:
clang -cc1 version 13.0.1 based upon LLVM 13.0.1 default target x86_64-pc-windows-msvc
Re: Clang не хочет канпелять MSVC-шный код
От: T4r4sB Россия  
Дата: 04.05.23 17:12
Оценка:
Здравствуйте, пффф, Вы писали:


П>#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)


А LONG_PTR как определено?
Re[2]: Clang не хочет канпелять MSVC-шный код
От: пффф  
Дата: 04.05.23 17:38
Оценка:
Здравствуйте, T4r4sB, Вы писали:

П>>#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)


TB>А LONG_PTR как определено?


Как-то так наверное: https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/bbcfb0af-8349-4e98-ad26-957e1363f714

Или вот так оно в хидерах:
    typedef _W64 long LONG_PTR, *PLONG_PTR;
    typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;


но это я в студии нашел, а что откуда кланг берёт, не факт, что оттуда же
Re[3]: Clang не хочет канпелять MSVC-шный код
От: T4r4sB Россия  
Дата: 04.05.23 17:51
Оценка:
Здравствуйте, пффф, Вы писали:

https://godbolt.org/z/Yqqh4f5he

Я кажется понял
Если HANDLE определить как unsigned long то всё компилится. А если как указатель, то вот так вот
Re: Clang не хочет канпелять MSVC-шный код
От: reversecode google
Дата: 04.05.23 18:48
Оценка:
#define HANDLE std::intptr_t
Re[4]: Clang не хочет канпелять MSVC-шный код
От: reversecode google
Дата: 04.05.23 18:50
Оценка:
промахнулся, ну ладно
https://rsdn.org/forum/cpp.applied/8521067.1
Автор: reversecode
Дата: 04.05.23
Re: Clang не хочет канпелять MSVC-шный код
От: PM  
Дата: 05.05.23 08:00
Оценка: 3 (1)
Здравствуйте, пффф, Вы писали:

...

П>Это можно как-то поправить без правки сорцов? Ключик совместимости какой ему подсунуть? О себе он так говорит:

П>
clang -cc1 version 13.0.1 based upon LLVM 13.0.1 default target x86_64-pc-windows-msvc


Похоже что нет, и в библиотеке WIL от MS обошли это введением дополнительного уровня абстракции в виде разных polices, типа handle_invalid_resource_policy: https://github.com/microsoft/wil/blob/57a57cd7ebaa8092f2056ebfdac6a367cf0bc928/include/wil/resource.h#L2519-L2526:

        template <typename close_fn_t, close_fn_t close_fn>
        struct handle_invalid_resource_policy : resource_policy<HANDLE, close_fn_t, close_fn, details::pointer_access_all, HANDLE, INT_PTR, -1, HANDLE>
        {
            __forceinline static bool is_valid(HANDLE ptr) WI_NOEXCEPT { return ((ptr != INVALID_HANDLE_VALUE) && (ptr != nullptr)); }
        };
Re[4]: Clang не хочет канпелять MSVC-шный код
От: пффф  
Дата: 05.05.23 08:42
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Я кажется понял

TB>Если HANDLE определить как unsigned long то всё компилится. А если как указатель, то вот так вот

Да, у некоторых компилеров есть такая проблема. Но вроде ULONG_PTR объявлен как unsigned long (для 32х бит), и MSVC канпеляет без вопросов
Re[2]: Clang не хочет канпелять MSVC-шный код
От: пффф  
Дата: 05.05.23 08:42
Оценка:
Здравствуйте, reversecode, Вы писали:

R>#define HANDLE std::intptr_t


SDK поправить?
Re[2]: Clang не хочет канпелять MSVC-шный код
От: пффф  
Дата: 05.05.23 08:43
Оценка:
Здравствуйте, PM, Вы писали:

PM>Похоже что нет, и в библиотеке WIL от MS обошли это введением дополнительного уровня абстракции в виде разных polices, типа handle_invalid_resource_policy: https://github.com/microsoft/wil/blob/57a57cd7ebaa8092f2056ebfdac6a367cf0bc928/include/wil/resource.h#L2519-L2526:


Но MSVC компилирует, как есть, без каких-либо варнингов
Re[3]: Clang не хочет канпелять MSVC-шный код
От: reversecode google
Дата: 05.05.23 08:51
Оценка:
если код не кросплатформенный то можете попробовать clang-cl.exe
а так да
только править или переписывать
потому что нет каста между void* и long long для таких случаев
https://wandbox.org/permlink/zkjlTq5Tty7GmxoZ
https://godbolt.org/z/KMT6jqf5a

у мс компилера свои заморочки

собственно вы не первый кто пытается бороться с этим
Re[3]: Clang не хочет канпелять MSVC-шный код
От: PM  
Дата: 05.05.23 09:00
Оценка:
Здравствуйте, пффф, Вы писали:

П>Но MSVC компилирует, как есть, без каких-либо варнингов


Может с какими-то включёнными опциями расширенний языка? Емнип, MSVC раньше что-то такое использовал (и даже с 4-м уровнем предупреждений не мог компилировать заголовки из Windows SDK).

А constexpr не помогает? Что-то вроде
constexpr HANDLE MY_INVALID_HANDLE = INVALID_HANDLE_VALUE;
using WinHandle = WinHandle_t<HANDLE, MY_INVALID_HANDLE, &CloseHandle>;
Re[4]: Clang не хочет канпелять MSVC-шный код
От: reversecode google
Дата: 05.05.23 09:02
Оценка:
PM>constexpr HANDLE MY_INVALID_HANDLE = INVALID_HANDLE_VALUE;

это не скомпилится
выше пример приводил
собственно вы написали тоже самое что пытается сделать компиль в шаблоне
Re[4]: Clang не хочет канпелять MSVC-шный код
От: пффф  
Дата: 05.05.23 10:02
Оценка:
Здравствуйте, PM, Вы писали:

PM>Может с какими-то включёнными опциями расширенний языка? Емнип, MSVC раньше что-то такое использовал (и даже с 4-м уровнем предупреждений не мог компилировать заголовки из Windows SDK).


Может и так.

PM>А constexpr не помогает? Что-то вроде

PM>
PM>constexpr HANDLE MY_INVALID_HANDLE = INVALID_HANDLE_VALUE;
PM>using WinHandle = WinHandle_t<HANDLE, MY_INVALID_HANDLE, &CloseHandle>;
PM>


Ну, проект собирается студийным компилером, я просто на нем гоняю тулзы на базе шланга, из-за этого код мне менят не дадут. Это раз. Во-вторых, constexpr не гарантирует, что выражение будет обязательно вычислено в компайлтайм. И если сейчас кланг не может это сделать, то почему бы он смог бы это сделать, если мы просто обмажем это дополнительными constexpr'ами?
Re[5]: Clang не хочет канпелять MSVC-шный код
От: K13 http://akvis.com
Дата: 07.05.23 07:08
Оценка:
П>constexpr не гарантирует, что выражение будет обязательно вычислено в компайлтайм
Как это? если слева от = стоит constexpr и при этом не может посчитать то что справа в compile-time, будет ошибка компиляции.
Собралось без ошибок-- значит, посчиталось при компиляции.
Re[6]: Clang не хочет канпелять MSVC-шный код
От: пффф  
Дата: 10.05.23 07:56
Оценка:
Здравствуйте, K13, Вы писали:

П>>constexpr не гарантирует, что выражение будет обязательно вычислено в компайлтайм

K13>Как это? если слева от = стоит constexpr и при этом не может посчитать то что справа в compile-time, будет ошибка компиляции.
K13>Собралось без ошибок-- значит, посчиталось при компиляции.

Да, перепутал с constexpr функциями
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.