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

    <tr>
        <th>Summary</th>
        <td>
            [clang-tidy] v16.0.0 bugprone-unchecked-optional-access crash with Eigen v3.3.4 matrix member
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          HannesFranke-smartoptics
      </td>
    </tr>
</table>

<pre>
    Dear clang team: I found a crash in 

```
$ clang-tidy --version
Ubuntu LLVM version 16.0.0
 Optimized build.
$ clang --version
Ubuntu clang version 16.0.0 (++20230324083102+1f9ea2d3f045-1~exp1~20230324083210.63)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
```

```
clang-tidy-16 -header-filter=.* -checks=-*,-readability-*,performance-*,modernize-*,misc-*,cppcoreguidelines-*,-cppcoreguidelines-pro-type-vararg,-cppcoreguidelines-pro-bounds-array-to-pointer-decay,bugprone-*,boost-* -p=./json /minimal/minimal.cpp
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: clang-tidy-16 -header-filter=.* -checks=-*,-readability-*,performance-*,modernize-*,misc-*,cppcoreguidelines-*,-cppcoreguidelines-pro-type-vararg,-cppcoreguidelines-pro-bounds-array-to-pointer-decay,bugprone-*,boost-* -p=./json /minimal/minimal.cpp
1.      <eof> parser at end of file
2. ASTMatcher: Processing 'bugprone-unchecked-optional-access' against:
 FunctionDecl main : </minimal/minimal.cpp:16:1, line:21:1>
--- Bound Nodes Begin ---
    T - { RecordType : std::vector<float> }
    fun - { FunctionDecl main : </minimal/minimal.cpp:16:1, line:21:1> }
--- Bound Nodes End ---
 #0 0x00007ffa40ca7f66 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/lib/x86_64-linux-gnu/libLLVM-16.so.1+0xfbaf66)
 #1 0x00007ffa40ca60a0 llvm::sys::RunSignalHandlers() (/lib/x86_64-linux-gnu/libLLVM-16.so.1+0xfb90a0)
 #2 0x00007ffa40ca8740 (/lib/x86_64-linux-gnu/libLLVM-16.so.1+0xfbb740)
 #3 0x00007ffa4af01420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #4 0x00007ffa493224fa (/usr/lib/llvm-16/bin/../lib/libclang-cpp.so.16+0x205e4fa)
 #5 0x00007ffa49320e33 clang::dataflow::transfer(clang::dataflow::StmtToEnvMap const&, clang::Stmt const&, clang::dataflow::Environment&) (/usr/lib/llvm-16/bin/../lib/libclang-cpp.so.16+0x205ce33)
 #6 0x00007ffa49324ef9 clang::dataflow::transferCFGBlock(clang::CFGBlock const&, clang::dataflow::AnalysisContext&, std::function<void (clang::CFGElement const&, clang::dataflow::TypeErasedDataflowAnalysisState const&)>) (/usr/lib/llvm-16/bin/../lib/libclang-cpp.so.16+0x2060ef9)
 #7 0x00007ffa493259dc clang::dataflow::runTypeErasedDataflowAnalysis(clang::dataflow::ControlFlowContext const&, clang::dataflow::TypeErasedDataflowAnalysis&, clang::dataflow::Environment const&, std::function<void (clang::CFGElement const&, clang::dataflow::TypeErasedDataflowAnalysisState const&)>) (/usr/lib/llvm-16/bin/../lib/libclang-cpp.so.16+0x20619dc)
 #8 0x0000556f9c3661ec 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&)>) (/usr/lib/llvm-16/bin/clang-tidy+0x99b1ec)
 #9 0x0000556f9c365ba0 clang::tidy::bugprone::UncheckedOptionalAccessCheck::check(clang::ast_matchers::MatchFinder::MatchResult const&) (/usr/lib/llvm-16/bin/clang-tidy+0x99aba0)
#10 0x0000556f9c91541b (/usr/lib/llvm-16/bin/clang-tidy+0xf4a41b)
#11 0x0000556f9c9463ac clang::ast_matchers::internal::BoundNodesTreeBuilder::visitMatches(clang::ast_matchers::internal::BoundNodesTreeBuilder::Visitor*) (/usr/lib/llvm-16/bin/clang-tidy+0xf7b3ac)
#12 0x0000556f9c914d88 (/usr/lib/llvm-16/bin/clang-tidy+0xf49d88)
#13 0x0000556f9c91777b (/usr/lib/llvm-16/bin/clang-tidy+0xf4c77b)
#14 0x0000556f9c9202bb (/usr/lib/llvm-16/bin/clang-tidy+0xf552bb)
#15 0x0000556f9c917f5b (/usr/lib/llvm-16/bin/clang-tidy+0xf4cf5b)
#16 0x0000556f9c8ea058 clang::ast_matchers::MatchFinder::matchAST(clang::ASTContext&) (/usr/lib/llvm-16/bin/clang-tidy+0xf1f058)
#17 0x00007ffa49aea62c clang::MultiplexConsumer::HandleTranslationUnit(clang::ASTContext&) (/usr/lib/llvm-16/bin/../lib/libclang-cpp.so.16+0x282662c)
#18 0x00007ffa47e911b2 clang::ParseAST(clang::Sema&, bool, bool) (/usr/lib/llvm-16/bin/../lib/libclang-cpp.so.16+0xbcd1b2)
#19 0x00007ffa49ab0a95 clang::FrontendAction::Execute() (/usr/lib/llvm-16/bin/../lib/libclang-cpp.so.16+0x27eca95)
#20 0x00007ffa49a2e604 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/usr/lib/llvm-16/bin/../lib/libclang-cpp.so.16+0x276a604)
#21 0x00007ffa49cc0eb4 clang::tooling::FrontendActionFactory::runInvocation(std::shared_ptr<clang::CompilerInvocation>, clang::FileManager*, std::shared_ptr<clang::PCHContainerOperations>, clang::DiagnosticConsumer*) (/usr/lib/llvm-16/bin/../lib/libclang-cpp.so.16+0x29fceb4)
#22 0x0000556f9ce588df (/usr/lib/llvm-16/bin/clang-tidy+0x148d8df)
#23 0x00007ffa49cc0bd4 clang::tooling::ToolInvocation::runInvocation(char const*, clang::driver::Compilation*, std::shared_ptr<clang::CompilerInvocation>, std::shared_ptr<clang::PCHContainerOperations>) (/usr/lib/llvm-16/bin/../lib/libclang-cpp.so.16+0x29fcbd4)
#24 0x00007ffa49cbfce4 clang::tooling::ToolInvocation::run() (/usr/lib/llvm-16/bin/../lib/libclang-cpp.so.16+0x29fbce4)
#25 0x00007ffa49cc23af clang::tooling::ClangTool::run(clang::tooling::ToolAction*) (/usr/lib/llvm-16/bin/../lib/libclang-cpp.so.16+0x29fe3af)
#26 0x0000556f9ce54c7b 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) (/usr/lib/llvm-16/bin/clang-tidy+0x1489c7b)
#27 0x0000556f9c1ee1c2 clang::tidy::clangTidyMain(int, char const**) (/usr/lib/llvm-16/bin/clang-tidy+0x8231c2)
#28 0x00007ffa3f7d1083 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24083)
#29 0x0000556f9c1e94de _start (/usr/lib/llvm-16/bin/clang-tidy+0x81e4de)
/minimal/minimal.cpp: terminated by signal 11
```

I managed to create a minimal test case:
```
$ wget https://gitlab.com/libeigen/eigen/-/archive/3.3.4/eigen-3.3.4.tar.bz2
$ tar x -f eigen-3.3.4.tar.bz2 --directory /opt
$ cd /opt/eigen-3dc3a0ea2d0773af4c0ffd7bbcb21c608e28fcef
$ mkdir build

$ cat json/compile_commands.json
[
    {
        "directory": "/minimal",
        "command": "/usr/bin/clang++ -isystem/opt/eigen-3dc3a0ea2d0773af4c0ffd7bbcb21c608e28fcef -g -DEIGEN_DONT_ALIGN_STATICALLY -Wall -Wextra -Wpedantic -Werror -Wshadow -Wfloat-conversion -Wno-format-security -fdiagnostics-absolute-paths -Wcovered-switch-default -Wimplicit-fallthrough -fdiagnostics-color=always -fPIC -Wno-covered-switch-default -fvisibility=hidden -fopenmp=libomp -std=gnu++17 -Winvalid-pch -o /minimal/minimal.o -c /minimal/minimal.cpp",
        "file": "/minimal/minimal.cpp"
 }
]
$ cat minimal.cpp
#include <Eigen/Dense>
#include <iostream>

struct Data
{
    std::optional<std::vector<float>> data;
    Eigen::Matrix4d mat;
};

namespace lib
{
 std::pair<Data, Data> func(Data&& full);
}

int main()
{
 const auto [a, b] = lib::func(Data{});
    std::cout << a.data.has_value() << std::endl;
    return 0;
}

$ run-clang-tidy -checks=bugprone-unchecked-optional-access -p=/minimal/json
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWlFv27iy_jXKCyFDomRZfsiDY8e7Adpt0WRPcZ-METmyuZVJgaSceB_Ob78gJduSE2fTNAc4uLhF4dgkNfPNN5zhUCQYI9YS8ToY3wTjxRU0dqP09e8gJZqlBvkDQ7MFbVVtBTNXheL76wWCJqwCuSYWYRskM3JHStVIToAwDWZDhCRBtAiiWfeZRd3_9idN2-dDK_iehOEOtRFKtr1_Fo20Dfn06V-fSddB4mwUjbqnyZfaiq34GzkpGlHx0ZnQC_LavqFAEtA8oDcBvaERTaKEplGexBEN6E1cThEoT8ooHYfxv_Gpjv_dG0TjaJQlAZ22Oh5Ar9E6Jp7ybJWlYc3CSsjmKVzLphuy0QicbBXHyg2slRFPbdedNBaqCvlCaNcV0GVjdECXhZAvE_hS44nRMM5IuEHgqMNSVBZ1kCxGAZ2RkG2Q_TBBsggDOgvoPHSgoBCVsPuuqUZdKr0FybBrcZi1FH8ffwvDuq-srpnSuG4Ex0pINAe5zztqrUK7rzHcgQa9vjyocFPJhKA17EOrwloJaVGHHBnsAzovmnWtlTygKZQyNvTW1a2dy7-Mko7FrZBiC9Xp24jVdcvW10-3s_tbYppiKywBUjRrorFW2hKryMba2gTJLKDLgC7Xwm6aYsTUNqDLqtod_ji0fyGzAV0KYxo0AV0SkJwIyaqGI7Eb7AKiAPbDamDYzdZ7C-wH4c22dlp8UzQi_t9XrdYatgT0utmitA4H-X_n_oxz447KIJmjKoPkltSgDWoClqDkRJWkFBW2g-mIzO4fPoNlG_Th91UrhsYIuSYBnRwBNdLzizx0yVBJqEJgbmBAJwTWIKSxR2eSZSOZG7VAVpEtuIToIjuZX0SezOLMfQR0ThxfQTKjsW9IbluhYRiSG59n_1AcDbnBtZAkDMNOJyHkgYQkmNyQb8iU5g_7Gr1eY7mDlsx2yKzSQTIvKwXWMRNMFqfHy0Z2Aj4W_0nLuQ23kvcsCGgSkegpiqJoUpaQRgwmZZYRH3TeALM37ZevWkjrw-jBxVVA89MgDY8rZax2qxPNHCAhbUCnbb5fVqII6LLL1Kc07TvcshPG2cioURzQm-ipLKDMsmOmdxDjM4hZBNFLEL818l6sJVS_g-QVauPVvxPFNIJogIKeocgnafQ-0cUkHYpO-qKhjOKURmS10mis0rjS9g16ausXPKcn8nriNKVDNWlfzTShNC2hk9yuf618n2rjrFsP6XI0OnWJos2MrK69RZlXRaMxpiUMlI3PlEWYJG1abZ3FwUJZqcf2l9UgTYk6oPnFMfd2ax_Urdx9hpow5cK_nWy9J9yYS31DabdyJ7SSLuP7odOPYoJhkgyYyM6YSLGc_jMT8-VvN5ViP4aMHFrfZuNMQrU3wsyVtPh0GH5MTmWXc4JkvlOCk2eqbit0_LxNmUt-txoM8kXXflB_b8FiT8jUZdgPIzyLsJwOCJ-cET6ecnYZt27kZeivzUfHqlbVslKPHcG_StRPzNmBqv9rHo2nnA08mnceHY-zcsqSLIuR9VaA26camUUeJPPnK--x5VBGBMn8oskvGvraA38eqpQvnfSZr1E-d9uOIJl9AmsFQ8eQI6nnLagqxeC_EeXh_6tR82z2vhvA7X8izF5V-d8VaP9Rf74rTE_7Hx-T02kR4zAkp2chOS4g6lvon_XfDhX9q9DnrrEd4fuHhIKxq227Y-hqPb9_WArJ_R7i0PANTVP1SX-XrVD0Sj9Xf0YDW6fxOI2LnxdcppDGxUBwPBScZgkMVqrndvvdm08P7pev7H1h_6ARbxpRHfnYCSNsu8sy_0Tmm4X-ywlV2u8V30FtOSkSYAMG6Bm1Kc_z91A75Xk-EJycCZ5MJu_yGZtMhj5Lh4JpRIv3CB6PaTEUPD5HXI7fh7gcDwVnA8E5QjTOX59lz6LLd8_uH4YzaXb_0C8t3zMj4jIaDx03rN4AIaODmPjcVFbUFT7NlTTN9oCw3fM9uOq5ApdZ_pTC_jLcN5QrOc0yOpzUed-ECU7juKB9E76CNviMzXvcQrdSFEpVp78fA7RgPC7oAOd0SHURwXTcx7nUji7JZ91a19ZayBqLg631LzI4QQbTcR8ZjYbIKGZR2kc2V9taVKj9q1zJcICtgzsg98yUD_T_JIMsSgfoBy8spoxFWAzQW6Uq8TKyJbiydX8ssu7kztWIrT3H8sNsQCNf1VYPq4QTLcen2pqzz4So8DNIWGObx3tVzSWxX-e_u8ABIVF_qVF7yea56IWAtVTGCnaMzbeuFG8geloyLIZED1cPHOc5L38-CcVpznNeDiQn5y4s-GUXPihV9Sl_yXdsA_pQmMzOq0Etdoc81rqwe-pt7rno9V9x7Mc5reBDpw1fQ7GiZPjT1H5k-pmWBcMhxPGZ92kC5UWIc9fucPbRvWbPIQd9ZGhgAsMJnJ2FRsomxcv1uW5ka4KPh_zFMccBw1dJFyk5TWK3tynA4GAndNq6z7SG_Tcs-1vg1Yo9PcVxt3sAI9jKWO2Fz10YDaa2a1hZDcKaQ_cr2-xD_3EzfkJyJ61ujNjhNyzn0n71sXLq3pVdbfRlh7qCvUuj93tjcdtJGq7Zfcn3Hrwz8j0lUpzmUzasQelk4NwYMWb0Zeeyg-M-gxOe-xfzc3KWjd5Xzuc0idmgoqD9yicpJzyO8oSsVm7erowF7QpNId_wOpu56d3N7jTKk4GW6Zn505QjaeW_w4oYU449-RfPW4hFvRUSLHJS7InxZw0kjl85M74jW7_UcmIVYRrBIgHSiSUWjSUMjC9fLp3cP67RPj8greB4QCoKFGt0lh3-hgFdgmYbscOALpNRMkoPvaH_NbKgR8Xf9KTFgiZPJCzJC6NIGHKh_fu0PQnoUtW2dweAH5qOGjhLIEKgPJpMEihTFpUlnxQFK2jMsihHmpcMy5OM7Q8udHu74NTYUwGW_GWU91271K2Y2m5BcjPy7e3I8c3pYC2Y9H74BkqPNgSUtsf-tO9sGtD5s2c6PYMnTncFurnUXmkgoTBtPngfHSRck3Bxe_fb7R-rxZc_HlazT3e__bG6f5g93M1nnz79Dwm_Q1WR8Ds-WQ0k_F4jB2kFc01aK03C72YDXD2S8Ls_bwyZkocbGOF3qUJ_Fm1Dg6zRwu5JWPJjyWZCKIyqGothDXZjSPidqR1q5KF5FJZtQo4lNJUl4XexrSvBhA1LqCq70apZb86EMVW5jLuA6hH2hoTl17t5C-KS1HInjGhPz4NksRGcoyRhqWqU2zpIFpUo1LYmoU_sC58pHO_xxAGSO6gED2u2IaF6-bhakZBdPsh-2f_-2PrF6XL-cPdi7HDuGowXwwn87NA8oMnh3kKQzG-70F2gNHg8gR6OEYcz1mO3_zRWN8wSt9B2zf3J_9KL5cvH00FyS7gTlPREtNgOLwa0eEo52brhNwd9i9N3_ylhi6YGhsSl4DNQR-01CKfbA6fz1oDklpSNZAHN2-YsoBkpm6ryby97CnvahLT-yLwtCs_V-VWOQGMVCcY3XlMRjBckSBYe3fF97kHn5MbJ76kb0MhUY_25fDInMHJcjTZgVjuomuOmuO09PoKSVwNhGm2jJYkuGeTmjG5k2L-0dbxs8s8XJNq7G4PJ2kuTwxXmil8nfJpM4Qqv4yyPojwdT-KrzXWU0JRnaZKPWQ5ZjtmElYzHfALjcQnj4kpcd_ezpnEUTZN4lCSszGHMSihpzKMsSCPcgqhGbgEeKb2-8rd2rrN4kudXFRRYGX8RjlKJj8R3ukgaL670tV-0i2ZtgjSqhLHmJMUKW_kbdL2FfLwgu-6O2Rv4ae8IPQq7aec22fn1zk1qLZ7IFrcF6qtGV9fvv5jkrfzfAAAA___H7Bv1">