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

    <tr>
        <th>Summary</th>
        <td>
            [clang] Assertion hit in `CallExpr::getBeginLoc()`: `assert(HasFirstArg)` fails
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    I'm getting an assertion hit in `CallExpr::getBeginLoc()`:

```
clang-21: /freebsd/data/linux/git-net/llvm-project/clang/lib/AST/Expr.cpp:1660: SourceLocation clang::CallExpr::getBeginLoc() const: Assertion `HasFirstArg' failed.
```

A snippet of the stacktrace (I can send you the full one on request):

```
1.      /home/jan/git/ldgr/src/ldgr/args.cppm:290:20: current parser token ')'
2.      /home/jan/git/ldgr/src/ldgr/args.cppm:86:1: parsing namespace 'ldgr'
3.      /home/jan/git/ldgr/src/ldgr/args.cppm:204:1: parsing struct/union/class body 'ldgr::argument_option_impl'
4.      /home/jan/git/ldgr/src/ldgr/args.cppm:288:5: parsing function body 'ldgr::argument_option_impl::next_arg'
5.      /home/jan/git/ldgr/src/ldgr/args.cppm:288:5: in compound statement ('{}')
 #0 0x000055603d52b588 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /freebsd/data/linux/git-net/llvm-project/llvm/lib/Support/Unix/Signals.inc:804:13
 #1 0x000055603d529690 llvm::sys::RunSignalHandlers() /freebsd/data/linux/git-net/llvm-project/llvm/lib/Support/Signals.cpp:106:18
 #2 0x000055603d52bc01 SignalHandler(int, siginfo_t*, void*) /freebsd/data/linux/git-net/llvm-project/llvm/lib/Support/Unix/Signals.inc:0:3
 #3 0x00007fb403e558c0 __restore_rt libc_sigaction.c:0:0
 #4 0x00007fb403ea462c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x00007fb403e55822 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #6 0x00007fb403e3e4af abort ./stdlib/abort.c:81:7
 #7 0x00007fb403e3e3d7 _nl_load_domain.cold ./intl/loadmsgcat.c:1177:9
 #8 0x00007fb403e4e342 (/usr/lib/libc.so.6+0x38342)
 #9 0x000055603ffb696c clang::CallExpr::getBeginLoc() const /freebsd/data/linux/git-net/llvm-project/clang/lib/AST/Expr.cpp:1666:26
#10 0x000055603f7bd395 TryImplicitConversion(clang::Sema&, clang::Expr*, clang::QualType, bool, clang::Sema::AllowedExplicit, bool, bool, bool, bool) /freebsd/data/linux/git-net/llvm-project/clang/lib/Sema/SemaOverload.cpp:1795:10
#11 0x000055603f7ccb87 TryCopyInitialization(clang::Sema&, clang::Expr*, clang::QualType, bool, bool, bool, bool) /freebsd/data/linux/git-net/llvm-project/clang/lib/Sema/SemaOverload.cpp:5759:10
#12 0x000055603f7d09c8 clang::Sema::AddConversionCandidate(clang::CXXConversionDecl*, clang::DeclAccessPair, clang::CXXRecordDecl*, clang::Expr*, clang::QualType, clang::OverloadCandidateSet&, bool, bool, bool, bool) /freebsd/data/linux/git-net/llvm-project/clang/lib/Sema/SemaOverload.cpp:8160:7
#13 0x000055603f7c358e IsUserDefinedConversion(clang::Sema&, clang::Expr*, clang::QualType, clang::UserDefinedConversionSequence&, clang::OverloadCandidateSet&, clang::Sema::AllowedExplicit, bool) /freebsd/data/linux/git-net/llvm-project/clang/lib/Sema/SemaOverload.cpp:3978:13
#14 0x000055603f7f0296 TryUserDefinedConversion(clang::Sema&, clang::Expr*, clang::QualType, bool, clang::Sema::AllowedExplicit, bool, bool, bool, bool) /freebsd/data/linux/git-net/llvm-project/clang/lib/Sema/SemaOverload.cpp:1665:3
#15 0x000055603f7bd5b3 TryImplicitConversion(clang::Sema&, clang::Expr*, clang::QualType, bool, clang::Sema::AllowedExplicit, bool, bool, bool, bool) /freebsd/data/linux/git-net/llvm-project/clang/lib/Sema/SemaOverload.cpp:0:10
```

The problematic code in `args.cppm`:

```c++
286 
287     bool next_arg(std::string_view& current_arg, argument_input_iterator& in, ldgr::util::any_sentinel s) 
288     { 
289         ++in; 
290         if (in == s) {         // <----- it crashes here
291             throw args_parse_error{std::format("option '--{}' needs an argument", long_name_)}; 
292         } 
293 return this->set_result(current_arg, in, *in); 
294     }                   
```

This leads to the following function:

```c++
    template <std::sentinel_for<It> S>
    bool operator==(this input_iterator_ref self, const S& s)
    {
 return *self.it_ == s;
    }
```

i.e. a comparison operator with an explicit object parameter.

@HighCommander4 : I've seen that you have done some work in this area -- maybe this is another special case that must be added?

I can try to create a minimal example. At the moment I can workaround the crash by adding `&& getNumArgs() > 0` to the `if` statement.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWE1v4zjS_jXMhYhBk_ryIQfFiTEBBu87O-kB-iZQYllmt0RqSSqJ99cvipI_Ozuz3dO9gwVWMGCJIotVTz1VYpX0XrcG4I6k9yR9uJFj2Fl390nrt_2nm9qq_d0T4XlPWwhBm5ZKQ6X34IK2hu50oNpQkrG17LrHt8ERURJRthDuodXmZ9sQXhC-IhnDNyz-Mjb_WNl00rS3fElESQnfbB1A7RXhGyWDJHzTaTO-Eb5pdbg1EHCke-lvB2c_QYOPUUCcWBO-KZ8_EL5BPRbNMBBRLrO4MX22o2vgZ9vIqPe0Kqr6B4rTxhofUER5tJpk7CfpN9r5ULqW8Jxupe5ALa6MI6wsqTd6GCBQu6VhB9QH2XwOTjZACS-eaCMN9WAU3dsxTtiOXUetAWoNdfD3EXxA_N4Db7kgbEX4Zmd7IHzzSZoJKYRDtY7wjXfN6UG61iMsPRElXyEsPGLTjM6BCXSQzoOjwX4GQwnPcVueE1byb9-nyNAJuAtKR_4Y2YMfJvvzaQXuIf6ELSy53sQHN0Z6jEZbM9HEe4p0Pm4b_S1dO_ZgQmUHdG2l-6GbFEr-hEJFQUSZniu0HU0TufNvqhDfGHgLlYwMI6xMv4tC2tDG9oMdjUIuBsCtaeR6TvJ7kj_MnmcYkIJR9sYYY2maMaFSXqdFQTEEJw393k83vzhtwjNy-wNym_DiNMnJ18r64ED2hGeEr6k2yOlvC_go9xDvz-MwWIfDvxmNy551a2TnF9o0yL6JGWI2ZnllzCpbsfeM-XU0k5yfpFEdOD-ngu-p70HROU2xGCfFrCi_Rr1hS3qhEuFFBHFNvW612doqEF7i84vVKt7-B_DF9HEAV8w659s6YQLStGgYrSoHPlgHlQu003VTed3KGAmLgwA2C0guBcgk4w2tqiHsHEhVfdZdF2MjMnZK4wvCN2YIHeGb82lRdIKuz7NZePqFdpzT1kdropjplvDNIj7tvYLBo1zro-FOag9RMM-JKA9ys0u5AhK5pbK2LkxSg5qAjENxeYGJKp-X59fLhcppZbqqs1JVyvZSm0VjOxWlaRNNxXe9bxs5CVwuc9ToELHFpcgERMKn-N6M3h09i85YeLvICL9nb6IQCT9F_eqcf9ttna2y5qu_mT_qe46RwhF_jOiL_LTNayVWKf3g9k_90OlGh7U1L-B8_AgUZxY8Qy_nZHQ2Gm2awuhs9G-j7D7sB8Dh2tru6nUUFe_KrrOvoB7fpr3P57___40heonRZEr8-_8XcMiOA1j5Ko3JZQZreQlW09RFjmCt7bB_Mjpo2el_xMj6vmD9Jcanebo6N55fGq_Yqin-hRuVOtFmLY3SSga4hGT98eNpzgM03ZdI4GjZNOD9L1K7q5frjx9_hcY69f7aP8b2bPhg-FHVZ8Qt-8s9UCzj2TufHSCu2CfSAuiT_82De4CtNqC-d7CeDb-7yzMerw2eVq5l_w6kXxf5PxhiscqLwwkHMU4uMd4yvsowwn8gyP9dGTHL0vnMgnCl11-PtBb_-3rMWLFj9rwsaT_sgA7O1h30MuiGNlbB3AQ41RzvlfsN4ff4YyUvMhr_cooXmkNPxU7hg5pP5MFp01YvGl4Jzw6F6jRrTY-FkzbDGCodwMlgHc7UBiecaqwx6LmmkmZfeTBBG-iojyCiIkVUhOT30-OKHq5JZ22ImF6t2PGV3tJ4DKdEPBDxMEvL78_WbgjfUCLWt3hRHWjjpN-BpztwEMUt6fkVds6-omG-itV4Bc5ZR_L7IyRb63oZ4jmLTwUjVpO3t8fajRoA5WObZsaHcB7RsKatsPqu8KCXPxwt4ieF84dpSFAHYXSGhp32t0Q8egh4lB873PrKDxPYhJd4szqKTY4iv7zeY5X2tAOpPA12aoRYDIjz4vn3KBXRg37oZABE_MSh2dnV1joi1k-BiEf6TMTjvCiSzw4zd6InCS_QbnrJq8rBlnrotjGC4wn3Gbnm53PzxB-8m7EjvMTpCx2qE0XE_XHuw5co6AUsqIwVunTaW3PUjL7qsEOvwpwfqK0xoOkgnewhgFvM2CTsJ93u1rbvpVHgEopl_xPh-QtQD4A-lSG2m3byBaiyBqi3PdBX6z5jIEfbpQNJb29pL_c1TEM4amzYgaN-gEbLjjbSwySvH32gNVCpFCgiNpMyU38ruD06tXGAzpG010b3sqPwJrGeW9AyRI_3NjYjpkWojXSxT4HvYuDQeo8bICcQMszAGW0h_N_Yl649lunikSKkByKRjOktPh_7HYsbdSfUSqzkDdwt82QpkjTPs5vdXcKWdZo3XMpUZWmSCZYrxXO1TFS6VYm60Xec8ZQJli-XbCWyxUrUTdqwohCqaAoQJGHQS90tMO0urGtvtPcj3C0F4zm_6WQNnY_dVs7nVMxJ-nDj7mKersfWk4R12gd_EhF06GKLdlqRPpx1I7-yBxvzdFxMeHHRxsQJsZPpb0bX3e1CGGJDJGaxVofdWC8a25_1CC4_LNFOrJlnU1_u-D8DAAD__1CR0Tg">