| // RUN: %check_clang_tidy -std=c++11-or-later %s abseil-upgrade-duration-conversions %t -- -- -I%S/Inputs |
| |
| using int64_t = long long; |
| |
| #include "absl/time/time.h" |
| |
| template <typename T> struct ConvertibleTo { |
| operator T() const; |
| }; |
| |
| template <typename T> |
| ConvertibleTo<T> operator+(ConvertibleTo<T>, ConvertibleTo<T>); |
| |
| template <typename T> |
| ConvertibleTo<T> operator*(ConvertibleTo<T>, ConvertibleTo<T>); |
| |
| void arithmeticOperatorBasicPositive() { |
| absl::Duration d; |
| d *= ConvertibleTo<int64_t>(); |
| // CHECK-MESSAGES: [[@LINE-1]]:8: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d *= static_cast<int64_t>(ConvertibleTo<int64_t>()); |
| d /= ConvertibleTo<int64_t>(); |
| // CHECK-MESSAGES: [[@LINE-1]]:8: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d /= static_cast<int64_t>(ConvertibleTo<int64_t>()); |
| d = ConvertibleTo<int64_t>() * d; |
| // CHECK-MESSAGES: [[@LINE-1]]:7: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d = static_cast<int64_t>(ConvertibleTo<int64_t>()) * d; |
| d = d * ConvertibleTo<int64_t>(); |
| // CHECK-MESSAGES: [[@LINE-1]]:11: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d = d * static_cast<int64_t>(ConvertibleTo<int64_t>()); |
| d = d / ConvertibleTo<int64_t>(); |
| // CHECK-MESSAGES: [[@LINE-1]]:11: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d = d / static_cast<int64_t>(ConvertibleTo<int64_t>()); |
| d.operator*=(ConvertibleTo<int64_t>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:16: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d.operator*=(static_cast<int64_t>(ConvertibleTo<int64_t>())); |
| d.operator/=(ConvertibleTo<int64_t>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:16: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d.operator/=(static_cast<int64_t>(ConvertibleTo<int64_t>())); |
| d = operator*(ConvertibleTo<int64_t>(), d); |
| // CHECK-MESSAGES: [[@LINE-1]]:17: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d = operator*(static_cast<int64_t>(ConvertibleTo<int64_t>()), d); |
| d = operator*(d, ConvertibleTo<int64_t>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:20: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d = operator*(d, static_cast<int64_t>(ConvertibleTo<int64_t>())); |
| d = operator/(d, ConvertibleTo<int64_t>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:20: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d = operator/(d, static_cast<int64_t>(ConvertibleTo<int64_t>())); |
| ConvertibleTo<int64_t> c; |
| d *= (c + c) * c + c; |
| // CHECK-MESSAGES: [[@LINE-1]]:8: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d *= static_cast<int64_t>((c + c) * c + c) |
| d /= (c + c) * c + c; |
| // CHECK-MESSAGES: [[@LINE-1]]:8: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d /= static_cast<int64_t>((c + c) * c + c) |
| d = d * c * c; |
| // CHECK-MESSAGES: [[@LINE-1]]:11: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-MESSAGES: [[@LINE-2]]:15: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d = d * static_cast<int64_t>(c) * static_cast<int64_t>(c) |
| d = c * d * c; |
| // CHECK-MESSAGES: [[@LINE-1]]:7: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-MESSAGES: [[@LINE-2]]:15: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d = static_cast<int64_t>(c) * d * static_cast<int64_t>(c) |
| d = d / c * c; |
| // CHECK-MESSAGES: [[@LINE-1]]:11: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-MESSAGES: [[@LINE-2]]:15: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d = d / static_cast<int64_t>(c) * static_cast<int64_t>(c) |
| } |
| |
| void arithmeticOperatorBasicNegative() { |
| absl::Duration d; |
| d *= char{1}; |
| d *= 1; |
| d *= int64_t{1}; |
| d *= 1.0f; |
| d *= 1.0; |
| d *= 1.0l; |
| d /= char{1}; |
| d /= 1; |
| d /= int64_t{1}; |
| d /= 1.0f; |
| d /= 1.0; |
| d /= 1.0l; |
| d = d * char{1}; |
| d = d * 1; |
| d = d * int64_t{1}; |
| d = d * 1.0f; |
| d = d * 1.0; |
| d = d * 1.0l; |
| d = char{1} * d; |
| d = 1 * d; |
| d = int64_t{1} * d; |
| d = 1.0f * d; |
| d = 1.0 * d; |
| d = 1.0l * d; |
| d = d / char{1}; |
| d = d / 1; |
| d = d / int64_t{1}; |
| d = d / 1.0f; |
| d = d / 1.0; |
| d = d / 1.0l; |
| |
| d *= static_cast<int>(ConvertibleTo<int>()); |
| d *= (int)ConvertibleTo<int>(); |
| d *= int(ConvertibleTo<int>()); |
| d /= static_cast<int>(ConvertibleTo<int>()); |
| d /= (int)ConvertibleTo<int>(); |
| d /= int(ConvertibleTo<int>()); |
| d = static_cast<int>(ConvertibleTo<int>()) * d; |
| d = (int)ConvertibleTo<int>() * d; |
| d = int(ConvertibleTo<int>()) * d; |
| d = d * static_cast<int>(ConvertibleTo<int>()); |
| d = d * (int)ConvertibleTo<int>(); |
| d = d * int(ConvertibleTo<int>()); |
| d = d / static_cast<int>(ConvertibleTo<int>()); |
| d = d / (int)ConvertibleTo<int>(); |
| d = d / int(ConvertibleTo<int>()); |
| |
| d *= 1 + ConvertibleTo<int>(); |
| d /= 1 + ConvertibleTo<int>(); |
| d = (1 + ConvertibleTo<int>()) * d; |
| d = d * (1 + ConvertibleTo<int>()); |
| d = d / (1 + ConvertibleTo<int>()); |
| } |
| |
| template <typename T> void templateForOpsSpecialization(T) {} |
| template <> |
| void templateForOpsSpecialization<absl::Duration>(absl::Duration d) { |
| d *= ConvertibleTo<int64_t>(); |
| // CHECK-MESSAGES: [[@LINE-1]]:8: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d *= static_cast<int64_t>(ConvertibleTo<int64_t>()); |
| } |
| |
| template <int N> void arithmeticNonTypeTemplateParamSpecialization() { |
| absl::Duration d; |
| d *= N; |
| } |
| |
| template <> void arithmeticNonTypeTemplateParamSpecialization<5>() { |
| absl::Duration d; |
| d *= ConvertibleTo<int>(); |
| // CHECK-MESSAGES: [[@LINE-1]]:8: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d *= static_cast<int64_t>(ConvertibleTo<int>()); |
| } |
| |
| template <typename T> void templateOpsFix() { |
| absl::Duration d; |
| d *= ConvertibleTo<int64_t>(); |
| // CHECK-MESSAGES: [[@LINE-1]]:8: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d *= static_cast<int64_t>(ConvertibleTo<int64_t>()); |
| } |
| |
| template <typename T, typename U> void templateOpsWarnOnly(T t, U u) { |
| t *= u; |
| // CHECK-MESSAGES: [[@LINE-1]]:8: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| absl::Duration d; |
| d *= u; |
| // CHECK-MESSAGES: [[@LINE-1]]:8: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| } |
| |
| template <typename T> struct TemplateTypeOpsWarnOnly { |
| void memberA(T t) { |
| d *= t; |
| // CHECK-MESSAGES: [[@LINE-1]]:10: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| } |
| template <typename U, typename V> void memberB(U u, V v) { |
| u *= v; |
| // CHECK-MESSAGES: [[@LINE-1]]:10: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| d *= v; |
| // CHECK-MESSAGES: [[@LINE-1]]:10: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| } |
| |
| absl::Duration d; |
| }; |
| |
| template <typename T, typename U> |
| void templateOpsInstantiationBeforeDefinition(T t, U u); |
| |
| void arithmeticOperatorsInTemplates() { |
| templateForOpsSpecialization(5); |
| templateForOpsSpecialization(absl::Duration()); |
| arithmeticNonTypeTemplateParamSpecialization<1>(); |
| arithmeticNonTypeTemplateParamSpecialization<5>(); |
| templateOpsFix<int>(); |
| templateOpsWarnOnly(absl::Duration(), ConvertibleTo<int>()); |
| templateOpsInstantiationBeforeDefinition(absl::Duration(), |
| ConvertibleTo<int>()); |
| TemplateTypeOpsWarnOnly<ConvertibleTo<int>> t; |
| t.memberA(ConvertibleTo<int>()); |
| t.memberB(absl::Duration(), ConvertibleTo<int>()); |
| } |
| |
| template <typename T, typename U> |
| void templateOpsInstantiationBeforeDefinition(T t, U u) { |
| t *= u; |
| // CHECK-MESSAGES: [[@LINE-1]]:8: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| absl::Duration d; |
| d *= u; |
| // CHECK-MESSAGES: [[@LINE-1]]:8: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| } |
| |
| #define FUNCTION_MACRO(x) x |
| #define CONVERTIBLE_TMP ConvertibleTo<int>() |
| #define ONLY_WARN_INSIDE_MACRO_ARITHMETIC_OP d *= ConvertibleTo<int>() |
| |
| #define T_OBJECT T() |
| #define T_CALL_EXPR d *= T() |
| |
| template <typename T> void arithmeticTemplateAndMacro() { |
| absl::Duration d; |
| d *= T_OBJECT; |
| // CHECK-MESSAGES: [[@LINE-1]]:8: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| d *= CONVERTIBLE_TMP; |
| // CHECK-MESSAGES: [[@LINE-1]]:8: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d *= static_cast<int64_t>(CONVERTIBLE_TMP); |
| T_CALL_EXPR; |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| } |
| |
| #define TEMPLATE_MACRO(type) \ |
| template <typename T> void TemplateInMacro(T t) { \ |
| type d; \ |
| d *= t; \ |
| } |
| |
| TEMPLATE_MACRO(absl::Duration) |
| // CHECK-MESSAGES: [[@LINE-1]]:1: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| |
| void arithmeticOperatorsInMacros() { |
| absl::Duration d; |
| d = FUNCTION_MACRO(d * ConvertibleTo<int>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:26: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d = FUNCTION_MACRO(d * static_cast<int64_t>(ConvertibleTo<int>())); |
| d *= FUNCTION_MACRO(ConvertibleTo<int>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:23: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d *= static_cast<int64_t>(FUNCTION_MACRO(ConvertibleTo<int>())); |
| d *= CONVERTIBLE_TMP; |
| // CHECK-MESSAGES: [[@LINE-1]]:8: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: d *= static_cast<int64_t>(CONVERTIBLE_TMP); |
| ONLY_WARN_INSIDE_MACRO_ARITHMETIC_OP; |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| arithmeticTemplateAndMacro<ConvertibleTo<int>>(); |
| TemplateInMacro(ConvertibleTo<int>()); |
| } |
| |
| void factoryFunctionPositive() { |
| // User defined conversion: |
| (void)absl::Nanoseconds(ConvertibleTo<int64_t>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:27: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Nanoseconds(static_cast<int64_t>(ConvertibleTo<int64_t>())); |
| (void)absl::Microseconds(ConvertibleTo<int64_t>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:28: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Microseconds(static_cast<int64_t>(ConvertibleTo<int64_t>())); |
| (void)absl::Milliseconds(ConvertibleTo<int64_t>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:28: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Milliseconds(static_cast<int64_t>(ConvertibleTo<int64_t>())); |
| (void)absl::Seconds(ConvertibleTo<int64_t>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:23: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Seconds(static_cast<int64_t>(ConvertibleTo<int64_t>())); |
| (void)absl::Minutes(ConvertibleTo<int64_t>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:23: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Minutes(static_cast<int64_t>(ConvertibleTo<int64_t>())); |
| (void)absl::Hours(ConvertibleTo<int64_t>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:21: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Hours(static_cast<int64_t>(ConvertibleTo<int64_t>())); |
| |
| // User defined conversion to integral type, followed by built-in conversion: |
| (void)absl::Nanoseconds(ConvertibleTo<char>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:27: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Nanoseconds(static_cast<int64_t>(ConvertibleTo<char>())); |
| (void)absl::Microseconds(ConvertibleTo<char>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:28: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Microseconds(static_cast<int64_t>(ConvertibleTo<char>())); |
| (void)absl::Milliseconds(ConvertibleTo<char>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:28: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Milliseconds(static_cast<int64_t>(ConvertibleTo<char>())); |
| (void)absl::Seconds(ConvertibleTo<char>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:23: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Seconds(static_cast<int64_t>(ConvertibleTo<char>())); |
| (void)absl::Minutes(ConvertibleTo<char>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:23: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Minutes(static_cast<int64_t>(ConvertibleTo<char>())); |
| (void)absl::Hours(ConvertibleTo<char>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:21: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Hours(static_cast<int64_t>(ConvertibleTo<char>())); |
| |
| // User defined conversion to floating point type, followed by built-in conversion: |
| (void)absl::Nanoseconds(ConvertibleTo<float>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:27: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Nanoseconds(static_cast<int64_t>(ConvertibleTo<float>())); |
| (void)absl::Microseconds(ConvertibleTo<float>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:28: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Microseconds(static_cast<int64_t>(ConvertibleTo<float>())); |
| (void)absl::Milliseconds(ConvertibleTo<float>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:28: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Milliseconds(static_cast<int64_t>(ConvertibleTo<float>())); |
| (void)absl::Seconds(ConvertibleTo<float>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:23: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Seconds(static_cast<int64_t>(ConvertibleTo<float>())); |
| (void)absl::Minutes(ConvertibleTo<float>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:23: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Minutes(static_cast<int64_t>(ConvertibleTo<float>())); |
| (void)absl::Hours(ConvertibleTo<float>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:21: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Hours(static_cast<int64_t>(ConvertibleTo<float>())); |
| } |
| |
| void factoryFunctionNegative() { |
| (void)absl::Nanoseconds(char{1}); |
| (void)absl::Nanoseconds(1); |
| (void)absl::Nanoseconds(int64_t{1}); |
| (void)absl::Nanoseconds(1.0f); |
| (void)absl::Microseconds(char{1}); |
| (void)absl::Microseconds(1); |
| (void)absl::Microseconds(int64_t{1}); |
| (void)absl::Microseconds(1.0f); |
| (void)absl::Milliseconds(char{1}); |
| (void)absl::Milliseconds(1); |
| (void)absl::Milliseconds(int64_t{1}); |
| (void)absl::Milliseconds(1.0f); |
| (void)absl::Seconds(char{1}); |
| (void)absl::Seconds(1); |
| (void)absl::Seconds(int64_t{1}); |
| (void)absl::Seconds(1.0f); |
| (void)absl::Minutes(char{1}); |
| (void)absl::Minutes(1); |
| (void)absl::Minutes(int64_t{1}); |
| (void)absl::Minutes(1.0f); |
| (void)absl::Hours(char{1}); |
| (void)absl::Hours(1); |
| (void)absl::Hours(int64_t{1}); |
| (void)absl::Hours(1.0f); |
| |
| (void)absl::Nanoseconds(static_cast<int>(ConvertibleTo<int>())); |
| (void)absl::Microseconds(static_cast<int>(ConvertibleTo<int>())); |
| (void)absl::Milliseconds(static_cast<int>(ConvertibleTo<int>())); |
| (void)absl::Seconds(static_cast<int>(ConvertibleTo<int>())); |
| (void)absl::Minutes(static_cast<int>(ConvertibleTo<int>())); |
| (void)absl::Hours(static_cast<int>(ConvertibleTo<int>())); |
| } |
| |
| template <typename T> void templateForFactorySpecialization(T) {} |
| template <> void templateForFactorySpecialization<ConvertibleTo<int>>(ConvertibleTo<int> c) { |
| (void)absl::Nanoseconds(c); |
| // CHECK-MESSAGES: [[@LINE-1]]:27: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Nanoseconds(static_cast<int64_t>(c)); |
| } |
| |
| template <int N> void factoryNonTypeTemplateParamSpecialization() { |
| (void)absl::Nanoseconds(N); |
| } |
| |
| template <> void factoryNonTypeTemplateParamSpecialization<5>() { |
| (void)absl::Nanoseconds(ConvertibleTo<int>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:27: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Nanoseconds(static_cast<int64_t>(ConvertibleTo<int>())); |
| } |
| |
| template <typename T> void templateFactoryFix() { |
| (void)absl::Nanoseconds(ConvertibleTo<int>()); |
| // CHECK-MESSAGES: [[@LINE-1]]:27: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Nanoseconds(static_cast<int64_t>(ConvertibleTo<int>())); |
| } |
| |
| template <typename T> void templateFactoryWarnOnly(T t) { |
| (void)absl::Nanoseconds(t); |
| // CHECK-MESSAGES: [[@LINE-1]]:27: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| } |
| |
| template <typename T> void templateFactoryInstantiationBeforeDefinition(T t); |
| |
| template <typename T> struct TemplateTypeFactoryWarnOnly { |
| void memberA(T t) { |
| (void)absl::Nanoseconds(t); |
| // CHECK-MESSAGES: [[@LINE-1]]:29: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| } |
| template <typename U> void memberB(U u) { |
| (void)absl::Nanoseconds(u); |
| // CHECK-MESSAGES: [[@LINE-1]]:29: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| } |
| }; |
| |
| void factoryInTemplates() { |
| templateForFactorySpecialization(5); |
| templateForFactorySpecialization(ConvertibleTo<int>()); |
| factoryNonTypeTemplateParamSpecialization<1>(); |
| factoryNonTypeTemplateParamSpecialization<5>(); |
| templateFactoryFix<int>(); |
| templateFactoryWarnOnly(ConvertibleTo<int>()); |
| templateFactoryInstantiationBeforeDefinition(ConvertibleTo<int>()); |
| TemplateTypeFactoryWarnOnly<ConvertibleTo<int>> t; |
| t.memberA(ConvertibleTo<int>()); |
| t.memberB(ConvertibleTo<int>()); |
| } |
| |
| template <typename T> void templateFactoryInstantiationBeforeDefinition(T t) { |
| (void)absl::Nanoseconds(t); |
| // CHECK-MESSAGES: [[@LINE-1]]:27: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| } |
| |
| #define ONLY_WARN_INSIDE_MACRO_FACTORY \ |
| (void)absl::Nanoseconds(ConvertibleTo<int>()) |
| #define T_CALL_FACTORTY_INSIDE_MACRO (void)absl::Nanoseconds(T()) |
| |
| template <typename T> void factoryTemplateAndMacro() { |
| (void)absl::Nanoseconds(T_OBJECT); |
| // CHECK-MESSAGES: [[@LINE-1]]:27: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| (void)absl::Nanoseconds(CONVERTIBLE_TMP); |
| // CHECK-MESSAGES: [[@LINE-1]]:27: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Nanoseconds(static_cast<int64_t>(CONVERTIBLE_TMP)) |
| T_CALL_FACTORTY_INSIDE_MACRO; |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| } |
| |
| #define TEMPLATE_FACTORY_MACRO(factory) \ |
| template <typename T> void TemplateFactoryInMacro(T t) { (void)factory(t); } |
| |
| TEMPLATE_FACTORY_MACRO(absl::Nanoseconds) |
| // CHECK-MESSAGES: [[@LINE-1]]:1: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| |
| void factoryInMacros() { |
| (void)absl::Nanoseconds(FUNCTION_MACRO(ConvertibleTo<int>())); |
| // CHECK-MESSAGES: [[@LINE-1]]:42: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Nanoseconds(static_cast<int64_t>(FUNCTION_MACRO(ConvertibleTo<int>()))); |
| (void)absl::Nanoseconds(CONVERTIBLE_TMP); |
| // CHECK-MESSAGES: [[@LINE-1]]:27: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| // CHECK-FIXES: (void)absl::Nanoseconds(static_cast<int64_t>(CONVERTIBLE_TMP)) |
| ONLY_WARN_INSIDE_MACRO_FACTORY; |
| // CHECK-MESSAGES: [[@LINE-1]]:3: warning: implicit conversion to 'int64_t' is deprecated in this context; use an explicit cast instead |
| factoryTemplateAndMacro<ConvertibleTo<int>>(); |
| TemplateFactoryInMacro(ConvertibleTo<int>()); |
| } |
| |
| // This is a reduced test-case for PR39949 and manifested in this check. |
| namespace std { |
| template <typename _Tp> |
| _Tp declval(); |
| |
| template <typename _Functor, typename... _ArgTypes> |
| struct __res { |
| template <typename... _Args> |
| static decltype(declval<_Functor>()(_Args()...)) _S_test(int); |
| |
| template <typename...> |
| static void _S_test(...); |
| |
| typedef decltype(_S_test<_ArgTypes...>(0)) type; |
| }; |
| |
| template <typename> |
| struct function; |
| |
| template <typename... _ArgTypes> |
| struct function<void(_ArgTypes...)> { |
| template <typename _Functor, |
| typename = typename __res<_Functor, _ArgTypes...>::type> |
| function(_Functor) {} |
| }; |
| } // namespace std |
| |
| typedef std::function<void(void)> F; |
| |
| F foo() { |
| return F([] {}); |
| } |