================
@@ -0,0 +1,25 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o 
- | FileCheck %s
----------------
Arghnews wrote:

If I change the test file to:
```c
  // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o 
%t.cir
  // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value 
-emit-llvm %s -o %t.ll
  // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value 
-fclangir -emit-llvm %s -o %t-cir.ll

  void f(void);
  void test_call_lvalue_cast() {
    (void (*)())f; // Works
    (*(void (*)(void))f)(); // Works
    (*(void (*)(int))f)(42); // Fails with -fclangir -emit-llvm
  }
```


Then it crashes when running `-fclangir -emit-llvm` with `(*(void 
(*)(int))f)(42);`, top of the crash:


```
dialect-conversion] Legalizing operation : 'cir.call' (0x6480afdaa150) {
[dialect-conversion]   "cir.call"(%5, %7) <{side_effect = 0 : i32}> : 
(!cir.ptr<!cir.func<(!cir.int<s, 32>)>>, !cir.int<s, 32>) -> ()
[dialect-conversion]   * Fold {
[dialect-conversion]   } -> FAILURE : unable to fold
[dialect-conversion] 
[dialect-conversion]   * Pattern : 'cir.call -> ()' {
!cir.func<(!cir.int<s, 32>)>
```
> clang: 
> /home/justin/code/llvm-project/mlir/lib/Dialect/LLVMIR/IR/LLVMTypes.cpp:219: 
> static LLVMFunctionType mlir::LLVM::LLVMFunctionType::get(Type, 
> ArrayRef<Type>, bool): Assertion `result && "expected non-null result"' 
> failed.

Have attached the full stack with some debugging turned on - I'm not sure if 
there's better options, I was just exploring:
[crash.txt](https://github.com/user-attachments/files/21847423/crash.txt)

&nbsp;

Is this a bug that hasn't been implemented yet etc.?
What should be done about it?


The [original clangir 
test](https://github.com/llvm/clangir/blob/main/clang/test/CIR/CodeGen/function-to-pointer-decay.c)
 only contains:
```c
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o - 
| FileCheck %s

void f(void);

void test_call_lvalue_cast() {
  (*(void (*)(int))f)(42);
}
```

Although if I run this test on clangir with `-fclangir -emit-llvm`, it doesn't 
crash, and outputs:
```ll
declare void @f()                                                               
                                                                                
                                                                                
                                                                                
 
; Function Attrs: noinline nounwind optnone                                     
                                                                                
                        
define dso_local void @test_call_lvalue_cast() #0 {                             
                                                                                
                        
  call void @f()                                                                
                                                                                
                        
  call void @f(i32 42)                                                          
                                                                                
                        
  ret void                                                                      
                                                                                
                        
}                                                                               
                                                                                
                        
```

I'm happy to try and fix it if I can be given some pointers as to 
how/what/where, if that's within the scope of this PR. Or another etc. Or maybe 
I messed up something on the way.

On a C level, what is the expected behaviour when you cast a function pointer 
declared as taking no parameters `void f(void)` to one taking one `int` param 
and call it? [gcc warns](https://godbolt.org/z/6cxo7nqcf)

Let me know what to do on this


https://github.com/llvm/llvm-project/pull/154060
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to