[clang-tools-extra] r300569 - [clang-tidy] Fix google-explicit-constructor issue with out-of-line conversions
Alexander Kornienko via cfe-commits
cfe-commits at lists.llvm.org
Tue Apr 18 10:26:00 PDT 2017
Author: alexfh
Date: Tue Apr 18 12:26:00 2017
New Revision: 300569
URL: http://llvm.org/viewvc/llvm-project?rev=300569&view=rev
Log:
[clang-tidy] Fix google-explicit-constructor issue with out-of-line conversions
Modified:
clang-tools-extra/trunk/clang-tidy/google/ExplicitConstructorCheck.cpp
clang-tools-extra/trunk/test/clang-tidy/google-explicit-constructor.cpp
Modified: clang-tools-extra/trunk/clang-tidy/google/ExplicitConstructorCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/google/ExplicitConstructorCheck.cpp?rev=300569&r1=300568&r2=300569&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/google/ExplicitConstructorCheck.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/google/ExplicitConstructorCheck.cpp Tue Apr 18 12:26:00 2017
@@ -91,6 +91,8 @@ void ExplicitConstructorCheck::check(con
if (const auto *Conversion =
Result.Nodes.getNodeAs<CXXConversionDecl>("conversion")) {
+ if (Conversion->isOutOfLine())
+ return;
SourceLocation Loc = Conversion->getLocation();
// Ignore all macros until we learn to ignore specific ones (e.g. used in
// gmock to define matchers).
Modified: clang-tools-extra/trunk/test/clang-tidy/google-explicit-constructor.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/google-explicit-constructor.cpp?rev=300569&r1=300568&r2=300569&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/google-explicit-constructor.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/google-explicit-constructor.cpp Tue Apr 18 12:26:00 2017
@@ -46,9 +46,9 @@ struct A {
// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: copy constructor should not be declared explicit [google-explicit-constructor]
// CHECK-FIXES: {{^ }}A(const A& a) {}
- A(int x1) {}
+ A(int x1);
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: single-argument constructors must be marked explicit to avoid unintentional implicit conversions [google-explicit-constructor]
- // CHECK-FIXES: {{^ }}explicit A(int x1) {}
+ // CHECK-FIXES: {{^ }}explicit A(int x1);
A(double x2, double y = 3.14) {}
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructors that are callable with a single argument must be marked explicit to avoid unintentional implicit conversions [google-explicit-constructor]
@@ -60,6 +60,8 @@ struct A {
// CHECK-FIXES: {{^ }}explicit A(T&&... args);
};
+inline A::A(int x1) {}
+
struct B {
B(std::initializer_list<int> list1) {}
B(const std::initializer_list<unsigned> &list2) {}
@@ -69,6 +71,10 @@ struct B {
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'operator bool' must be marked explicit to avoid unintentional implicit conversions [google-explicit-constructor]
// CHECK-FIXES: {{^ }}explicit operator bool() const { return true; }
+ operator double() const;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'operator double' must be marked explicit to avoid unintentional implicit conversions [google-explicit-constructor]
+ // CHECK-FIXES: {{^ }}explicit operator double() const;
+
explicit B(::std::initializer_list<double> list4) {}
// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: initializer-list constructor should not be declared explicit [google-explicit-constructor]
// CHECK-FIXES: {{^ }}B(::std::initializer_list<double> list4) {}
@@ -82,6 +88,8 @@ struct B {
// CHECK-FIXES: {{^ }}B(::std::initializer_list<char> &&list6) {}
};
+inline B::operator double() const { return 0.0; }
+
struct StructWithFnPointer {
void (*f)();
} struct_with_fn_pointer = {[] {}};
More information about the cfe-commits
mailing list