fix PR7885, rejecting invalid uses of __builtin_constant_p.

llvm-svn: 116317
This commit is contained in:
Chris Lattner 2010-10-12 17:47:42 +00:00
parent 636d6ed0c1
commit 17c0eac879
3 changed files with 18 additions and 1 deletions

View File

@ -198,6 +198,16 @@ Sema::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
if (SemaBuiltinLongjmp(TheCall))
return ExprError();
break;
case Builtin::BI__builtin_constant_p:
if (TheCall->getNumArgs() == 0)
return Diag(TheCall->getLocEnd(), diag::err_typecheck_call_too_few_args)
<< 0 /*function call*/ << 1 << 0 << TheCall->getSourceRange();
if (TheCall->getNumArgs() > 1)
return Diag(TheCall->getArg(1)->getLocStart(),
diag::err_typecheck_call_too_many_args)
<< 0 /*function call*/ << 1 << TheCall->getNumArgs()
<< TheCall->getArg(1)->getSourceRange();
break;
case Builtin::BI__sync_fetch_and_add:
case Builtin::BI__sync_fetch_and_sub:
case Builtin::BI__sync_fetch_and_or:

View File

@ -95,3 +95,10 @@ void test14() {
void test15(const char *s) {
__builtin_printf("string is %s\n", s);
}
// PR7885
int test16() {
return __builtin_constant_p() + // expected-error{{too few arguments}}
__builtin_constant_p(1, 2); // expected-error {{too many arguments}}
}

View File

@ -41,7 +41,7 @@ struct s {
EVAL_EXPR(19, ((int)&*(char*)10 == 10 ? 1 : -1));
EVAL_EXPR(20, __builtin_constant_p(*((int*) 10), -1, 1));
EVAL_EXPR(20, __builtin_constant_p(*((int*) 10)));
EVAL_EXPR(21, (__imag__ 2i) == 2 ? 1 : -1);