From: Chris Lattner Date: Tue, 12 Oct 2010 17:47:42 +0000 (+0000) Subject: fix PR7885, rejecting invalid uses of __builtin_constant_p. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=75c29a012793292ff4578015a9113bf086156d7f;p=clang fix PR7885, rejecting invalid uses of __builtin_constant_p. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116317 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index f03e1f9310..1a07a86f80 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -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: diff --git a/test/Sema/builtins.c b/test/Sema/builtins.c index 21a1f72e1d..7f284dabcd 100644 --- a/test/Sema/builtins.c +++ b/test/Sema/builtins.c @@ -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}} +} + diff --git a/test/Sema/const-eval.c b/test/Sema/const-eval.c index 42097e75f3..9f2d32769f 100644 --- a/test/Sema/const-eval.c +++ b/test/Sema/const-eval.c @@ -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);