<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/160583>160583</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[Clang] Crash on UO Real/Imag on scalar with type promotion
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang,
crash-on-valid
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
AmrDeveloper
</td>
</tr>
</table>
<pre>
This valid code crashes when compiling any clang version with `-triple x86_64-unknown-linux-gun`
```c++
void real_on_scalar_with_type_promotion() {
_Float16 _Complex a;
_Float16 b = __real__(__real__ a);
}
void imag_on_scalar_with_type_promotion() {
_Float16 _Complex a;
_Float16 b = __real__(__imag__ a);
}
```
Crash
```
Assertion failed: (isa<T>(CanonicalType)), function castAs, file TypeBase.h, line 9170.
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: ./bin/clang++ -cc1 -std=c++20 -triple x86_64-unknown-linux-gun -emit-llvm main.cpp -o main_original.ll
1. main.cpp:6:1: current parser token 'void'
2. main.cpp:1:6: LLVM IR generation of declaration 'real_on_scalar_with_type_promotion'
3. main.cpp:1:6: Generating code for declaration 'real_on_scalar_with_type_promotion'
#0 0x000000010517ef4c llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x102e56f4c)
#1 0x000000010517f510 PrintStackTraceSignalHandler(void*) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x102e57510)
#2 0x000000010517cea0 llvm::sys::RunSignalHandlers() (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x102e54ea0)
#3 0x0000000105180eb8 SignalHandler(int, __siginfo*, void*) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x102e58eb8)
#4 0x0000000184f0d6a4 (/usr/lib/system/libsystem_platform.dylib+0x1804ad6a4)
#5 0x0000000184ed388c (/usr/lib/system/libsystem_pthread.dylib+0x18047388c)
#6 0x0000000184ddca3c (/usr/lib/system/libsystem_c.dylib+0x18037ca3c)
#7 0x0000000184ddbc70 (/usr/lib/system/libsystem_c.dylib+0x18037bc70)
#8 0x0000000105b7cd00 clang::ComplexType const* clang::Type::castAs<clang::ComplexType>() const (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103854d00)
#9 0x0000000105ede1b0 clang::CodeGen::CodeGenFunction::EmitPromotedValue(std::__1::pair<llvm::Value*, llvm::Value*>, clang::QualType) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103bb61b0)
#10 0x0000000105f43a68 (anonymous namespace)::ScalarExprEmitter::VisitReal(clang::UnaryOperator const*, clang::QualType) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103c1ba68)
#11 0x0000000105f2b5b8 (anonymous namespace)::ScalarExprEmitter::EmitPromoted(clang::Expr const*, clang::QualType) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103c035b8)
#12 0x0000000105f2b33c clang::CodeGen::CodeGenFunction::EmitPromotedScalarExpr(clang::Expr const*, clang::QualType) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103c0333c)
#13 0x0000000105f43b48 (anonymous namespace)::ScalarExprEmitter::VisitReal(clang::UnaryOperator const*, clang::QualType) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103c1bb48)
#14 0x0000000105f380f8 (anonymous namespace)::ScalarExprEmitter::VisitUnaryReal(clang::UnaryOperator const*, clang::QualType) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103c100f8)
#15 0x0000000105f33180 clang::StmtVisitorBase<std::__1::add_pointer, (anonymous namespace)::ScalarExprEmitter, llvm::Value*>::Visit(clang::Stmt*) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103c0b180)
#16 0x0000000105f29e58 (anonymous namespace)::ScalarExprEmitter::Visit(clang::Expr*) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103c01e58)
#17 0x0000000105f46ac4 (anonymous namespace)::ScalarExprEmitter::VisitCastExpr(clang::CastExpr*) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103c1eac4)
#18 0x0000000105f3c69c clang::StmtVisitorBase<std::__1::add_pointer, (anonymous namespace)::ScalarExprEmitter, llvm::Value*>::VisitImplicitCastExpr(clang::ImplicitCastExpr*) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103c1469c)
#19 0x0000000105f33858 clang::StmtVisitorBase<std::__1::add_pointer, (anonymous namespace)::ScalarExprEmitter, llvm::Value*>::Visit(clang::Stmt*) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103c0b858)
#20 0x0000000105f29e58 (anonymous namespace)::ScalarExprEmitter::Visit(clang::Expr*) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103c01e58)
#21 0x0000000105f29c4c clang::CodeGen::CodeGenFunction::EmitScalarExpr(clang::Expr const*, bool) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103c01c4c)
#22 0x0000000105e34bfc clang::CodeGen::CodeGenFunction::EmitScalarInit(clang::Expr const*, clang::ValueDecl const*, clang::CodeGen::LValue, bool) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103b0cbfc)
#23 0x0000000105e3bf38 clang::CodeGen::CodeGenFunction::EmitExprAsInit(clang::Expr const*, clang::ValueDecl const*, clang::CodeGen::LValue, bool) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103b13f38)
#24 0x0000000105e38a4c clang::CodeGen::CodeGenFunction::EmitAutoVarInit(clang::CodeGen::CodeGenFunction::AutoVarEmission const&) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103b10a4c)
#25 0x0000000105e333d4 clang::CodeGen::CodeGenFunction::EmitAutoVarDecl(clang::VarDecl const&) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103b0b3d4)
#26 0x0000000105e327a4 clang::CodeGen::CodeGenFunction::EmitVarDecl(clang::VarDecl const&) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103b0a7a4)
#27 0x0000000105e32098 clang::CodeGen::CodeGenFunction::EmitDecl(clang::Decl const&, bool) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103b0a098)
#28 0x000000010619a50c clang::CodeGen::CodeGenFunction::EmitDeclStmt(clang::DeclStmt const&) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103e7250c)
#29 0x0000000106190af8 clang::CodeGen::CodeGenFunction::EmitSimpleStmt(clang::Stmt const*, llvm::ArrayRef<clang::Attr const*>) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103e68af8)
#30 0x000000010618fc14 clang::CodeGen::CodeGenFunction::EmitStmt(clang::Stmt const*, llvm::ArrayRef<clang::Attr const*>) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103e67c14)
#31 0x000000010619bb34 clang::CodeGen::CodeGenFunction::EmitCompoundStmtWithoutScope(clang::CompoundStmt const&, bool, clang::CodeGen::AggValueSlot) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103e73b34)
#32 0x0000000106266ed4 clang::CodeGen::CodeGenFunction::EmitFunctionBody(clang::Stmt const*) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103f3eed4)
#33 0x0000000106267f30 clang::CodeGen::CodeGenFunction::GenerateCode(clang::GlobalDecl, llvm::Function*, clang::CodeGen::CGFunctionInfo const&) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103f3ff30)
#34 0x000000010629c6e0 clang::CodeGen::CodeGenModule::EmitGlobalFunctionDefinition(clang::GlobalDecl, llvm::GlobalValue*) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103f746e0)
#35 0x0000000106292cec clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::GlobalDecl, llvm::GlobalValue*) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103f6acec)
#36 0x0000000106298058 clang::CodeGen::CodeGenModule::EmitGlobal(clang::GlobalDecl) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103f70058)
#37 0x000000010629144c clang::CodeGen::CodeGenModule::EmitTopLevelDecl(clang::Decl*) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103f6944c)
#38 0x00000001064a85c0 (anonymous namespace)::CodeGeneratorImpl::HandleTopLevelDecl(clang::DeclGroupRef) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x1041805c0)
#39 0x00000001062498c0 clang::BackendConsumer::HandleTopLevelDecl(clang::DeclGroupRef) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103f218c0)
#40 0x000000010a3c7120 clang::ParseAST(clang::Sema&, bool, bool) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x10809f120)
#41 0x0000000106bbec24 clang::ASTFrontendAction::ExecuteAction() (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x104896c24)
#42 0x000000010624ff9c clang::CodeGenAction::ExecuteAction() (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x103f27f9c)
#43 0x0000000106bbe468 clang::FrontendAction::Execute() (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x104896468)
#44 0x0000000106ad7c64 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x1047afc64)
#45 0x0000000106cf8280 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x1049d0280)
#46 0x00000001023387f0 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x1000107f0)
#47 0x000000010232b708 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x100003708)
#48 0x000000010232a47c clang_main(int, char**, llvm::ToolContext const&) (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x10000247c)
#49 0x000000010235f9dc main (/Users/amr.hesham/Desktop/Software/llvm-project/build/bin/clang-22+0x1000379dc)
#50 0x0000000184b32b98
[1] 30108 abort ./bin/clang++ -cc1 -std=c++20 -triple x86_64-unknown-linux-gun -emit-llvm -o
```
Godbolt:
https://godbolt.org/z/E7h8h8MaK
The reason:
In `__real__(__imag__ a)`, We calculate type promotion for __real__ as float32 because subexpression type is float16 `(__imag__ a)`, but when we visit `__imag__ a` we pass the promoted type and reuse it again which shouldn't happend because now the type promotion should be `Complex<float16> to Complex<float32>`
Some Solutions:
- We can perform a quick fix in `CodeGenFunction::EmitPromotedValue` to check if the type is not any complex type,and we use it as the element type.
- Or we recalculate the promotion type `ScalarExprEmitter::VisitReal` and `ScalarExprEmitter::VisitImag`.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzcW19v2ziQ_zTMC5GAIvX3IQ-uE_eC62J7Tbb7aFDUyOZFInUklT_36Q-UlFpSnKb1wm5vAwOxKXI0vx-HMyNxyK2VGwVwiaIPKLo6463banO5qM0VPEClGzBnuS6eL--20uIHXskCC10AFobbLVj8uAWFha4bWUm1wVw9Y1FxtcEPYKzUCj9Kt8UoJufOyKYC_JTG6zg8b9W90o_qvJKqfTrftArFBJGF_8Sk_whEP_gPWTxoWWADvFprtbaCV9ysvdy1e25g3Rhdaye1QjRFNMMo8WMwXq8qzV0Q4_VS100FT5gjNruUY8Su8HrdCV8jmr58xRzRrO-Okqtes04NWfPNz6hxoBbdbfZo8UJOr9HSz8KMNkQWC2vBeFVwyWUFBWILjGgqLUdseYfYNaLpkiutpODV3XMD_i7-s8Rlq0Q3UnDrFrZrkhVg3-sDt3Cx9U2VVICzICEXiCw-f7pe3F5j2-a1dJjjvN1gA402DjuNt841FrEFoitEVxvptm1-IXSN6KqqHl7-nTdG_zcIh-hKWtuCRXSFuSqwVKJqC8BuO9gczrm4d4YL8Io0BhqjBVgLBba6NX2zH8mt1UJyBwU2rcJWGNk4r--t4-IeF23deLXIwoPIPhu9MbzG3GzaGpTzKuMLRFe5VIiuOpvu7RGfCxHgc-sKxK4GG6UEv2ff-Bxq6c49WFxzqS5E0-Bz3X1fayM3UvHqoqoQWQReoZc-iC1ixBaB10e0xoByuOHGgsFO34PCiCbeMBFNEFnQ2dBgGI4_ffr6B775gjegwPBuhnWJCxAVH34imvzIEvN3YW_d5eMgXW16L1Fqc-g9MKKMYPJE-r-AREECZShwZzVsgdjCPtv-y2cjleum9a43jHTXyfDHtbbOAK8Rjb1xSOW69emX6eovC8YbG6_NxRbs1vdaXYG9d7pBdHWrS_fIDbw207yVVTG1j3NKEf1AngJCIYrLUPg11SMJZkjKKCB4pvat3Che_QdXRQUG0bSf1cUJdE2igOx0pTNdBXCyj_UvrZqobF8c33GVDYGPlGVTZVMCeYrnTHYzvsTrtfXLrNQdq0t8OoJTyNOdzuFI5zQsSRHzcNCgtcZLlzmiK_tsHdT9z_77uqm4K7WpL4rnro-Xn5KQewk7-dFEPhQsTcUPyndbA7yYiU-8gJ34eCK-KARnPyheTAWzxA_dCU5mgnORkAMF-6E7wenESPJEFIT0aUpvyUNk9jEOC62sQ3Qxvt6FyO7bEBXZcv_oPrR6g-rEHNWsWBqFBRmhzCYooYAgn6Es4COoyY_VEO77xutaus-dG4biK69a70m7OOcvrtdB_6Xh0iC23HmEoWu3pva0ek6WY0X-q_2WdRyXoTyPg3xgyDvhaTwpQ8bj1GvgU6HnWrcWK16DbboYkvXK3nZx6vqpMZ4dB2ZAJ610X4BXiKYjaH8pbp7_bHwQ1OabLf0q_CLIeZzu8E-jUEnzKD8U_9hUphT4rr8eOWFRPkJO58gZE4evjR0nvyd09uJVPXQ2N_o8_LcbfR6Opj6c4mcpKf8R_g7t708CIeWIhGhGAgvSSWy4dbXr0Gnjn_IQW772-7wo1o2WytNBlz9P4ZvRYcftlFKv1AnyMyZIHqSjMBHPnEUG0T-ymNdO4jSoAohGJpDM_EDMRfhPUC25da9d4K71BAgD4CLcIUxnRi7iTPyGRn5TN5UUbxH4-uopiAzjbBQysrm3SKP0NyTyl3mLdLSuKPk3egs6TxUzER6QMP1wopRrXZ0Cowh3Zk6nSSGwMC8Pxnij9s3cW3lAZ89XIKq3Okxu_Wkw_xPRlBORlyOa2IymvGTpz9Pk6VjYfxNNASvZaMWEM5pSfsiKWbROf91nTu8PH4Ze19J2Oy8DZ_EJmCB8vK6iGROMFeHBTPjpnzIxNJ4QH8lZscszaDzDRxN-AL7fBRtP-AhbMsdGsgMW-2tgM1Qnc2WcZKM1OskQ4yDjETlgjXosfbYxR-hbTzd3kNCIjNZdNkNHeHnA3N3KuqngNb4xttmrvoUx_PkLlNP3ogvnRp6dXR-fjzjlo4fe6fZRHKSlCA5Yp_8_mUhEsFvV0-2nOMjynB3AxFLXjW5V4fH_Ld1Wt-5W6AbmgWrXa8-Kfzt-LzabLoLfVvroG3QMEpazEUOTXDCmcQyHxKyXlg-6eP6uzRwZXckARhFruksW0zgp2U9uDQw7u-AvTpF9rHTOq97jj5fCt_Hfz9qWH1863qhSn855lqws2e6lz2RTjsQ0EzG8S9Efumgr2E1_T8ULnisopZJDRcgPENa37zZTjk1AEsYwIiCaEUAFvBsb9xPwuwOPuYBd2JzsZ3rgKYneDZv7gb8N9-hzScjo6X2yk-ohBeH7zyJzSHe6-QQPUO3P5U4zUVk4eq6YbuPGIU8jQd570zKA61_L39RN1Tf3tQHfh_jR6LbxsfzIOMMgJZEYrcRpHkfDLBUTV_SBi3tQxVIr29Yv745-J0SspEE6QhROMjHORBLQCaLP3FhY3N7NYibUfJY7nOKpISVZGdCR9tPsKc9B0ElusLi9WxmtHKhiMU4InkC0Doam49fGhGkWC7qL-uEspwnLMtvnBX6lzqykSTl69RyyOddhPHHG3yH6RBSHox31cJo18CIRcTivLJEVmBtlHVcC9rP8Nr7jJ0JhwksRj6xmmgeIMqXTrcJB-R2yBy34ayCvkB8_YIRZQehoIy-cRHYfQJKSYCGCdc39-HT_c9uWzx7WlnjadrrSMa93Uo4QJVNENE9Iil9mZBncde5xhOu25lX1FcS34LcHXjzNxryMpTfCp-nj267HjXKmtfIBvkC5VO6zm5YDPZRDgeBKVnDbF2sd_5mXEMISMlqa6YwqHiaD93uZ_qEs0DPSzeXiR4g4OgoaJiN_mE1RRGVWiK5m-MhqsCQrdmpEZFKalzOaZ6m_FH0IUHSFMcaMBCTFPNfG4e7vWMXT5_p1HfxHXeS6cqir555VnPeXLrTZILr6X0RX18k23aZ_8P_sx95tARvgto8mZHGjMIrJm8X4MfFW8jdgwSvRVtwBds8N4G_ly13R8-4YgcVlpbljFOcgeGsB2zaHp8ZA_5a-GyyHXkGMuxvsvWfeuv64xSPgB2ml6_X81jEm_krDre2q5ZuhWKm_A1cFNuBvLx3mG29Aj1sptthudVsVCtHE4S1vGlDFN02VfuxEzQD2Q3AOXoGh-hGx5YAAsWvsNJ61M-p9wMt83eoa8K2uWi_P9rwjsjjveVW4AVNqU2OO_6eV4h6X8glL1d_uh-oWY-J1EFsQ91iWOxDSYqVdf0xlOI7hunqcpSfI8_dCUU8iVFCDcl2nixcl_zS-o4GRBWzH_HR3QjF5t4oqJt28vNP1puYbFJOLs-KSFRnL-BlcBkmUJiEJw-hsewmccEELlkYkSlNCRRrHlBUsSVhQZkFwJi8poRHJaBhkhNDsIqFxwJMki0IQMUszFBKouawu_ArzS-WsO4VxGcQkStlZxXOobHdGiNJhNVNEl_6X4XZ7rtV5dzbIN0dXZ-ayczZ5u7EoJJW0zu4kO-mq7rzRshMUXeHuFAvWCv_1J-4Lq1Yes2_pTwn0h4imVnjWmury8MMlA7KHS_p_AQAA__8g5lnH">