Skip to content

infinite loop while building a dfa #80

Description

@nakrakiiya

Version: latest in vcpkg (2024.12)
Compiler: Microsoft (R) C/C++ Optimizing Compiler Version 19.42.34435 for x64 (latest msvc)

Code to reproduce:

#include <ctpg/ctpg.hpp>
#include <utility>

constexpr char id_pattern[] = "[_A-Za-z][_A-Za-z0-9]*";
constexpr ctpg::regex_term<id_pattern> id("identifier");

constexpr char function_like_name_with_lparen_pattern[] = "[_A-Za-z][_A-Za-z0-9]*\\(";
constexpr ctpg::regex_term<function_like_name_with_lparen_pattern> function_like_name_with_lparen("function_like_name_with_lparen");

constexpr ctpg::nterm<std::string> line("line");

constexpr ctpg::parser parser(
    line,
    terms(function_like_name_with_lparen, id),
    nterms(line),
    rules(line(id) >= std::identity {}));

Fail to compile with message:

C:\PROGRA~1\MIB055~1\2022\ENTERP~1\VC\Tools\MSVC\1442~1.344\bin\Hostx64\x64\cl.exe  /nologo /TP -D_CRT_SECURE_NO_WARNINGS -ID:\source\expand\src\utils -external:ID:\source\expand\out\build\Debug\vcpkg_installed\x64-windows\include -external:W0 /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++latest -MDd -Zi -utf-8 -W4 /showIncludes @expand\CMakeFiles\expand.dir\bug.cpp.obj.modmap /Foexpand\CMakeFiles\expand.dir\bug.cpp.obj /Fdexpand\CMakeFiles\expand.dir\ /FS -c D:\source\expand\src\expand\bug.cpp
D:\source\expand\src\expand\bug.cpp(12): error C2131: expression did not evaluate to a constant
D:\source\expand\out\build\Debug\vcpkg_installed\x64-windows\include\ctpg/ctpg.hpp(1293): note: failure was caused by evaluation exceeding call depth limit of 512 (/constexpr:depth<NUMBER>)
D:\source\expand\src\expand\bug.cpp(12): note: the call stack of the evaluation (the oldest call first) is
D:\source\expand\src\expand\bug.cpp(12): note: while evaluating function 'ctpg::parser<ctpg::nterm<std::string>,std::tuple<ctpg::regex_term<& function_like_name_with_lparen_pattern>,ctpg::regex_term<& id_pattern>>,std::tuple<ctpg::nterm<std::string>>,std::tuple<ctpg::detail::rule<false,std::identity,ctpg::nterm<std::string>,ctpg::regex_term<& id_pattern>>>,ctpg::use_generated_lexer>::parser(ctpg::nterm<std::string>,std::tuple<ctpg::regex_term<& function_like_name_with_lparen_pattern>,ctpg::regex_term<& id_pattern>>,std::tuple<ctpg::nterm<std::string>>,std::tuple<ctpg::detail::rule<false,std::identity,ctpg::nterm<std::string>,ctpg::regex_term<& id_pattern>>> &&)'
D:\source\expand\out\build\Debug\vcpkg_installed\x64-windows\include\ctpg/ctpg.hpp(1869): note: while evaluating function 'void ctpg::parser<ctpg::nterm<std::string>,std::tuple<ctpg::regex_term<& function_like_name_with_lparen_pattern>,ctpg::regex_term<& id_pattern>>,std::tuple<ctpg::nterm<std::string>>,std::tuple<ctpg::detail::rule<false,std::identity,ctpg::nterm<std::string>,ctpg::regex_term<& id_pattern>>>,ctpg::use_generated_lexer>::create_lexer<0,1>(std::integer_sequence<size_t,0,1>)'
D:\source\expand\out\build\Debug\vcpkg_installed\x64-windows\include\ctpg/ctpg.hpp(2858): note: while evaluating function 'void ctpg::regex::add_term_data_to_dfa<10,ctpg::parser<ctpg::nterm<ctpg::regex::create_regex_parser::slice>,std::tuple<ctpg::custom_term<ctpg::regex::create_regex_parser::<lambda_1>>,ctpg::custom_term<ctpg::regex::char_subset (__cdecl *)(std::string_view)>,ctpg::char_term,ctpg::char_term,ctpg::char_term,ctpg::char_term,ctpg::char_term,ctpg::char_term,ctpg::char_term,ctpg::char_term>,std::tuple<ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::size32_t>>,std::tuple<ctpg::detail::rule<false,std::nullptr_t,ctpg::nterm<ctpg::size32_t>,ctpg::custom_term<ctpg::regex::create_regex_parser::<lambda_1>>>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_2>,ctpg::nterm<ctpg::size32_t>,ctpg::nterm<ctpg::size32_t>,ctpg::custom_term<ctpg::regex::create_regex_parser::<lambda_1>>>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_3>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::custom_term<ctpg::regex::create_regex_parser::<lambda_1>>>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_4>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::custom_term<ctpg::regex::char_subset (__cdecl *)(std::string_view)>>,ctpg::detail::rule<false,ctpg::ftors::element<2,std::integer_sequence<size_t,0>>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::char_term,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::char_term>,ctpg::detail::rule<false,std::nullptr_t,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_5>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::char_term>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_6>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::char_term>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_7>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::char_term>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_8>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::char_term,ctpg::nterm<ctpg::size32_t>,ctpg::char_term>,ctpg::detail::rule<false,std::nullptr_t,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_9>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>>,ctpg::detail::rule<false,std::nullptr_t,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_10>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::char_term,ctpg::nterm<ctpg::regex::create_regex_parser::slice>>,ctpg::detail::rule<false,std::nullptr_t,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>>>,ctpg::use_lexer<ctpg::regex::regex_lexer>>,23>(const ctpg::regex::regex_pattern_data<23> &,ctpg::regex::dfa_builder<10> &,const Parser &,ctpg::size16_t)'
        with
        [
            Parser=ctpg::parser<ctpg::nterm<ctpg::regex::create_regex_parser::slice>,std::tuple<ctpg::custom_term<ctpg::regex::create_regex_parser::<lambda_1>>,ctpg::custom_term<ctpg::regex::char_subset (__cdecl *)(std::string_view)>,ctpg::char_term,ctpg::char_term,ctpg::char_term,ctpg::char_term,ctpg::char_term,ctpg::char_term,ctpg::char_term,ctpg::char_term>,std::tuple<ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::size32_t>>,std::tuple<ctpg::detail::rule<false,std::nullptr_t,ctpg::nterm<ctpg::size32_t>,ctpg::custom_term<ctpg::regex::create_regex_parser::<lambda_1>>>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_2>,ctpg::nterm<ctpg::size32_t>,ctpg::nterm<ctpg::size32_t>,ctpg::custom_term<ctpg::regex::create_regex_parser::<lambda_1>>>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_3>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::custom_term<ctpg::regex::create_regex_parser::<lambda_1>>>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_4>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::custom_term<ctpg::regex::char_subset (__cdecl *)(std::string_view)>>,ctpg::detail::rule<false,ctpg::ftors::element<2,std::integer_sequence<size_t,0>>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::char_term,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::char_term>,ctpg::detail::rule<false,std::nullptr_t,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_5>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::char_term>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_6>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::char_term>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_7>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::char_term>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_8>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::char_term,ctpg::nterm<ctpg::size32_t>,ctpg::char_term>,ctpg::detail::rule<false,std::nullptr_t,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_9>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>>,ctpg::detail::rule<false,std::nullptr_t,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>>,ctpg::detail::rule<false,ctpg::regex::create_regex_parser::<lambda_10>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::char_term,ctpg::nterm<ctpg::regex::create_regex_parser::slice>>,ctpg::detail::rule<false,std::nullptr_t,ctpg::nterm<ctpg::regex::create_regex_parser::slice>,ctpg::nterm<ctpg::regex::create_regex_parser::slice>>>,ctpg::use_lexer<ctpg::regex::regex_lexer>>
        ]
D:\source\expand\out\build\Debug\vcpkg_installed\x64-windows\include\ctpg/ctpg.hpp(1392): note: while evaluating function 'ctpg::regex::dfa_builder<10>::slice ctpg::regex::dfa_builder<10>::alt(ctpg::regex::dfa_builder<10>::slice,ctpg::regex::dfa_builder<10>::slice)'
D:\source\expand\out\build\Debug\vcpkg_installed\x64-windows\include\ctpg/ctpg.hpp(1275): note: while evaluating function 'void ctpg::regex::dfa_builder<10>::merge(ctpg::size_t,ctpg::size_t,bool,bool)'
D:\source\expand\out\build\Debug\vcpkg_installed\x64-windows\include\ctpg/ctpg.hpp(1315): note: while evaluating function 'void ctpg::regex::dfa_builder<10>::merge(ctpg::size_t,ctpg::size_t,bool,bool)'
D:\source\expand\out\build\Debug\vcpkg_installed\x64-windows\include\ctpg/ctpg.hpp(1315): note: while evaluating function 'void ctpg::regex::dfa_builder<10>::merge(ctpg::size_t,ctpg::size_t,bool,bool)'
D:\source\expand\out\build\Debug\vcpkg_installed\x64-windows\include\ctpg/ctpg.hpp(1315): note: while evaluating function 'void ctpg::regex::dfa_builder<10>::merge(ctpg::size_t,ctpg::size_t,bool,bool)'
D:\source\expand\out\build\Debug\vcpkg_installed\x64-windows\include\ctpg/ctpg.hpp(1315): note: while evaluating function 'void ctpg::regex::dfa_builder<10>::merge(ctpg::size_t,ctpg::size_t,bool,bool)'
D:\source\expand\out\build\Debug\vcpkg_installed\x64-windows\include\ctpg/ctpg.hpp(1315): note: while evaluating function 'void ctpg::regex::dfa_builder<10>::merge(ctpg::size_t,ctpg::size_t,bool,bool)'
D:\source\expand\out\build\Debug\vcpkg_installed\x64-windows\include\ctpg/ctpg.hpp(1315): note: while evaluating function 'void ctpg::regex::dfa_builder<10>::merge(ctpg::size_t,ctpg::size_t,bool,bool)'
D:\source\expand\out\build\Debug\vcpkg_installed\x64-windows\include\ctpg/ctpg.hpp(1315): note: while evaluating function 'void ctpg::regex::dfa_builder<10>::merge(ctpg::size_t,ctpg::size_t,bool,bool)'
D:\source\expand\out\build\Debug\vcpkg_installed\x64-windows\include\ctpg/ctpg.hpp(1315): note: while evaluating function 'void ctpg::regex::dfa_builder<10>::merge(ctpg::size_t,ctpg::size_t,bool,bool)'
... (same as above)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions