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

    <tr>
        <th>Summary</th>
        <td>
            [c-api]: segfault querying type information from value
        </td>
    </tr>

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

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

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

<pre>
    Querying _function type_ information from a _function value_ segfaults using the `c` api.

Turning the `LLVMValueRef -> LLVMTypeOf` by calling `LLVMGetElementType(LLVMTypeOf(val_ref))` segfaults.

```c
// file: test.cpp
#include <llvm-c/Core.h>

int main() {
  LLVMContextRef ctx = LLVMContextCreate();
  LLVMModuleRef  mod = LLVMModuleCreateWithNameInContext("mod", ctx);

  LLVMTypeRef ty_void = LLVMVoidTypeInContext(ctx);
  LLVMTypeRef ty_fn   = LLVMFunctionType(ty_void, 0 /* param types */, 0 /* nargs */, 0 /* vararg */);

  LLVMValueRef func = LLVMAddFunction(mod, "func", ty_fn);

  // (1) Param type.
  unsigned cnt1 = LLVMCountParams(func);  // ok
  // llvm/lib/IR/Core.cpp:LLVMCountParams states
  //    This function is strictly redundant to
  // LLVMCountParamTypes(LLVMGetElementType(LLVMTypeOf(FnRef)))
  unsigned cnt2 = LLVMCountParamTypes(LLVMGetElementType(LLVMTypeOf(func))); // segv

 // (2) Return type.
  LLVMTypeRef ty_ret = LLVMGetReturnType(LLVMGetElementType(LLVMTypeOf(func))); // segv

 LLVMContextDispose(ctx);
  return 0;
}
```

```sh
clang -o test test.c `llvm-config --cflags --ldflags --system-libs --libs core`
```

Tested with the following llvm versions at hand:
- `14.0.6` no segv
- `15.0.0` segv
- `15.0.7` segv
- `16.0.6` segv
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVVtvozgU_jXOy1GQMQTCAw9t0oxGmtlLVXUfKwMGPGts1jbp5N-vbC6habTah5GsXM7l8-dzpcbwRjKWo90j2h03dLCt0vkP1VIpjd0Uqrrkfw5MX7hs4K0eZGm5kmAvPXsDLmulO-oltVYd0JXJmYqBvYFhTU0HYQ0MxmHYlgFKcIkSDLTnAcJHhB_Gz5dBy5XNt2-v318dyjOrYYuiJ3CSl0vPfq-de3GBkgrhPCbrL8w-CdYxaZ0VIvuVA9mfqXjTrEYkcyfBV24fWKAEj6ec_pMTIieouWAoegDLjA3Kvp-VEZelGCoGKDoIce62JSKng9IsaFH0tAbm0kJHuURkj0gGKH0c5eDfdVDSsp_WvbW0PwFFx7X4oBm1bPRE0QfH76oahI8RdKpaHEfx6PcXt-1vtGNf5QTngUinKkQIIgd34xp4De_C58Dt5e2s-BX_VfHK6daYNzCfAGoJsACcpkqZUjXhOzYYfMwfoKeadr7YDCAyZmKlllQ3dxVnqqluFs39hy2l5Up2YfVQVTMxRPY-QgdAhDijKVj-IfdQp0pBZB-6BP-xsA9mi0H6fquglDZc5XiQ1lsbRPbjTQ59QVR_31zhCg2Rk-AFIqevz3PFubKMHm4gwVhqmblBAICXlhtY-pU7Q81LKy6gWTXIikoLVt34fQR3uTNTn_13853k89J6JLsXD3InHv8ff47aeKLHma9hzflDlq5JIi5Jz8wOWn7M0k3VamYXal-YHT1WHH4RsVW3H7nplWH3OkqPfPG1-NLjzdy6O8xMOwpKQWUDW-Xn2DTM3PgcR5eSNW9guy1rQRsD262o5l_mYizrtoIXXu6-SqXZ9b57178wY1kF79y2fqrXSgj17ia2uw_OTBuupAFqoaWyQtHkt3WUwjjAQeIGtVSrcI26XYADPA3xT4r0niKZ0ZxiU-VRlUUZ3bA8TDGOwzBKwk2bZ7hKiyLEMcnqsMyijBRplkXxLsJxXMTJhucEkygMwyxMSEbCACe7Ahe7mKZ1WcTpDsWYdZSLwD0xULrZcGMGlqckzfYbQQsmjN-3hEj2Dl7pJsvuuNG5T0MxNAbFWHBjzRXFciv8oi63tOdod3TbaF5h8M-8pF0lf97MfhtvBi3y1treuED7Mmy4bYciKJUfJ9NUcRx6rX6w0iJy8gQNIif_gH8DAAD__wv0cbU">