jseba created this revision. jseba added a project: clang. Clang has had a regression since version 3.8 where calls to __builtin_signbit (and friends signbitf & signbitl) without passing any arguments would cause it to segfault because it didn't abort compilation, even though it would properly flag the function call as having too few arguments passed in. This patch fixes the issue by including signbit in the checks for floating point parameters during semantic checks for builtin functions, same as isnan or isinf.
This addresses https://bugs.llvm.org/show_bug.cgi?id=28653 and https://bugs.llvm.org/show_bug.cgi?id=28653 https://reviews.llvm.org/D36773 Files: lib/Sema/SemaChecking.cpp test/Sema/builtin-unary-fp.c Index: test/Sema/builtin-unary-fp.c =================================================================== --- test/Sema/builtin-unary-fp.c +++ test/Sema/builtin-unary-fp.c @@ -9,6 +9,9 @@ check(__builtin_isfinite(1)); // expected-error{{requires argument of floating point type}} check(__builtin_isinf()); // expected-error{{too few arguments}} check(__builtin_isnan(1,2)); // expected-error{{too many arguments}} + check(__builtin_signbit()); // expected-error{{too few arguments}} + check(__builtin_signbit(1,2)); // expected-error{{too many arguments}} + check(__builtin_signbit(1)); // expected-error{{requires argument of floating point type}} check(__builtin_fpclassify(0, 0, 0, 0, 0, 1.0)); check(__builtin_fpclassify(0, 0, 0, 0, 0, 1)); // expected-error{{requires argument of floating point type}} check(__builtin_fpclassify(0, 1, 2, 3, 4.5, 5.0)); // expected-warning{{implicit conversion from 'double' to 'int' changes value from 4.5 to 4}} Index: lib/Sema/SemaChecking.cpp =================================================================== --- lib/Sema/SemaChecking.cpp +++ lib/Sema/SemaChecking.cpp @@ -839,6 +839,9 @@ case Builtin::BI__builtin_isinf_sign: case Builtin::BI__builtin_isnan: case Builtin::BI__builtin_isnormal: + case Builtin::BI__builtin_signbit: + case Builtin::BI__builtin_signbitf: + case Builtin::BI__builtin_signbitl: if (SemaBuiltinFPClassification(TheCall, 1)) return ExprError(); break;
Index: test/Sema/builtin-unary-fp.c =================================================================== --- test/Sema/builtin-unary-fp.c +++ test/Sema/builtin-unary-fp.c @@ -9,6 +9,9 @@ check(__builtin_isfinite(1)); // expected-error{{requires argument of floating point type}} check(__builtin_isinf()); // expected-error{{too few arguments}} check(__builtin_isnan(1,2)); // expected-error{{too many arguments}} + check(__builtin_signbit()); // expected-error{{too few arguments}} + check(__builtin_signbit(1,2)); // expected-error{{too many arguments}} + check(__builtin_signbit(1)); // expected-error{{requires argument of floating point type}} check(__builtin_fpclassify(0, 0, 0, 0, 0, 1.0)); check(__builtin_fpclassify(0, 0, 0, 0, 0, 1)); // expected-error{{requires argument of floating point type}} check(__builtin_fpclassify(0, 1, 2, 3, 4.5, 5.0)); // expected-warning{{implicit conversion from 'double' to 'int' changes value from 4.5 to 4}} Index: lib/Sema/SemaChecking.cpp =================================================================== --- lib/Sema/SemaChecking.cpp +++ lib/Sema/SemaChecking.cpp @@ -839,6 +839,9 @@ case Builtin::BI__builtin_isinf_sign: case Builtin::BI__builtin_isnan: case Builtin::BI__builtin_isnormal: + case Builtin::BI__builtin_signbit: + case Builtin::BI__builtin_signbitf: + case Builtin::BI__builtin_signbitl: if (SemaBuiltinFPClassification(TheCall, 1)) return ExprError(); break;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits