<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/62085>62085</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            clang-tidy with bugprone-unchecked-optional-access freezes on CDDA codebase
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          andrei8l
      </td>
    </tr>
</table>

<pre>
    `clang-tidy` freezes on certain files of a large C++17 project.

Reproduction steps:
1.`git clone --depth 1 https://github.com/CleverRaven/Cataclysm-DDA.git cdda`
2.`cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -S cdda -B build`
3.`clang-tidy -p build cdda/src/monstergenerator.cpp`
=> clang-tidy freezes

If I add `-bugprone-unchecked-optional-access,` to `.clang-tidy` the problem goes away and clang-tidy finishes in ~2 minutes.

<details>
<summary>gdb backtrace for clang-tidy 16, sampled after ~20 minutes</summary>

```gdb
Thread 1 (Thread 0x7ff72cc3d280 (LWP 954311) "clang-tidy"):
#0  0x0000557ab812b814 in clang::dataflow::WatchedLiteralsSolverImpl::solve() && ()
#1 0x0000557ab812af7e in clang::dataflow::WatchedLiteralsSolver::solve(llvm::DenseSet<clang::dataflow::BoolValue*, llvm::DenseMapInfo<clang::dataflow::BoolValue*, void> >) ()
#2 0x0000557ab811a1ad in clang::dataflow::DataflowAnalysisContext::querySolver(llvm::DenseSet<clang::dataflow::BoolValue*, llvm::DenseMapInfo<clang::dataflow::BoolValue*, void> >) ()
#3 0x0000557ab811a400 in clang::dataflow::DataflowAnalysisContext::flowConditionImplies(clang::dataflow::AtomicBoolValue&, clang::dataflow::BoolValue&) ()
#4  0x0000557ab810c9fc in clang::dataflow::UncheckedOptionalAccessModel::merge(clang::QualType, clang::dataflow::Value const&, clang::dataflow::Environment const&, clang::dataflow::Value const&, clang::dataflow::Environment const&, clang::dataflow::Value&, clang::dataflow::Environment&) ()
#5 0x0000557ab8122ae8 in clang::dataflow::Environment::join(clang::dataflow::Environment const&, clang::dataflow::Environment::ValueModel&) ()
#6  0x0000557ab81268d2 in clang::dataflow::transferCFGBlock(clang::CFGBlock const&, clang::dataflow::AnalysisContext&, std::function<void (clang::CFGElement const&, clang::dataflow::TypeErasedDataflowAnalysisState const&)>) ()
#7 0x0000557ab81273f0 in clang::dataflow::runTypeErasedDataflowAnalysis(clang::dataflow::ControlFlowContext const&, clang::dataflow::TypeErasedDataflowAnalysis&, clang::dataflow::Environment const&, std::function<void (clang::CFGElement const&, clang::dataflow::TypeErasedDataflowAnalysisState const&)>) ()
#8 0x0000557ab75f068c in llvm::Expected<std::vector<std::optional<clang::dataflow::DataflowAnalysisState<clang::dataflow::UncheckedOptionalAccessModel::Lattice> >, std::allocator<std::optional<clang::dataflow::DataflowAnalysisState<clang::dataflow::UncheckedOptionalAccessModel::Lattice> > > > > clang::dataflow::runDataflowAnalysis<clang::dataflow::UncheckedOptionalAccessModel>(clang::dataflow::ControlFlowContext const&, clang::dataflow::UncheckedOptionalAccessModel&, clang::dataflow::Environment const&, std::function<void (clang::CFGElement const&, clang::dataflow::DataflowAnalysisState<clang::dataflow::UncheckedOptionalAccessModel::Lattice> const&)>) ()
#9  0x0000557ab75f00e0 in clang::tidy::bugprone::UncheckedOptionalAccessCheck::check(clang::ast_matchers::MatchFinder::MatchResult const&) ()
#10 0x0000557ab952e20d in clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor::MatchVisitor::visitMatch(clang::ast_matchers::BoundNodes const&) ()
#11 0x0000557ab955ba5c in clang::ast_matchers::internal::BoundNodesTreeBuilder::visitMatches(clang::ast_matchers::internal::BoundNodesTreeBuilder::Visitor*) ()
#12 0x0000557ab952dc2e in clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor::matchWithFilter(clang::DynTypedNode const&) ()
#13 0x0000557ab9530510 in clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor::TraverseDecl(clang::Decl*) ()
#14 0x0000557ab9538a5b in clang::RecursiveASTVisitor<clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor>::TraverseTranslationUnitDecl(clang::TranslationUnitDecl*) ()
#15 0x0000557ab9530d0c in clang::ast_matchers::internal::(anonymous namespace)::MatchASTVisitor::TraverseDecl(clang::Decl*) ()
#16 0x0000557ab9504ccb in clang::ast_matchers::MatchFinder::matchAST(clang::ASTContext&) ()
#17 0x0000557ab87aa91c in clang::MultiplexConsumer::HandleTranslationUnit(clang::ASTContext&) ()
#18 0x0000557ab89c9ebd in clang::ParseAST(clang::Sema&, bool, bool) ()
#19 0x0000557ab8772427 in clang::FrontendAction::Execute() ()
#20 0x0000557ab86ea094 in clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) ()
#21 0x0000557ab8189193 in clang::tooling::FrontendActionFactory::runInvocation(std::shared_ptr<clang::CompilerInvocation>, clang::FileManager*, std::shared_ptr<clang::PCHContainerOperations>, clang::DiagnosticConsumer*) ()
#22 0x0000557ab8153fd4 in clang::tidy::runClangTidy(clang::tidy::ClangTidyContext&, clang::tooling::CompilationDatabase const&, llvm::ArrayRef<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, llvm::IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem>, bool, bool, llvm::StringRef)::ActionFactory::runInvocation(std::shared_ptr<clang::CompilerInvocation>, clang::FileManager*, std::shared_ptr<clang::PCHContainerOperations>, clang::DiagnosticConsumer*) ()
#23 0x0000557ab8188ee6 in clang::tooling::ToolInvocation::runInvocation(char const*, clang::driver::Compilation*, std::shared_ptr<clang::CompilerInvocation>, std::shared_ptr<clang::PCHContainerOperations>) ()
#24 0x0000557ab8187e4b in clang::tooling::ToolInvocation::run() ()
#25 0x0000557ab818aa7a in clang::tooling::ClangTool::run(clang::tooling::ToolAction*) ()
#26 0x0000557ab814eef1 in clang::tidy::runClangTidy(clang::tidy::ClangTidyContext&, clang::tooling::CompilationDatabase const&, llvm::ArrayRef<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, llvm::IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem>, bool, bool, llvm::StringRef) ()
#27 0x0000557ab746e199 in clang::tidy::clangTidyMain(int, char const**) ()
#28 0x00007ff72c83c790 in __libc_start_call_main (main=main@entry=0x557ab7469900 <main>, argc=argc@entry=4, argv=argv@entry=0x7fff9b573488) at ../sysdeps/nptl/libc_start_call_main.h:58
#29 0x00007ff72c83c84a in __libc_start_main_impl (main=0x557ab7469900 <main>, argc=4, argv=0x7fff9b573488, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fff9b573478) at ../csu/libc-start.c:360
#30 0x0000557ab746981a in _start ()
```

</details>

Tried it with clang-tidy 15 from my distro
```
clang-tidy --version
LLVM (http://llvm.org/):
  LLVM version 15.0.7
  Optimized build.
  Default target: x86_64-pc-linux-gnu
  Host CPU: znver3
```
and clang-tidy 16 from [this release](https://github.com/llvm/llvm-project/releases/tag/llvmorg-16.0.0)
```
~/clang16/bin/clang-tidy --version
LLVM (http://llvm.org/):
  LLVM version 16.0.0
  Optimized build.
```

Operating system:
```
DISTRIB_ID="Arch"
DISTRIB_RELEASE="rolling"
DISTRIB_DESCRIPTION="Arch Linux"
```
Also tried it in a Fedora 38 VM
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWl1z4jjW_jXKjQrKlrGxL3JBDLyTepNONsn07B0l5GPQtCyxkkyHuZjfviXbgG0IncxUtrpqt6o7xvo45zznS0eSqTF8JQGuUXiDwukVLe1a6WsqMw08FldLle2uUeQxQeVqYHm2Q5GHcw3wBxisJGagLeUS51y4hhxTLKheAU4RuUHkxh_jjVa_A7ND5E2RN6n_PsFGq6xkliuJjYWNQUHT5Q9R5K24xUwoCXgwyGBj19jHa2vrYWSOyHzF7bpcDpkqEJmnAragn-gWpHujljKxM8VgOp0MK1JZRlHk1QyIY8AK-g3wYJreT_5_tpj98_Hh6WWRPtw_3t7N3PN-8mX6jILpwxc8eK7m48ENXpZcZAdCwbCjGTzY1ANqdmRuNENkXihpLOgVSNDUKj1km82BBAqmKJjhFpFGt21l3eb4FtMswyjyBstytdFKwqCUbA3sG2QDtXFqpGJAGQNjEEmdkaxy44ddy9k1OHssBRR4pcBg-p3uMJVZRwQuuVmDwVziPwkuuCwtmI79UJBmYCkXBgWzQ5Mpi4LqHQpmq2yJl5R9s5oywLnSbfp-hEiKDS02AjJMcwsa_0m8PSMUpE55B1odvpFX_1tly7rlZa2BZtjHiMTNb-91nOdjwliQkdhzHXe_PeIkHAW-j0iCESEtrRCCSHLwPkQCD2Pv1fM8LwzHdBn7ZBn7I6eLapIbGUwyamku1Pf67Tdq2RqyO25BU2GeldiCvi02ou427h2RuOYdIRLh-u3A0u9xpPkYPs6xy02IbVG3TEEaeAaLgvRNgjdKia9UlIDIxFmnN_uebm5lrj5CYat45nzbWbAC3kFMuoh96tPsIuJp8zaRVOwMN6mSFl5t3fmvEvSuUcLPjjzoIx953l9H7jpSJTPuUoBzOQ4GkfhNYhOrCs5aElex-B5o0Rkso16oeCzJ2UUwv-6z1kOTtCZVzrpXGTTRUrhc2YXwj5KKl90GLopaiYmZy7Y_QjWTW66VLEDa9034dNofoHreEmEvgxAK8UVDtClWDb8rLi95zoeBnXCokNaWPosh6ifeKM7IRRBWU2ly0On8_26EYt-68u9b3yduP7zq4cZmTaCVsqpWUJC6-MYnrGYC3q8b580zTQ1k_eh-ttS2XS05n0XGPVWNg_xyFtGlfJvpJbs7fWgl5nWicar5uxD_agj9rLaI27YYh7kXxVUSPK4ks9cNMAuZq5H2ILbArNLtln0dd2mtOSvipQk_Trh31FrO4LBitRRNhVCM_oxidv5fcvoT5_vLQsw-I0ousvy54uRzbfrDKEtwP8w86Ke8qqCvfu23SRclSV1jPaLq7-qHGrsoqjpbm7rl3r3Nucz2tXbV8ASmFG0dnojue23Rk5AA8frV7ik3Li3oKs4m1a43plLJXaFKgyUtwGwog2br0kgyeX75yg2v4vXQ2GnZupeq-UdYb1Qpsy8qA3MRmd9FFi5p2C8Af4TsyOlFA9y4HTSciNuvav8G0b1CXLF-Coj0TJUx0t-KfYapKnq_cbuec2GrXUyL4XRXrd0VnovWCLrCB17o90PkM4R_0XQL2sAUmOhJXrWcVfSoJ2tMw2VP1idgpTZ8C22G6SeCmXXxvLjyUlCXMn6V3J7COzvgLNqwb5nM-2ic_McsE3Vl9UaM9S3zjtxYNPJ02U6eX9oF9inzbmE7pjTx-4q6L4XlGwGvqZKmLPYMf6EyE32bfZB7p5SLE5bAsp-oH6k2cILrGQraLKBLpcTxecoj6SIckxEZ93jMtZNSZpNm-a5rSGClPZ4jdY9TOitMHAH1kv6ZVaqKDRegb6WxVDLokG04dTD1pDirMdI7uooTPwn6q7JSgp8nOqeuCN4dqrVbuXUFZy3KoY4xa6ohW2xsL_yPiA6z6gK2DYILuKeSrkA3xzM_JPuY_uK8hHIJ-mEDuqJsTklPOV1JZSxnB0c8G1Ckd9gVBnnWN86xctGlTF37S3U4GZ8dcxjQ3ay-pfNaTxUMV8QtqekeZhw3KhOt6e4J8na9v1iw11ffb-oqajhbGKsr4ilbU93RqWtYWE25NfvuC3uKph-39h5HWW6l1aXL_k-Qp9I-VmY6dm_zJvM8bEELunOGft4ZC0VDqRuHbcrPlfgO5j55_jd5Y-8AMo4BoksR-6KUaGM6pxxnyL1LTfq7CM0Ph9MtT3wv_jfV-nc0d6qVUU8rYxj1F733aOWN9Nw7nospHdNL1OsAd47bInxJlH2OPmvxqMt9BJD7_8s_P0f-OTFWpwAajyLwk-RNY7G9Ie5pdXrLpa0M0Q3Hs06xL3Xqu7I4YOOk2issFoIvnYqptgtGhVgUlEs33T1RMK0eIw-kdaly6r3uJU0Sz8MoSOtxlQ6oXjEUTKvHccqo6drWXdsOtXGe58kyHAejuAolavFwiMjc7EwGG4PIXG6sQGR-TszhGgWTMD6iTPoo4xE9QelmLnixES2U74HVxtEXPMXclZ_BFAWp2lhe8D8gw6q0DYmcS_52r7YiW1weYixl3xYgsx7zcUdrzJSNqgYV1iFDwSQ4XD-TIPB6_pbEfq2hanzXbfa3r72rYETmJ7fB9eWs5pBhbvF3btedK-AQ51oVuNjhjBur1VkG7bv1gdvHuBRX9dzdfb13oq2t3aD9JwEuwIZKr6q345UuxtXoZj72w6E3HO-7Hg6ara7uh_v2KeS0FBZbqldgUTDBr3G0iEaDDRsILsvXwUqW-8G_KGNx-virG_aH3IIOzsLpXbP7Ua0DFN7YNTdYgwBqAIXTBtgbHztUeaR-DJpvKxCZN7NdfFi6avqVXg38aOgNvbds-KfzESeTHyEyX7okMv8ctddiXFT7Wf9qVm65wqbJrv1vAerX6e3zy9PtzeJ26mKGkIlma0RIt_NpdjebPM_qEVqJao3qD5rOntOn28eX24cvR1L4zln9MLbHfCKMwnbv7VxiiueQKU1xEOOv91fZdZAlQUKv4NqPYp-MkzAMr9bXWcQSz6femI39mHhREGQBXebUgygejzJ2xa-JRwJv5BMv8sIwHHpJQMZkRBnLYyDByOXOgnIx3JvhihtTwnVEvDi8EnQJwlRf9xAi4TuuOh2KcHqlrysfWpYrg0ae4MaaIxXLrYDrlitUIfzjr0_aHwel0-kEM5WBW_GvSi2uP-zWlbzOqSs8_w4AAP__FoFAWA">