[cfe-commits] r61055 - in /cfe/trunk: lib/Sema/SemaChecking.cpp test/Sema/varargs.c
Eli Friedman
eli.friedman at gmail.com
Mon Dec 15 14:05:35 PST 2008
Author: efriedma
Date: Mon Dec 15 16:05:35 2008
New Revision: 61055
URL: http://llvm.org/viewvc/llvm-project?rev=61055&view=rev
Log:
Make error handling for va_start a bit more robust. Fixes PR3213.
Modified:
cfe/trunk/lib/Sema/SemaChecking.cpp
cfe/trunk/test/Sema/varargs.c
Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=61055&r1=61054&r2=61055&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Mon Dec 15 16:05:35 2008
@@ -160,14 +160,23 @@
(*(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);
Modified: cfe/trunk/test/Sema/varargs.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/varargs.c?rev=61055&r1=61054&r2=61055&view=diff
==============================================================================
--- cfe/trunk/test/Sema/varargs.c (original)
+++ cfe/trunk/test/Sema/varargs.c Mon Dec 15 16:05:35 2008
@@ -34,3 +34,12 @@
__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}}
+}
More information about the cfe-commits
mailing list