Workaround MSVC 16.1 bugs.

This commit is contained in:
John Preston 2019-05-22 16:28:45 +02:00
parent 288b7ba100
commit 626e7c1f76
2 changed files with 71 additions and 51 deletions

View File

@ -172,8 +172,7 @@ private:
}; };
template <typename Callback> template <typename Callback>
inline Fn<bool(crl::time)> Basic::Prepare(Callback &&callback) { Fn<bool(crl::time)> Basic__PrepareCrlTime(Callback &&callback) {
if constexpr (rpl::details::is_callable_plain_v<Callback, crl::time>) {
using Return = decltype(callback(crl::time(0))); using Return = decltype(callback(crl::time(0)));
if constexpr (std::is_convertible_v<Return, bool>) { if constexpr (std::is_convertible_v<Return, bool>) {
return std::forward<Callback>(callback); return std::forward<Callback>(callback);
@ -186,7 +185,10 @@ inline Fn<bool(crl::time)> Basic::Prepare(Callback &&callback) {
} else { } else {
static_assert(false_t(callback), "Expected void or bool."); static_assert(false_t(callback), "Expected void or bool.");
} }
} else if constexpr (rpl::details::is_callable_plain_v<Callback>) { }
template <typename Callback>
Fn<bool(crl::time)> Basic__PreparePlain(Callback &&callback) {
using Return = decltype(callback()); using Return = decltype(callback());
if constexpr (std::is_convertible_v<Return, bool>) { if constexpr (std::is_convertible_v<Return, bool>) {
return [callback = std::forward<Callback>(callback)](crl::time) { return [callback = std::forward<Callback>(callback)](crl::time) {
@ -200,6 +202,14 @@ inline Fn<bool(crl::time)> Basic::Prepare(Callback &&callback) {
} else { } else {
static_assert(false_t(callback), "Expected void or bool."); static_assert(false_t(callback), "Expected void or bool.");
} }
}
template <typename Callback>
inline Fn<bool(crl::time)> Basic::Prepare(Callback &&callback) {
if constexpr (rpl::details::is_callable_plain_v<Callback, crl::time>) {
return Basic__PrepareCrlTime(std::forward<Callback>(callback));
} else if constexpr (rpl::details::is_callable_plain_v<Callback>) {
return Basic__PreparePlain(std::forward<Callback>(callback));
} else { } else {
static_assert(false_t(callback), "Expected crl::time or no args."); static_assert(false_t(callback), "Expected crl::time or no args.");
} }
@ -233,8 +243,7 @@ inline Basic::~Basic() {
} }
template <typename Callback> template <typename Callback>
decltype(auto) Simple::Prepare(Callback &&callback) { decltype(auto) Simple__PrepareFloat64(Callback &&callback) {
if constexpr (rpl::details::is_callable_plain_v<Callback, float64>) {
using Return = decltype(callback(float64(0.))); using Return = decltype(callback(float64(0.)));
if constexpr (std::is_convertible_v<Return, bool>) { if constexpr (std::is_convertible_v<Return, bool>) {
return std::forward<Callback>(callback); return std::forward<Callback>(callback);
@ -247,7 +256,10 @@ decltype(auto) Simple::Prepare(Callback &&callback) {
} else { } else {
static_assert(false_t(callback), "Expected void or float64."); static_assert(false_t(callback), "Expected void or float64.");
} }
} else if constexpr (rpl::details::is_callable_plain_v<Callback>) { }
template <typename Callback>
decltype(auto) Simple__PreparePlain(Callback &&callback) {
using Return = decltype(callback()); using Return = decltype(callback());
if constexpr (std::is_convertible_v<Return, bool>) { if constexpr (std::is_convertible_v<Return, bool>) {
return [callback = std::forward<Callback>(callback)](float64) { return [callback = std::forward<Callback>(callback)](float64) {
@ -261,6 +273,14 @@ decltype(auto) Simple::Prepare(Callback &&callback) {
} else { } else {
static_assert(false_t(callback), "Expected void or bool."); static_assert(false_t(callback), "Expected void or bool.");
} }
}
template <typename Callback>
decltype(auto) Simple::Prepare(Callback &&callback) {
if constexpr (rpl::details::is_callable_plain_v<Callback, float64>) {
return Simple__PrepareFloat64(std::forward<Callback>(callback));
} else if constexpr (rpl::details::is_callable_plain_v<Callback>) {
return Simple__PreparePlain(std::forward<Callback>(callback));
} else { } else {
static_assert(false_t(callback), "Expected float64 or no args."); static_assert(false_t(callback), "Expected float64 or no args.");
} }

View File

@ -25,7 +25,7 @@
'DebugInformationFormat': '3', # Program Database (/Zi) 'DebugInformationFormat': '3', # Program Database (/Zi)
'WarnAsError': 'true', 'WarnAsError': 'true',
'AdditionalOptions': [ 'AdditionalOptions': [
'/std:c++latest', '/std:c++17',
'/permissive-', '/permissive-',
'/Qspectre', '/Qspectre',
'/MP', # Enable multi process build. '/MP', # Enable multi process build.