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

    <tr>
        <th>Summary</th>
        <td>
            [Microsoft codegen] `__thiscall` function with non-trivially-destructible first arg crashes
        </td>
    </tr>

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

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

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

<pre>
    https://godbolt.org/z/ofozszdr7

Compiled with `clang++ --target=i686-win32`

```c++
struct A { ~A(); };

void __thiscall f(A) {}
```

```
clang-18: /llvm-project/llvm/include/llvm/IR/DataLayout.h:652: llvm::TypeSize llvm::StructLayout::getElementOffset(unsigned int) const: Assertion `Idx < NumElements && "Invalid element idx!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: /cmake-build-debug/bin/clang-18 -cc1 -triple i686-unknown-windows-msvc19.33.0 -emit-obj -mincremental-linker-compatible -dumpdir a- -disable-free -clear-ast-before-backend -main-file-name this_call_non_trivial.cpp -mrelocation-model static -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -target-cpu pentium4 -tune-cpu generic -fdebug-compilation-dir=/llvm/llvm-project -fcoverage-compilation-dir=/llvm-project -resource-dir /cmake-build-debug/lib/clang/19 -internal-isystem /cmake-build-debug/lib/clang/19/include -fdeprecated-macro -ferror-limit 19 -fno-use-cxa-atexit -fms-extensions -fms-compatibility -fms-compatibility-version=19.33 -std=c++14 -fskip-odr-check-in-gmf -fdelayed-template-parsing -fcxx-exceptions -fexceptions -fcolor-diagnostics -faddrsig -o /tmp/-1f0735.o -x c++ this_call_non_trivial.cpp
1.      <eof> parser at end of file
2.      this_call_non_trivial.cpp:3:17: LLVM IR generation of declaration 'f'
3.      this_call_non_trivial.cpp:3:17: Generating code for declaration 'f'
 #0 0x000055b8540c3c6d llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /llvm-project/llvm/lib/Support/Unix/Signals.inc:723:11
 #1 0x000055b8540c415b PrintStackTraceSignalHandler(void*) /llvm-project/llvm/lib/Support/Unix/Signals.inc:798:1
 #2 0x000055b8540c21c6 llvm::sys::RunSignalHandlers() /llvm-project/llvm/lib/Support/Signals.cpp:105:5
 #3 0x000055b8540c4915 SignalHandler(int) /llvm-project/llvm/lib/Support/Unix/Signals.inc:413:1
 #4 0x00007fd2c1e2c520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #5 0x00007fd2c1e809fc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #6 0x00007fd2c1e809fc __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #7 0x00007fd2c1e809fc pthread_kill ./nptl/pthread_kill.c:89:10
 #8 0x00007fd2c1e2c476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #9 0x00007fd2c1e127f3 abort ./stdlib/abort.c:81:7
#10 0x00007fd2c1e1271b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#11 0x00007fd2c1e23e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
#12 0x000055b85262222e llvm::StructLayout::getElementOffset(unsigned int) const /llvm/include/llvm/IR/DataLayout.h:0:5
#13 0x000055b854745ba9 clang::CodeGen::CGBuilderTy::CreateStructGEP(clang::CodeGen::Address, unsigned int, llvm::Twine const&) /llvm-project/clang/lib/CodeGen/CGBuilder.h:224:51
#14 0x000055b854729dc5 clang::CodeGen::CodeGenFunction::EmitFunctionProlog(clang::CodeGen::CGFunctionInfo const&, llvm::Function*, clang::CodeGen::FunctionArgList const&) /llvm-project/clang/lib/CodeGen/CGCall.cpp:3018:11
#15 0x000055b85478eeb9 clang::CodeGen::CodeGenFunction::StartFunction(clang::GlobalDecl, clang::QualType, llvm::Function*, clang::CodeGen::CGFunctionInfo const&, clang::CodeGen::FunctionArgList const&, clang::SourceLocation, clang::SourceLocation) /llvm-project/clang/lib/CodeGen/CodeGenFunction.cpp:1186:68
#16 0x000055b854790d70 clang::CodeGen::CodeGenFunction::GenerateCode(clang::GlobalDecl, llvm::Function*, clang::CodeGen::CGFunctionInfo const&) /llvm-project/clang/lib/CodeGen/CodeGenFunction.cpp:1463:7
#17 0x000055b85449cbeb clang::CodeGen::CodeGenModule::EmitGlobalFunctionDefinition(clang::GlobalDecl, llvm::GlobalValue*) /llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:5862:3
#18 0x000055b8544931ec clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::GlobalDecl, llvm::GlobalValue*) /llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:4074:12
#19 0x000055b854498909 clang::CodeGen::CodeGenModule::EmitGlobal(clang::GlobalDecl) /llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:3785:5
#20 0x000055b8544918ea clang::CodeGen::CodeGenModule::EmitTopLevelDecl(clang::Decl*) /llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:6754:5
#21 0x000055b854ff032d (anonymous namespace)::CodeGeneratorImpl::HandleTopLevelDecl(clang::DeclGroupRef) /llvm-project/clang/lib/CodeGen/ModuleBuilder.cpp:189:73
#22 0x000055b854fde5c0 clang::BackendConsumer::HandleTopLevelDecl(clang::DeclGroupRef) /llvm-project/clang/lib/CodeGen/CodeGenAction.cpp:205:8
#23 0x000055b858a4915d clang::ParseAST(clang::Sema&, bool, bool) /llvm-project/clang/lib/Parse/ParseAST.cpp:167:11
#24 0x000055b8555a9881 clang::ASTFrontendAction::ExecuteAction() /llvm-project/clang/lib/Frontend/FrontendAction.cpp:1194:1
#25 0x000055b854fe3568 clang::CodeGenAction::ExecuteAction() /llvm-project/clang/lib/CodeGen/CodeGenAction.cpp:1183:5
#26 0x000055b8555a929c clang::FrontendAction::Execute() /llvm-project/clang/lib/Frontend/FrontendAction.cpp:1082:7
#27 0x000055b8554c8e6a clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /llvm-project/clang/lib/Frontend/CompilerInstance.cpp:1062:23
#28 0x000055b8557813de clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /llvm-project/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:278:8
#29 0x000055b852231911 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /llvm-project/clang/tools/driver/cc1_main.cpp:232:13
#30 0x000055b852224332 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) /llvm-project/clang/tools/driver/driver.cpp:215:5
#31 0x000055b85222309b clang_main(int, char**, llvm::ToolContext const&) /llvm-project/clang/tools/driver/driver.cpp:256:5
#32 0x000055b852256985 main /cmake-build-debug/tools/clang/tools/driver/clang-driver.cpp:17:3
#33 0x00007fd2c1e13d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#34 0x00007fd2c1e13e40 call_init ./csu/../csu/libc-start.c:128:20
#35 0x00007fd2c1e13e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#36 0x000055b852222b25 _start (/cmake-build-debug/bin/clang-18+0x59f3b25)
clang++: error: unable to execute command: Aborted
clang++: error: clang frontend command failed due to signal (use -v to see invocation)
clang version 19.0.0git (https://github.com/llvm/llvm-project.git c229f767e48c7190b7568e6ebd1688bb08795744)
Target: i686-unknown-windows-msvc
Thread model: posix
InstalledDir: /cmake-build-debug/bin
Build config: +unoptimized, +assertions
clang++: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang++: note: diagnostic msg: /tmp/-5e89b8.cpp
clang++: note: diagnostic msg: /tmp/-5e89b8.sh
clang++: note: diagnostic msg:

********************
```

```sh
# Crash reproducer for clang version 19.0.0git (https://github.com/llvm/llvm-project.git c229f767e48c7190b7568e6ebd1688bb08795744)
# Driver args: "--driver-mode=g++" "--target=i686-win32" "this_call_non_trivial.cpp"
# Original command: "/cmake-build-debug/bin/clang-18" "-cc1" "-triple" "i686-unknown-windows-msvc19.33.0" "-emit-obj" "-mincremental-linker-compatible" "-dumpdir" "a-" "-disable-free" "-clear-ast-before-backend" "-main-file-name" "this_call_non_trivial.cpp" "-mrelocation-model" "static" "-mframe-pointer=all" "-fmath-errno" "-ffp-contract=on" "-fno-rounding-math" "-mconstructor-aliases" "-target-cpu" "pentium4" "-tune-cpu" "generic" "-fdebug-compilation-dir=/llvm/llvm-project" "-fcoverage-compilation-dir=/llvm/llvm-project" "-resource-dir" "/cmake-build-debug/lib/clang/19" "-internal-isystem" "/cmake-build-debug/lib/clang/19/include" "-fdeprecated-macro" "-ferror-limit" "19" "-fno-use-cxa-atexit" "-fms-extensions" "-fms-compatibility" "-fms-compatibility-version=19.33" "-std=c++14" "-fskip-odr-check-in-gmf" "-fdelayed-template-parsing" "-fcxx-exceptions" "-fexceptions" "-fcolor-diagnostics" "-faddrsig" "-o" "/tmp/-1f0735.o" "-x" "c++" "this_call_non_trivial.cpp"
 "/cmake-build-debug/bin/clang-18" "-cc1" "-triple" "i686-unknown-windows-msvc19.33.0" "-emit-obj" "-mincremental-linker-compatible" "-dumpdir" "a-" "-disable-free" "-clear-ast-before-backend" "-main-file-name" "this_call_non_trivial.cpp" "-mrelocation-model" "static" "-mframe-pointer=all" "-fmath-errno" "-ffp-contract=on" "-fno-rounding-math" "-mconstructor-aliases" "-target-cpu" "pentium4" "-tune-cpu" "generic" "-fdebug-compilation-dir=/llvm/llvm-project" "-fcoverage-compilation-dir=/llvm/llvm-project" "-fdeprecated-macro" "-ferror-limit" "19" "-fno-use-cxa-atexit" "-fms-extensions" "-fms-compatibility" "-fms-compatibility-version=19.33" "-std=c++14" "-fskip-odr-check-in-gmf" "-fdelayed-template-parsing" "-fcxx-exceptions" "-fexceptions" "-fcolor-diagnostics" "-faddrsig" "-x" "c++" "-5e89b8.cpp"
```

The first argument is supposed to be a pointer, but it is not here.

MSVC seems to compile it fine. I don't know if it silently rewrites `__thiscall` to `__cdecl` or what. It does properly call the destructor too.

In a similar situation where a function can't be `__thiscall` because it has variadic arguments <https://godbolt.org/z/cKr9dWKb3>:

```c++
void __thiscall g(...) {}
```

Clang has an error that `g` can't be `__thiscall`. Maybe that's what needs to happen for non-pointer first args?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsek1z2zjy96eBLyiqSFB8O-Qgy1bGtc4mT-ydPapAsClhQwIsAPRLDs9n_xdAUiQVyS9Zb81lplJjsQE0ft1odDeAplrznQD4hKJLFF1d0Nbspfr0hRtarfRe_rjIZfH8aW9Mo1G4QmSDyGYni1xWZiHVDpHNT0Q2spQ_9c9CJci_Qv6q-_9a1g2voMCP3Owxin1WUbFD5BKRS-x5hqodGBRe8TiNvUcuQoJif8rAfrp_rBvUUbVRLTN4hVFyif__CpEUkQyFlxglVyi8nDJ4kLzA263Zc81oVeESkXSFSGaH2t7zWU5O3X065F6QonCFEdlU1UPtNUr-B5jpPxHZcMGqtoCRcPMdkc0VNfSWPsvWLPYoXMURsUxcj3CFwtX9cwN3_CdMSHdOwm5QR9mBua6gBmG-lqUGg0jaCrdyBebCWJGYFNr2xiutQRkuhVX5TfGEUbjG_2zrnoHGiMSIxBgRciMeaMULDF0T5sUTIgEiBJEEl9Qu3qJTwLfb69XdNdZtXnODKc7bHVbQSGWwkfjIPLjZt_mCyXpUxZHGuNYtaEQ2mAorgVMcNnvATFG9xzllP4yiDBBZ40ZBoyQDraHAWraqI9uRVGvJODVQYNUKrJnijekh3xnKfuCirRuLzJH8BXb_fVNyp2iNqdq1Tif9urKa_gAvb3lVeAXkrTXvnAvb0hsA9hgLsGcUbyrAznJb8UPIR2EtuJCP2qv1AwuyRRgufOxBzY0n8_9gr-aCKadmWnkVFz9AeUzWDTU8rwB7FmjBFaYe9gquaV6BVyoA7LEKqPKoNl4OpVTgWe2AKLBXUy68klfgCVpb_XG9tYa-FVJsjeIPnFYL1jTYqxVUklFrFl4tC6iwNtRwhr26VLQGr5FcGFAovLIbxStravYeKCUk9sqy8ZgUdkHsfpUCe6WQnpKtKLjYebYv9mpngdZypfJoxakGjftd7rGmxQ0Iw9t6iT3TCnCkHQhQFkXp1O0UwqsOZsEtmtMmhL2SyQdQdAfnx4ydFXRmY9vPrXPF82GdEdkEGfacQgStPK6ftYH6rSNHV-DkahQwa6FeTZmy2gSlpPIqbneSncfqstXgsSfqUQNP3IpXaw-eDAjNpdDd92AtvOLm-QTJewBlu6Pwytkf9rQpUHjVe89gib1S_-CNJwvlsT2wHx4X3q4uHcyKPkPhGaibihrwGqo0Fzur6KcnD54YNKaHMvtgspLKKzjdCakNZ5ZGi0JpvsOetCozdYPIxgtKPwmjhcTeE-4RnTfYbrsG_XZF4RpkicJrbFGBwtRga_-yxNb4u86k73yeZ7gKUbgKErvZb2___IJvvncG6GzHciuAVbT_RCQpEekDWvgu5p97pmKHmSwAl1KdZ40RCX3sP_m-70dRnkZLn4UsLibxQD_r7sc3xYVxfu2-c47p2EnRx63URgGtnYNfD4HhbLzq7PaubawbR2TzL8GfLIHvBK30gguGwlVCnFzBCDY4ArsMohwfIet4_EFFUYFCJLWBGJHVB8DJbAyeoCFHaEjA4lOq-96KGSjd5Q1vhzPg6BY78CMUrqIRR3islSyI8LEaPmRFlkE4V8GynzopC8ICICwiPnbi9Qyf0ngbL23QaZ-8nWi7BrbQchEjcuk_LUlEfJtFHXhGc56pn5UMb7eN2SugxfYHr6otr5sub-iseoHIRjSmQmQz7bZwmJd27eKRf_wW_r3_fZFz4uzBHzknpzhPh73ILs2O2KXHyl0mMd5ptyKOU_cTkc3CfT3rAhqb2TRSu8VTlGtwvIl1DhMdZHPWAUnKENPc5lSOlSm65XOkDl1gJe4zVBIG_i8cghxvRbWtJC22hbT5gePFhRPXkmu9Y7RjFwSJhZSNDIMjaUPI4veZUphBFh9MyfKc7VASE0LIxyS7-J2ptz_uWItrvmOTZZTTDHdR3MFYywI-g-g_Pl_amA_q_rknKKAGOvCfr78hkp4buioKBVpbjzwXYz09BTxyAX0Ob733KScxZBjdSgxzkM0Bm5OSELvXomAUdDkXlGQFi84L2n1sWsGMyyUs8brmZqB8U7KSuxfkXX8eut6IUk5kmsp74G-DwvosmqHbSu1uuTa_raA1rQ5h2nfHuGCioGiuoBQgf8ESTinozlBlRpmmuvlcyZxWV8CqI0H_X0sre_j7LcW8oOT363I25s5lyrf9YeGVxnetwlxxQyAN0ti6xXRcjni-HJlfJP77lqNPwMA2vrQaH6f2D1DEMg7n3j2Z6WGZsRzy1_TwRRZtBeOu7eQdprqCkgv-mo2OWunof9KqhbPZ2ytSdoB6GaM0Ji5TPsiYHskYBsB-T8a_Wraln1jHG5BRuOxIuDTzX_Urp4U7L9J_CztM0mgWF4l_hDpIgb4X9b1sbuEBeoxT7B3lA_QdJ9FyDnx-MClLPySFTV6okOK5lq3GgtagG3dyymb4rbeQ6qZuqo7cpewvS_FZybb5DuX7ROlkGAJ2v_Vd1pmM24LMTzVlARGbucDL7gZoLYVua1D_a9D9r9XUXxF3AhrdNpnlUym1B6BiivmbPbuv7u7noO6gpn0QyqWsxr-v43MMh7-ru_tBm3Eyj-9klgBFEc3SNJgiW93db5QUBkSxmmY9T8BaA6shqL8F08Bn8nM1D3fZcjy9WXDz5KOEMIrTE9vtvwX28mIGQRrON1N8rDOSzRzzCwr7KFX5KZkFRDILiNGSpRAfeSb34KBuhDZUMDitrfNCvC2QT3AfT3hA7sIcmWzoWZyLkjQIC5hC70GODB8OOVb6koRv86QD5Hu3szZnJxu2tjtUT7b2LJARG9mCADMWbO0Bc3YLtVKKPlv_Eq7ZnqohQ1qh8NrlVTMaWeMXL4YGIYyUlT1SF4o_gLIN_dQD3tCqOxjVPb9QI4Qsw5DgQex10OlhAvuuplX1J7BDEDiB_ugEY3msrVqf3nos-UWM7scgRDCPw_N7NkJI6Gd9-jeovT9FWqhOh6v_McIoniOcn-xJFGdphN2dw5mb8oH_-YV1zyyzWd2V6mRpw6M7j7DIfLzdVjxnW22PYd397OHqg-n218uZ_vrn1CB3iI7cETEeZ10ezwpLH7sxNuk8nqj7abl7jnt320JSFzZHptEppjNRTklxknmYZPO1iY-sh-Qkwh3X_kLn9ccud6ETZWWYk-hwpTN5xEXhCrvHDPujFTSvABuJodtnmMm6pqJwb5K5VAaKlzk4Oi57XzUM798hcdE65v3NGyJpqwF7D44GgPnEY06R4v5RBAfZwl_4O-7Ef9-D5cKOYoRkZRInsExZEmR-nkRxCjHkRRCnaZ77aZJFyXJ5mP6-f99enX8m7Du6O0jsnuVs9-7m0DU5P19VUFxx9cobpevv8kq72Uu-6_pftkI2htf8JxTWPSBySYcHYn1yPYQ0NnLi8U0H13p3eEMdPM1v_Zu8sPcvyqv7-9X6D3z_xzXefL29_frvm39-xpub2-s7fP_VkS__9Rl_v_729fv9AcO3Uy_CqbbO7eyr8KGDAuyeQqHA1BxYvlUJkxetCNIsT8fnqt9nofe_tRIftR4vFkAM2BAJ8do9zjvlFy0D5V62_uJtZnFduYCBqdr1L_nE64OIe-xG4dWgVUK61lPFJ13b-Sc-Mh7t8VfFd9w6oomTc3UTb3KrHQjGguFnV0_Qf71WVTAMGmoLhu-XKwyGXn2dQf9JvQN9UnNwQHim8uAw46z-4A0K7EYd1yL0DV1FwqHXibqEoW1SnXAgHdcoHBqOKxUOE5yoVzisx6FqoacMtQuHDn0FQ__d1zEc5nxfNcNh2Os1DWdGTgscetqbixU6DsfFDu_lMj7BHFQwL3w4NEzKH3raiOLXUohxyacFEVPqrAbibMNxccTQ8ahE4jD-ZKHERLjT5RLjSs6KJkbZfyX9UkBxaOnLKIZvOS7JUUnF0OOp_8Fmzu51h_a35_rbc_1VnutvP_HRfuK0F5hmq4dE5lTid78HXHKlzaE6EnONdds00mbbRuIcMMWDdZM1zluDueslpMF7ULCYMvxy9-faHtFqbQd39gF2QMkFLPANLqzJJwZbt4F5aZs0r0CY6hkreFTcgMYo9sdCXhT7lpejsQKYI0iFH_fULPCNwYUEjRslG1DVszunu-LSAoZtg42UM5Q3AlOsec0rqrDmpu2KWh6tOJjisn9Bw4x2YHP4FVIOjNpTKTd4TzV-oIrTgrOxzBSjcP1aKTX7h8qKf_8jD1F4fZzqn6yHPi5y3iGSLhaLN5U5r13ubsFS0R3EsdlTY0XbWYlekHaBv9DnHFx_RBLtlI8FQOHWeU-bBoQ7IAgpBmc4WpZG4eai-BQWWZjRC_gUJMGSBGEakIv9J7L0kzSkflyUSZyzIiVhkYSxT4KSZmlaXvBPxCdLf0mSwA_9gCyCNAgTKCHLkySO8hgtfagprxbW51jtXriS40-ZH4bxRUVzqLSreSdEwCN2jXZfRFcX6pPzU3m702jpV1wbPXIx3FSuWP4LZ0pqWRpX4rcDgaKrXy3iYDauBN4qoo8q1bM3GKMr_z3opSuABn3Rquq47P4dddVOzv8LAAD__3W6w7g">