diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2008-12-15 22:05:35 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2008-12-15 22:05:35 +0000 |
commit | 56f20ae1010aa71defd7572f660b41288c56cdd1 (patch) | |
tree | b50048bb678a5ebd25f72cd44982def288b75e63 /lib/Sema/SemaChecking.cpp | |
parent | 9ee92e84ecf085ccbe6f877d1c6e1500961bbbce (diff) |
Make error handling for va_start a bit more robust. Fixes PR3213.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61055 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaChecking.cpp')
-rw-r--r-- | lib/Sema/SemaChecking.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 0c7da0edb0..14aa996821 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -160,14 +160,23 @@ bool Sema::SemaBuiltinVAStart(CallExpr *TheCall) { (*(TheCall->arg_end()-1))->getLocEnd()); return true; } - + + if (TheCall->getNumArgs() < 2) { + return Diag(TheCall->getLocEnd(), diag::err_typecheck_call_too_few_args) + << 0 /*function call*/; + } + // Determine whether the current function is variadic or not. bool isVariadic; - if (getCurFunctionDecl()) - isVariadic = - cast<FunctionTypeProto>(getCurFunctionDecl()->getType())->isVariadic(); - else + if (getCurFunctionDecl()) { + if (FunctionTypeProto* FTP = + dyn_cast<FunctionTypeProto>(getCurFunctionDecl()->getType())) + isVariadic = FTP->isVariadic(); + else + isVariadic = false; + } else { isVariadic = getCurMethodDecl()->isVariadic(); + } if (!isVariadic) { Diag(Fn->getLocStart(), diag::err_va_start_used_in_non_variadic_function); |