Index: include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -7398,6 +7398,9 @@ def err_builtin_annotation_second_arg : Error< "second argument to __builtin_annotation must be a non-wide string constant">; +def err_builtin_signbit_wrong_argument : Error< + "Argument type mismatch, must be float, double or long double">; + // CFString checking def err_cfstring_literal_not_string_constant : Error< "CFString literal is not a string constant">; Index: lib/Sema/SemaChecking.cpp =================================================================== --- lib/Sema/SemaChecking.cpp +++ lib/Sema/SemaChecking.cpp @@ -99,6 +99,22 @@ return false; } +static bool SemaBuiltinSignbit(Sema &S, CallExpr *TheCall) { + if (checkArgCount(S, TheCall, 1)) + return true; + + // Argument should be an float, double or long double. + Expr *ValArg = TheCall->getArg(0); + QualType Ty = ValArg->getType(); + if (!Ty->isRealFloatingType()) { + S.Diag(ValArg->getLocStart(), diag::err_builtin_signbit_wrong_argument) + << ValArg->getSourceRange(); + return true; + } + + return false; +} + /// Check that the argument to __builtin_addressof is a glvalue, and set the /// result type to the corresponding pointer type. static bool SemaBuiltinAddressof(Sema &S, CallExpr *TheCall) { @@ -763,6 +779,10 @@ } break; } + case Builtin::BI__builtin_signbit: + if (SemaBuiltinSignbit(*this, TheCall)) + return ExprError(); + break; case Builtin::BI__builtin_isgreater: case Builtin::BI__builtin_isgreaterequal: case Builtin::BI__builtin_isless: Index: test/Sema/builtins.c =================================================================== --- test/Sema/builtins.c +++ test/Sema/builtins.c @@ -248,3 +248,11 @@ return buf; } + +int test21(double a) { + return __builtin_signbit(); // expected-error {{too few arguments}} +} + +int test22(void) { + return __builtin_signbit("1"); // expected-error {{Argument type mismatch}} +} Index: test/SemaCXX/builtins.cpp =================================================================== --- test/SemaCXX/builtins.cpp +++ test/SemaCXX/builtins.cpp @@ -44,3 +44,10 @@ __noop(1); // expected-error {{use of undeclared}} __debugbreak(); // expected-error {{use of undeclared}} } + +template +int test_signbit(T t) { return __builtin_signbit(t); } // expected-error {{Argument type mismatch}} + +int test_signbit_call () { +return test_signbit("1"); // expected-note {{instantiation of function template specialization}} +}