@@ -3066,6 +3066,13 @@ template <typename... A, typename... B> constexpr bool collides(ctll::list<A...>
30663066
30673067#endif
30683068
3069+ // remove me when MSVC fix the constexpr bug
3070+ #ifdef _MSC_VER
3071+ #ifndef CTRE_MSVC_GREEDY_WORKAROUND
3072+ #define CTRE_MSVC_GREEDY_WORKAROUND
3073+ #endif
3074+ #endif
3075+
30693076namespace ctre {
30703077
30713078// calling with pattern prepare stack and triplet of iterators
@@ -3292,7 +3299,11 @@ constexpr CTRE_FORCE_INLINE R evaluate(const Iterator begin, Iterator current, c
32923299
32933300// (gready) repeat
32943301template <typename R, typename Iterator, typename EndIterator, size_t A, size_t B, typename ... Content, typename ... Tail>
3302+ #ifdef CTRE_MSVC_GREEDY_WORKAROUND
3303+ constexpr inline void evaluate_recursive (R & result, size_t i, const Iterator begin, Iterator current, const EndIterator end, R captures, ctll::list<repeat<A,B,Content...>, Tail...> stack) {
3304+ #else
32953305constexpr inline R evaluate_recursive (size_t i, const Iterator begin, Iterator current, const EndIterator end, R captures, ctll::list<repeat<A,B,Content...>, Tail...> stack) {
3306+ #endif
32963307 if ((B == 0 ) || (i < B)) {
32973308
32983309 // a*ab
@@ -3303,12 +3314,23 @@ constexpr inline R evaluate_recursive(size_t i, const Iterator begin, Iterator c
33033314 // if I uncomment this return it will not fail in constexpr (but the matching result will not be correct)
33043315 // return inner_result
33053316 // I tried to add all constructors to R but without any success
3317+ #ifdef CTRE_MSVC_GREEDY_WORKAROUND
3318+ evaluate_recursive (result, i+1 , begin, inner_result.get_end_position (), end, inner_result.unmatch (), stack);
3319+ if (result) {
3320+ return ;
3321+ }
3322+ #else
33063323 if (auto rec_result = evaluate_recursive (i+1 , begin, inner_result.get_end_position (), end, inner_result.unmatch (), stack)) {
33073324 return rec_result;
33083325 }
3326+ #endif
33093327 }
33103328 }
3329+ #ifdef CTRE_MSVC_GREEDY_WORKAROUND
3330+ result = evaluate (begin, current, end, captures, ctll::list<Tail...>());
3331+ #else
33113332 return evaluate (begin, current, end, captures, ctll::list<Tail...>());
3333+ #endif
33123334}
33133335
33143336// (gready) repeat optimization
@@ -3338,8 +3360,13 @@ constexpr CTRE_FORCE_INLINE R evaluate(const Iterator begin, Iterator current, c
33383360 return not_matched;
33393361 }
33403362 }
3341-
3363+ #ifdef CTRE_MSVC_GREEDY_WORKAROUND
3364+ R result;
3365+ evaluate_recursive (result, i, begin, current, end, captures, stack);
3366+ return result;
3367+ #else
33423368 return evaluate_recursive (i, begin, current, end, captures, stack);
3369+ #endif
33433370#ifndef CTRE_DISABLE_GREEDY_OPT
33443371 } else {
33453372 // if there is no collision we can go possessive
0 commit comments