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