<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/120140>120140</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Assertion `i < NumContainedTys && "Index out of range!"' failed.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
wesuRage
</td>
</tr>
</table>
<pre>
`/usr/local/llvm-19/include/llvm/IR/Type.h:385: Type *llvm::Type::getContainedType(unsigned int) const: Assertion `i < NumContainedTys && "Index out of range!"' failed.
Aborted (core dumped)`
This shows up when I try to get the type contained in the pointer. Its used in the line:
```cpp
llvm::Type *ElementType = llvm::cast<llvm::PointerType>(SymbolValue->getType())->getContainedType(0);
```
line:
```cpp
llvm::Type *ElementType = llvm::cast<llvm::PointerType>(LType)->getContainedType(0);
```
and line:
```cpp
llvm::Type *ElementType = llvm::cast<llvm::PointerType>(RType)->getContainedType(0);
```
This is the full code for more context:
```cpp
#include "backend/generator/expressions/generate_binary_expr.hpp"
#include "backend/generator/expressions/generate_expr.hpp"
#include "backend/generator/symbols/identifier_symbol_table.hpp"
llvm::Value *generate_binary_expr(BinaryExprNode *node, llvm::LLVMContext &Context, llvm::IRBuilder<> &Builder, llvm::Module &Module) {
llvm::Value *L = generate_expr(node->left, Context, Builder, Module);
llvm::Value *R = generate_expr(node->right, Context, Builder, Module);
llvm::Type *LType = L->getType();
llvm::Type *RType = R->getType();
auto resolve_pointer = [&](llvm::Value *Val, llvm::Type *&Type, const std::string &name) -> llvm::Value * {
if (Type->isPointerTy()) {
llvm::Value *SymbolValue = find_identifier(name);
if (!SymbolValue) {
throw std::runtime_error("Symbol '" + name + "' not found in the symbol table.");
}
llvm::Type *ElementType = llvm::cast<llvm::PointerType>(SymbolValue->getType())->getContainedType(0);
if (!ElementType) {
throw std::runtime_error("Unable to determine the element type of the pointer for '" + name + "'.");
}
Val = Builder.CreateLoad(ElementType, Val, "load_" + name);
Type = ElementType;
}
return Val;
};
if (node->left->kind == NODE_IDENTIFIER) {
auto *LNameNode = static_cast<IdentifierNode *>(node->left->data);
L = resolve_pointer(L, LType, LNameNode->symbol);
}
if (node->right->kind == NODE_IDENTIFIER) {
auto *RNameNode = static_cast<IdentifierNode *>(node->right->data);
R = resolve_pointer(R, RType, RNameNode->symbol);
}
if (LType->isPointerTy()) {
llvm::Type *ElementType = llvm::cast<llvm::PointerType>(LType)->getContainedType(0);
if (!ElementType) {
throw std::runtime_error("Unable to determine the element type of the pointer.");
}
if (ElementType->isIntegerTy()) {
L = Builder.CreatePtrToInt(L, llvm::Type::getInt32Ty(Context), "ptr_to_int_L");
LType = llvm::Type::getInt32Ty(Context);
} else if (ElementType->isFloatingPointTy()) {
L = Builder.CreatePtrToInt(L, llvm::Type::getInt32Ty(Context), "ptr_to_int_L");
L = Builder.CreateSIToFP(L, llvm::Type::getDoubleTy(Context), "int_to_fp_L");
LType = llvm::Type::getDoubleTy(Context);
}
}
if (RType->isPointerTy()) {
llvm::Type *ElementType = llvm::cast<llvm::PointerType>(RType)->getContainedType(0);
if (!ElementType) {
throw std::runtime_error("Unable to determine the element type of the pointer.");
}
if (ElementType->isIntegerTy()) {
L = Builder.CreatePtrToInt(R, llvm::Type::getInt32Ty(Context), "ptr_to_int_L");
LType = llvm::Type::getInt32Ty(Context);
} else if (ElementType->isFloatingPointTy()) {
R = Builder.CreatePtrToInt(R, llvm::Type::getInt32Ty(Context), "ptr_to_int_L");
R = Builder.CreateSIToFP(R, llvm::Type::getDoubleTy(Context), "int_to_fp_L");
RType = llvm::Type::getDoubleTy(Context);
}
}
bool isLInteger = LType->isIntegerTy();
bool isRInteger = RType->isIntegerTy();
bool isLFloating = LType->isFloatingPointTy();
bool isRFloating = RType->isFloatingPointTy();
// Handle integer-specific operations
if (isLInteger && isRInteger) {
if (strcmp(node->op, "+") == 0) return Builder.CreateAdd(L, R, "addtmp");
if (strcmp(node->op, "-") == 0) return Builder.CreateSub(L, R, "subtmp");
if (strcmp(node->op, "*") == 0) return Builder.CreateMul(L, R, "multmp");
if (strcmp(node->op, "/") == 0) return Builder.CreateSDiv(L, R, "divtmp");
if (strcmp(node->op, "%") == 0) return Builder.CreateSRem(L, R, "modtmp");
if (strcmp(node->op, "&") == 0) return Builder.CreateAnd(L, R, "andtmp");
if (strcmp(node->op, "|") == 0) return Builder.CreateOr(L, R, "ortmp");
if (strcmp(node->op, "^") == 0) return Builder.CreateXor(L, R, "xortmp");
if (strcmp(node->op, ">>") == 0) return Builder.CreateAShr(L, R, "shrtmp");
if (strcmp(node->op, "<<") == 0) return Builder.CreateShl(L, R, "shltmp");
// Comparison operators
if (strcmp(node->op, "==") == 0) return Builder.CreateICmpEQ(L, R, "eqtmp");
if (strcmp(node->op, "!=") == 0) return Builder.CreateICmpNE(L, R, "netmp");
if (strcmp(node->op, "<") == 0) return Builder.CreateICmpSLT(L, R, "lttmp");
if (strcmp(node->op, "<=") == 0) return Builder.CreateICmpSLE(L, R, "letmp");
if (strcmp(node->op, ">") == 0) return Builder.CreateICmpSGT(L, R, "gttmp");
if (strcmp(node->op, ">=") == 0) return Builder.CreateICmpSGE(L, R, "getmp");
throw std::runtime_error("Unknown binary operator for integers");
}
// Handle floating-point operations
if (isLFloating || isRFloating) {
// Convert integers to floating-point if necessary
if (isLInteger) {
L = Builder.CreateSIToFP(L, llvm::Type::getDoubleTy(Context), "cast_to_fp_L");
}
if (isRInteger) {
R = Builder.CreateSIToFP(R, llvm::Type::getDoubleTy(Context), "cast_to_fp_R");
}
// Floating-point operations
if (strcmp(node->op, "+") == 0) return Builder.CreateFAdd(L, R, "addtmp");
if (strcmp(node->op, "-") == 0) return Builder.CreateFSub(L, R, "subtmp");
if (strcmp(node->op, "*") == 0) return Builder.CreateFMul(L, R, "multmp");
if (strcmp(node->op, "/") == 0) return Builder.CreateFDiv(L, R, "divtmp");
// Comparison operators for floating-point
if (strcmp(node->op, "==") == 0) return Builder.CreateFCmpOEQ(L, R, "eqtmp");
if (strcmp(node->op, "!=") == 0) return Builder.CreateFCmpONE(L, R, "netmp");
if (strcmp(node->op, "<") == 0) return Builder.CreateFCmpOLT(L, R, "lttmp");
if (strcmp(node->op, "<=") == 0) return Builder.CreateFCmpOLE(L, R, "letmp");
if (strcmp(node->op, ">") == 0) return Builder.CreateFCmpOGT(L, R, "gttmp");
if (strcmp(node->op, ">=") == 0) return Builder.CreateFCmpOGE(L, R, "getmp");
throw std::runtime_error("Unsupported operator for floating-point numbers");
}
throw std::runtime_error("Unsupported types for binary operation");
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWttv4joa_2vMi9UqOOX2wAMFchaJ6cym3dG-IZM44J3EztpOL__9ynYScmOa0pnDkfagSkBif7_v991Ng6WkB0bIHIzuwWg1wJk6cjF_ITLz8YEM9jx8m4OxA5CXSQGQF_MAx_o9fk5uhjOAPMqCOAtJfg0gb-MD5D29peT2CNyFOx0BdwH1dwjQwqxxF8Bd6Cv204GoJWcKU0ZCcxVNM2b0CiFlCqAZDDiTSstZSEmEopxBMHYoBO4SPmRJZbuEAI0BGkOA0IaF5BXyTEEeQYHZgQA0BAgBNIERpjEJb4GzWOy5UCSEAE0DLggMsyQlIUAzzdtZAGfxdKQSyiN_kTBL4cuRMLiBSrxBxeGBKKiOBCpNMCj0gJSZqymnTBFxCzdKwkyebsSUGfZGvgYyf0GaAqdhI221dUwSwpT96q7gaUWAtV2WpwvfLKK17hqg6eNbsufxdxxn5Aa46wNRuY01QzTLrzUd4Oi77n1VOa3Zn6b11urxMfUwC_9Ew_qXqFhEE5UmDKIsjmHAQwIjLmCiw0_HEHlV5zgA5OYZpyN8j4MfhIUAeQfCiMCK6yQlr6kgUlLO5OkO2e0pw-Jtp-_eHtNUJ8Kn5H1ckDSxqIXQkDBFI0rEzl7cKbyPSUVc1V0merW_urgANL0339avqXjgBn_BuC5Jy4pDt9vvX5bWtrpE5B_razb-fUbjkAjgLoG71uuKC7V1X3iYxRpnbD_pEgUm2tcQQtih99ZEV81yAE21kjp6YhIZRSo6VWBLCBtNZxD8nyIIejj2h2ihFOmyLRNl264lHdoV-_xyn39mX74VZ4pDQSSPn8kuL55mn-5PaAxGK4CmHey_66a07EAGaGyhlraHQKlCu0IqQdlB-5DhxHhQq9Zl2opr9YtGulVoqXoDlWVhKGtqsaFDVqUaG14RZeHulAzaZVabkznruAANKzLqgVd9qaPgLye2ImOKJmRHhNCZOAUIWTEQoAlACAJ0DzW0-ZD3SMYVjHjGyq5lUxXaVDWLOvQEk1Xu0L9YI3MWJxtWFPmMDf_FtCn0HBASRURCGTGGIla8nQp4VJ0FTKU_b_QeZq28vuPY2DHP5dulIFiRLcchQNMaxyXMcwQgFHMc7qr4nYClk6pyaqusSsU3QVQmmIEpV-kV1fy29q_WPf3-g7JQI2mwh6-r9W6zWj88bbzN2m87x5QIXYsecEJsuXdXUCqsaLDLo2hTJlTRD2wINYFDrHCLu63VjSKkRxJtvW1hzRJey7F5UZNUc1edtinGF_P2P8G7RO4k7p8h7mu-fkHc_zjxbZ9imb-uNUY263ufGvFb6kNnAWglv1WyoqE174YpcviZeU8BXi8Z35R44ht92LJxfuactmHKRUZ6OUjM8qKSKrFTfEeZ2m3P1bBthxPfl9-0BCSxJOcs4MUcK8oOJhT-snboQH7cPHHv2zu4K57tY9INrBEV30XpJ-zfLf9M0e_IdP9qmd7_NPZ3phcR7v-_ZLp_NTt0IZeZ_jPcT2a6__syfc95DKnc5hFoj4PnA7MUme_zq_v8_vu2hb-bgN1x0IKtbfd7bS_YIw8gD_4DszAmkFo9b2RKAhrRAPJUH7nNjyPlCaNqHvtz5Il4O0TtHqlEkKSVaY2nub8Burd-LoZFXc2KebseW4swLFqIn-_GYaiStCtQ3sO96Yv6mO2bqDLbX4hqTu39cL9kcRM3yeIm7vuAXm-iK_rcRAzp88VMR72BfZK0qPJLHWtismdAsXZAsYtxJ8u-uF9FE5aLS1FH676o_-Yt2Nc27ruA7toMJT0t_HhsgcrjxWTdpf7rG1bHVgLJYzOBqi3BlsIlT1IsqOQsr35cyH6G0fr0VW6zTNL1P5v6kf9eHPTDD4I_rJvgjHzCLR9Aftw-NaFj9ZmI-BDvx22LeHw58d6JYKD_aBE_XE58_VHif7SIH5rEKwr0ORX8YPyFQfvvijJZzG-A-SAhm9ROw1Z98IjyQeXGHB8aY0dpjtqgNFmCybI6_FRmjzKV2TMRqtRGn2AaSDSCjARESizeWuY_TTr9jyCfPurq4-DPJuD6D5OFoucHMPi7JvWKon6v017uFe8dX__iqdG7ztjoXWtu9PoNjr2Be8-PXq_5sV_DNUWknqq_vgd7yyT9erUmbNCv04UN9NW6sEW_Shc20Ffrwhb9l3dhmaWpfcqn1oIbjY5lyb7ZkGsV-mNQ6i0lNktr7Z9yVmNSAJQPegzCuRvO3BkekPlw4t6506EzGg-Oc4SjsTubTJxg6JBgiJyxMw4mThRFzmwfhpMBnSMH3Q3RcIwc1xmNbvejIXaxezeaju_GaBiBO4ckmMa3upfdcnEYUCkzMh8iZ3jnDGK8J7E0D4PpLHuB5q45Qq0GYm4e-tpnBwnunJhKJU9iFFUxmf_qp7MGmYjnR6VSqQ1uSuGBqmO2vw14cnrizOiVCv4fEiiAPKO0BMjLWT3P0f8CAAD__8xfIiY">