<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">