diff options
Diffstat (limited to 'test/Verifier/musttail-invalid.ll')
-rw-r--r-- | test/Verifier/musttail-invalid.ll | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/test/Verifier/musttail-invalid.ll b/test/Verifier/musttail-invalid.ll new file mode 100644 index 0000000000..7e427b5046 --- /dev/null +++ b/test/Verifier/musttail-invalid.ll @@ -0,0 +1,75 @@ +; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s + +; Each musttail call should fail to validate. + +declare x86_stdcallcc void @cc_mismatch_callee() +define void @cc_mismatch() { +; CHECK: mismatched calling conv + musttail call x86_stdcallcc void @cc_mismatch_callee() + ret void +} + +declare void @more_parms_callee(i32) +define void @more_parms() { +; CHECK: mismatched parameter counts + musttail call void @more_parms_callee(i32 0) + ret void +} + +declare void @mismatched_intty_callee(i8) +define void @mismatched_intty(i32) { +; CHECK: mismatched parameter types + musttail call void @mismatched_intty_callee(i8 0) + ret void +} + +declare void @mismatched_vararg_callee(i8*, ...) +define void @mismatched_vararg(i8*) { +; CHECK: mismatched varargs + musttail call void (i8*, ...)* @mismatched_vararg_callee(i8* null) + ret void +} + +; We would make this an implicit sret parameter, which would disturb the +; tail call. +declare { i32, i32, i32 } @mismatched_retty_callee(i32) +define void @mismatched_retty(i32) { +; CHECK: mismatched return types + musttail call { i32, i32, i32 } @mismatched_retty_callee(i32 0) + ret void +} + +declare void @mismatched_byval_callee({ i32 }*) +define void @mismatched_byval({ i32 }* byval %a) { +; CHECK: mismatched ABI impacting function attributes + musttail call void @mismatched_byval_callee({ i32 }* %a) + ret void +} + +declare void @mismatched_inreg_callee(i32 inreg) +define void @mismatched_inreg(i32 %a) { +; CHECK: mismatched ABI impacting function attributes + musttail call void @mismatched_inreg_callee(i32 inreg %a) + ret void +} + +declare void @mismatched_sret_callee(i32* sret) +define void @mismatched_sret(i32* %a) { +; CHECK: mismatched ABI impacting function attributes + musttail call void @mismatched_sret_callee(i32* sret %a) + ret void +} + +declare i32 @not_tail_pos_callee() +define i32 @not_tail_pos() { +; CHECK: musttail call must be precede a ret with an optional bitcast + %v = musttail call i32 @not_tail_pos_callee() + %w = add i32 %v, 1 + ret i32 %w +} + +define void @inline_asm() { +; CHECK: cannot use musttail call with inline asm + musttail call void asm "ret", ""() + ret void +} |