From 1680f6cae0743d6cb02267464e15c91ad031abc2 Mon Sep 17 00:00:00 2001 From: Richard Trieu Date: Mon, 14 May 2018 23:21:48 +0000 Subject: [PATCH] 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 --- lib/Sema/SemaChecking.cpp | 3 ++- test/SemaCXX/warn-float-conversion.cpp | 34 ++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) 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 -- 2.40.0