From: Richard Trieu Date: Mon, 14 May 2018 23:21:48 +0000 (+0000) Subject: Enable control flow pruning of float overflow warnings. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1680f6cae0743d6cb02267464e15c91ad031abc2;p=clang Enable control flow pruning of float overflow warnings. Like other conversion warnings, allow float overflow warnings to be disabled in known dead paths of template instantiation. This often occurs when a template template type is a numeric type and the template will check the range of the numeric type before performing the conversion. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@332310 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 74ecf5fef7..f8ab8a6b38 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -9673,7 +9673,8 @@ static void DiagnoseFloatingImpCast(Sema &S, Expr *E, QualType T, return DiagnoseImpCast( S, E, T, CContext, IsLiteral ? diag::warn_impcast_literal_float_to_integer_out_of_range - : diag::warn_impcast_float_to_integer_out_of_range); + : diag::warn_impcast_float_to_integer_out_of_range, + PruneWarnings); unsigned DiagID = 0; if (IsLiteral) { diff --git a/test/SemaCXX/warn-float-conversion.cpp b/test/SemaCXX/warn-float-conversion.cpp index 2e89acb3d6..a3d178622c 100644 --- a/test/SemaCXX/warn-float-conversion.cpp +++ b/test/SemaCXX/warn-float-conversion.cpp @@ -89,4 +89,38 @@ void TestOverflow() { char e = 1.0 / 0.0; // expected-warning{{implicit conversion of out of range value from 'double' to 'char' is undefined}} } + + +template +class Check { + public: + static constexpr bool Safe(); +}; + +template<> +constexpr bool Check::Safe() { return false; } + +template<> +constexpr bool Check::Safe() { return true; } + +template +T run1(T t) { + const float ret = 800; + return ret; // expected-warning {{implicit conversion of out of range value from 'const float' to 'char' is undefined}} +} + +template +T run2(T t) { + const float ret = 800; + if (Check::Safe()) + return ret; + else + return t; +} + +void test() { + float a = run1(a) + run2(a); + char b = run1(b) + run2(b); // expected-note {{in instantiation of function template specialization 'run1' requested here}} +} + #endif // OVERFLOW