aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2008-12-15 22:05:35 +0000
committerEli Friedman <eli.friedman@gmail.com>2008-12-15 22:05:35 +0000
commit56f20ae1010aa71defd7572f660b41288c56cdd1 (patch)
treeb50048bb678a5ebd25f72cd44982def288b75e63
parent9ee92e84ecf085ccbe6f877d1c6e1500961bbbce (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
-rw-r--r--lib/Sema/SemaChecking.cpp19
-rw-r--r--test/Sema/varargs.c9
2 files changed, 23 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);
diff --git a/test/Sema/varargs.c b/test/Sema/varargs.c
index efde2f0a7c..5e0f28b7c2 100644
--- a/test/Sema/varargs.c
+++ b/test/Sema/varargs.c
@@ -34,3 +34,12 @@ void f4(const char *msg, ...) {
__builtin_va_end (ap);
}
+void f5() {
+ __builtin_va_list ap;
+ __builtin_va_start(ap,ap); // expected-error {{'va_start' used in function with fixed args}}
+}
+
+void f6(int a, ...) {
+ __builtin_va_list ap;
+ __builtin_va_start(ap); // expected-error {{too few arguments to function}}
+}