From 56732fb869701f17b62e6995be2643d686b5567c Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 8 May 2002 19:49:50 +0000 Subject: [PATCH] Verify that function call arguments match the function signature git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2553 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/Verifier.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp index f33eb311d34..d09678c7392 100644 --- a/lib/VMCore/Verifier.cpp +++ b/lib/VMCore/Verifier.cpp @@ -30,6 +30,7 @@ // * It is illegal to have a internal function that is just a declaration // * It is illegal to have a ret instruction that returns a value that does not // agree with the function return value type. +// * Function call argument types match the function prototype // * All other things that are tested by asserts spread about the code... // //===----------------------------------------------------------------------===// @@ -228,6 +229,22 @@ void Verifier::visitCallInst(CallInst *CI) { PointerType *FPTy = cast(CI->getOperand(0)->getType()); Assert1(isa(FPTy->getElementType()), "Called function is not pointer to function type!", CI); + + FunctionType *FTy = cast(FPTy->getElementType()); + + // Verify that the correct number of arguments are being passed + if (FTy->isVarArg()) + Assert1(CI->getNumOperands()-1 >= FTy->getNumParams(), + "Called function requires more parameters than were provided!", CI); + else + Assert1(CI->getNumOperands()-1 == FTy->getNumParams(), + "Incorrect number of arguments passed to called function!", CI); + + // Verify that all arguments to the call match the function type... + for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) + Assert2(CI->getOperand(i+1)->getType() == FTy->getParamType(i), + "Call parameter type does not match function signature!", + CI->getOperand(i+1), FTy->getParamType(i)); } // visitBinaryOperator - Check that both arguments to the binary operator are -- 2.34.1