diff options
author | Haojian Wu <hokein@google.com> | 2017-01-03 09:00:51 +0000 |
---|---|---|
committer | Haojian Wu <hokein@google.com> | 2017-01-03 09:00:51 +0000 |
commit | e5db80e76e1827e7334042c9d29ecc9b40229a10 (patch) | |
tree | 1242d30898f539ccb494784a971f9cf462e96309 /clang-tools-extra/test/clang-move | |
parent | d8e20280bf3ad20fcd660c678c1be8d236a8011b (diff) |
[clang-move] Only move used helper declarations.
Summary:
Instead of moving all the helper declarations blindly, this patch
implements an AST-based call graph solution to make clang-move only move used
helper decls to new.cc and remove unused decls in old.cc.
Depends on D27674.
Reviewers: ioeric
Subscribers: mgorny, cfe-commits
Differential Revision: https://reviews.llvm.org/D27673
Diffstat (limited to 'clang-tools-extra/test/clang-move')
5 files changed, 510 insertions, 10 deletions
diff --git a/clang-tools-extra/test/clang-move/Inputs/helper_decls_test.cpp b/clang-tools-extra/test/clang-move/Inputs/helper_decls_test.cpp new file mode 100644 index 00000000000..c4ec8074756 --- /dev/null +++ b/clang-tools-extra/test/clang-move/Inputs/helper_decls_test.cpp @@ -0,0 +1,78 @@ +#include "helper_decls_test.h" + +namespace { +class HelperC1 { +public: + static int I; +}; + +int HelperC1::I = 0; + +class HelperC2 {}; + +class HelperC3 { + public: + static int I; +}; + +int HelperC3::I = 0; + +void HelperFun1() {} + +void HelperFun2() { HelperFun1(); } + +const int K1 = 1; +} // namespace + +static const int K2 = 2; +static void HelperFun3() { K2; } + +namespace a { + +static const int K3 = 3; +static const int K4 = HelperC3::I; +static const int K5 = 5; +static const int K6 = 6; + +static void HelperFun4() {} +static void HelperFun6() {} + +void Class1::f() { HelperFun2(); } + +void Class2::f() { + HelperFun1(); + HelperFun3(); +} + +void Class3::f() { HelperC1::I; } + +void Class4::f() { HelperC2 c2; } + +void Class5::f() { + int Result = K1 + K2 + K3; + HelperFun4(); +} + +int Class6::f() { + int R = K4; + return R; +} + +int Class7::f() { + int R = K6; + return R; +} + +int Class7::g() { + HelperFun6(); + return 1; +} + +static int HelperFun5() { + int R = K5; + return R; +} + +void Fun1() { HelperFun5(); } + +} // namespace a diff --git a/clang-tools-extra/test/clang-move/Inputs/helper_decls_test.h b/clang-tools-extra/test/clang-move/Inputs/helper_decls_test.h new file mode 100644 index 00000000000..474e6b3c0dd --- /dev/null +++ b/clang-tools-extra/test/clang-move/Inputs/helper_decls_test.h @@ -0,0 +1,35 @@ +namespace a { +class Class1 { + void f(); +}; + +class Class2 { + void f(); +}; + +class Class3 { + void f(); +}; + +class Class4 { + void f(); +}; + +class Class5 { + void f(); +}; + +class Class6 { + int f(); +}; + +class Class7 { + int f(); + int g(); +}; + +void Fun1(); + +inline void Fun2() {} + +} // namespace a diff --git a/clang-tools-extra/test/clang-move/Inputs/multiple_class_test.cpp b/clang-tools-extra/test/clang-move/Inputs/multiple_class_test.cpp index 9075de6f658..5eb4bf31758 100644 --- a/clang-tools-extra/test/clang-move/Inputs/multiple_class_test.cpp +++ b/clang-tools-extra/test/clang-move/Inputs/multiple_class_test.cpp @@ -15,7 +15,7 @@ namespace { using a::Move1; using namespace a; static int k = 0; -} // anonymous namespace +} // namespace namespace b { using a::Move1; @@ -34,19 +34,19 @@ int Move3::f() { } int Move4::f() { - return 0; + return k; } int EnclosingMove5::a = 1; int EnclosingMove5::Nested::f() { - return 0; + return g; } int EnclosingMove5::Nested::b = 1; int NoMove::f() { static int F = 0; - return 0; + return g; } } // namespace c diff --git a/clang-tools-extra/test/clang-move/move-multiple-classes.cpp b/clang-tools-extra/test/clang-move/move-multiple-classes.cpp index 94cc16e31e3..821d5675ab1 100644 --- a/clang-tools-extra/test/clang-move/move-multiple-classes.cpp +++ b/clang-tools-extra/test/clang-move/move-multiple-classes.cpp @@ -25,8 +25,7 @@ // CHECK-OLD-TEST-CPP: namespace { // CHECK-OLD-TEST-CPP: using a::Move1; // CHECK-OLD-TEST-CPP: using namespace a; -// CHECK-OLD-TEST-CPP: static int k = 0; -// CHECK-OLD-TEST-CPP: } // anonymous namespace +// CHECK-OLD-TEST-CPP: } // namespace // CHECK-OLD-TEST-CPP: namespace b { // CHECK-OLD-TEST-CPP: using a::Move1; // CHECK-OLD-TEST-CPP: using namespace a; @@ -35,7 +34,7 @@ // CHECK-OLD-TEST-CPP: namespace c { // CHECK-OLD-TEST-CPP: int NoMove::f() { // CHECK-OLD-TEST-CPP: static int F = 0; -// CHECK-OLD-TEST-CPP: return 0; +// CHECK-OLD-TEST-CPP: return g; // CHECK-OLD-TEST-CPP: } // CHECK-OLD-TEST-CPP: } // namespace c @@ -85,7 +84,7 @@ // CHECK-NEW-TEST-CPP: using a::Move1; // CHECK-NEW-TEST-CPP: using namespace a; // CHECK-NEW-TEST-CPP: static int k = 0; -// CHECK-NEW-TEST-CPP: } // anonymous namespace +// CHECK-NEW-TEST-CPP: } // namespace // CHECK-NEW-TEST-CPP: namespace b { // CHECK-NEW-TEST-CPP: using a::Move1; // CHECK-NEW-TEST-CPP: using namespace a; @@ -98,8 +97,8 @@ // CHECK-NEW-TEST-CPP: using namespace b; // CHECK-NEW-TEST-CPP: return 0; // CHECK-NEW-TEST-CPP: } -// CHECK-NEW-TEST-CPP: int Move4::f() { return 0; } +// CHECK-NEW-TEST-CPP: int Move4::f() { return k; } // CHECK-NEW-TEST-CPP: int EnclosingMove5::a = 1; -// CHECK-NEW-TEST-CPP: int EnclosingMove5::Nested::f() { return 0; } +// CHECK-NEW-TEST-CPP: int EnclosingMove5::Nested::f() { return g; } // CHECK-NEW-TEST-CPP: int EnclosingMove5::Nested::b = 1; // CHECK-NEW-TEST-CPP: } // namespace c diff --git a/clang-tools-extra/test/clang-move/move-used-helper-decls.cpp b/clang-tools-extra/test/clang-move/move-used-helper-decls.cpp new file mode 100644 index 00000000000..c8594729584 --- /dev/null +++ b/clang-tools-extra/test/clang-move/move-used-helper-decls.cpp @@ -0,0 +1,388 @@ +// RUN: mkdir -p %T/used-helper-decls +// RUN: cp %S/Inputs/helper_decls_test* %T/used-helper-decls/ +// RUN: cd %T/used-helper-decls + +// ---------------------------------------------------------------------------- +// Test moving used helper function and its transively used functions. +// ---------------------------------------------------------------------------- +// RUN: clang-move -names="a::Class1" -new_cc=%T/used-helper-decls/new_helper_decls_test.cpp -new_header=%T/used-helper-decls/new_helper_decls_test.h -old_cc=%T/used-helper-decls/helper_decls_test.cpp -old_header=../used-helper-decls/helper_decls_test.h %T/used-helper-decls/helper_decls_test.cpp -- -std=c++11 +// RUN: FileCheck -input-file=%T/used-helper-decls/new_helper_decls_test.cpp -check-prefix=CHECK-NEW-CLASS1-CPP %s +// RUN: FileCheck -input-file=%T/used-helper-decls/helper_decls_test.cpp -check-prefix=CHECK-OLD-CLASS1-CPP %s + +// CHECK-NEW-CLASS1-CPP: #include "{{.*}}new_helper_decls_test.h" +// CHECK-NEW-CLASS1-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS1-CPP-NEXT: namespace { +// CHECK-NEW-CLASS1-CPP-NEXT: void HelperFun1() {} +// CHECK-NEW-CLASS1-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS1-CPP-NEXT: void HelperFun2() { HelperFun1(); } +// CHECK-NEW-CLASS1-CPP-NEXT: } // namespace +// CHECK-NEW-CLASS1-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS1-CPP-NEXT: namespace a { +// CHECK-NEW-CLASS1-CPP-NEXT: void Class1::f() { HelperFun2(); } +// CHECK-NEW-CLASS1-CPP-NEXT: } // namespace a +// +// CHECK-OLD-CLASS1-CPP: void HelperFun1() {} +// CHECK-OLD-CLASS1-CPP-NOT: void HelperFun2() { HelperFun1(); } +// CHECK-OLD-CLASS1-CPP-NOT: void Class1::f() { HelperFun2(); } +// CHECK-OLD-CLASS1-CPP: void Class2::f() { +// CHECK-OLD-CLASS1-CPP: HelperFun1(); + + +// ---------------------------------------------------------------------------- +// Test moving used helper function and its transively used static variables. +// ---------------------------------------------------------------------------- +// RUN: cp %S/Inputs/helper_decls_test* %T/used-helper-decls/ +// RUN: clang-move -names="a::Class2" -new_cc=%T/used-helper-decls/new_helper_decls_test.cpp -new_header=%T/used-helper-decls/new_helper_decls_test.h -old_cc=%T/used-helper-decls/helper_decls_test.cpp -old_header=../used-helper-decls/helper_decls_test.h %T/used-helper-decls/helper_decls_test.cpp -- -std=c++11 +// RUN: FileCheck -input-file=%T/used-helper-decls/new_helper_decls_test.cpp -check-prefix=CHECK-NEW-CLASS2-CPP %s +// RUN: FileCheck -input-file=%T/used-helper-decls/helper_decls_test.cpp -check-prefix=CHECK-OLD-CLASS2-CPP %s + +// CHECK-NEW-CLASS2-CPP: #include "{{.*}}new_helper_decls_test.h" +// CHECK-NEW-CLASS2-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS2-CPP-NEXT: namespace { +// CHECK-NEW-CLASS2-CPP-NEXT: void HelperFun1() {} +// CHECK-NEW-CLASS2-CPP-NEXT: } // namespace +// CHECK-NEW-CLASS2-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS2-CPP-NEXT: static const int K2 = 2; +// CHECK-NEW-CLASS2-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS2-CPP-NEXT: static void HelperFun3() { K2; } +// CHECK-NEW-CLASS2-CPP-NEXT: namespace a { +// CHECK-NEW-CLASS2-CPP-NEXT: void Class2::f() { +// CHECK-NEW-CLASS2-CPP-NEXT: HelperFun1(); +// CHECK-NEW-CLASS2-CPP-NEXT: HelperFun3(); +// CHECK-NEW-CLASS2-CPP-NEXT: } +// CHECK-NEW-CLASS2-CPP-NEXT: } // namespace a + +// CHECK-OLD-CLASS2-CPP: void HelperFun1() {} +// CHECK-OLD-CLASS2-CPP: void HelperFun2() { HelperFun1(); } +// CHECK-OLD-CLASS2-CPP: const int K1 = 1; +// CHECK-OLD-CLASS2-CPP: static const int K2 = 2; +// CHECK-OLD-CLASS2-CPP-NOT: static void HelperFun3() { K2; } +// CHECK-OLD-CLASS2-CPP-NOT: void Class2::f() { +// CHECK-OLD-CLASS2-CPP-NOT: HelperFun1(); +// CHECK-OLD-CLASS2-CPP-NOT: HelperFun3(); +// CHECK-OLD-CLASS2-CPP: void Class5::f() { +// CHECK-OLD-CLASS2-CPP-NEXT: int Result = K1 + K2 + K3; + + +// ---------------------------------------------------------------------------- +// Test using a static member variable of a helper class. +// ---------------------------------------------------------------------------- +// RUN: cp %S/Inputs/helper_decls_test* %T/used-helper-decls/ +// RUN: clang-move -names="a::Class3" -new_cc=%T/used-helper-decls/new_helper_decls_test.cpp -new_header=%T/used-helper-decls/new_helper_decls_test.h -old_cc=%T/used-helper-decls/helper_decls_test.cpp -old_header=../used-helper-decls/helper_decls_test.h %T/used-helper-decls/helper_decls_test.cpp -- -std=c++11 +// RUN: FileCheck -input-file=%T/used-helper-decls/new_helper_decls_test.cpp -check-prefix=CHECK-NEW-CLASS3-CPP %s +// RUN: FileCheck -input-file=%T/used-helper-decls/helper_decls_test.cpp -check-prefix=CHECK-OLD-CLASS3-CPP %s + +// CHECK-NEW-CLASS3-CPP: #include "{{.*}}new_helper_decls_test.h" +// CHECK-NEW-CLASS3-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS3-CPP-NEXT: namespace { +// CHECK-NEW-CLASS3-CPP-NEXT: class HelperC1 { +// CHECK-NEW-CLASS3-CPP-NEXT: public: +// CHECK-NEW-CLASS3-CPP-NEXT: static int I; +// CHECK-NEW-CLASS3-CPP-NEXT: }; +// CHECK-NEW-CLASS3-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS3-CPP-NEXT: int HelperC1::I = 0; +// CHECK-NEW-CLASS3-CPP-NEXT: } // namespace +// CHECK-NEW-CLASS3-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS3-CPP-NEXT: namespace a { +// CHECK-NEW-CLASS3-CPP-NEXT: void Class3::f() { HelperC1::I; } +// CHECK-NEW-CLASS3-CPP-NEXT: } // namespace a + +// CHECK-OLD-CLASS3-CPP: namespace { +// CHECK-OLD-CLASS3-CPP-NOT: class HelperC1 { +// CHECK-OLD-CLASS3-CPP-NOT: public: +// CHECK-OLD-CLASS3-CPP-NOT: static int I; +// CHECK-OLD-CLASS3-CPP-NOT: }; +// CHECK-OLD-CLASS3-CPP-NOT: int HelperC1::I = 0; +// CHECK-OLD-CLASS3-CPP: class HelperC2 {}; + + +// ---------------------------------------------------------------------------- +// Test moving helper classes. +// ---------------------------------------------------------------------------- +// RUN: cp %S/Inputs/helper_decls_test* %T/used-helper-decls/ +// RUN: clang-move -names="a::Class4" -new_cc=%T/used-helper-decls/new_helper_decls_test.cpp -new_header=%T/used-helper-decls/new_helper_decls_test.h -old_cc=%T/used-helper-decls/helper_decls_test.cpp -old_header=../used-helper-decls/helper_decls_test.h %T/used-helper-decls/helper_decls_test.cpp -- -std=c++11 +// RUN: FileCheck -input-file=%T/used-helper-decls/new_helper_decls_test.cpp -check-prefix=CHECK-NEW-CLASS4-CPP %s +// RUN: FileCheck -input-file=%T/used-helper-decls/helper_decls_test.cpp -check-prefix=CHECK-OLD-CLASS4-CPP %s + +// CHECK-NEW-CLASS4-CPP: #include "{{.*}}new_helper_decls_test.h" +// CHECK-NEW-CLASS4-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS4-CPP-NEXT: namespace { +// CHECK-NEW-CLASS4-CPP-NEXT: class HelperC2 {}; +// CHECK-NEW-CLASS4-CPP-NEXT: } // namespace +// CHECK-NEW-CLASS4-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS4-CPP-NEXT: namespace a { +// CHECK-NEW-CLASS4-CPP-NEXT: void Class4::f() { HelperC2 c2; } +// CHECK-NEW-CLASS4-CPP-NEXT: } // namespace a + +// CHECK-OLD-CLASS4-CPP-NOT: class HelperC2 {}; + + +// ---------------------------------------------------------------------------- +// Test moving helper variables and helper functions together. +// ---------------------------------------------------------------------------- +// RUN: cp %S/Inputs/helper_decls_test* %T/used-helper-decls/ +// RUN: clang-move -names="a::Class5" -new_cc=%T/used-helper-decls/new_helper_decls_test.cpp -new_header=%T/used-helper-decls/new_helper_decls_test.h -old_cc=%T/used-helper-decls/helper_decls_test.cpp -old_header=../used-helper-decls/helper_decls_test.h %T/used-helper-decls/helper_decls_test.cpp -- -std=c++11 +// RUN: FileCheck -input-file=%T/used-helper-decls/new_helper_decls_test.cpp -check-prefix=CHECK-NEW-CLASS5-CPP %s +// RUN: FileCheck -input-file=%T/used-helper-decls/helper_decls_test.cpp -check-prefix=CHECK-OLD-CLASS5-CPP %s + +// CHECK-NEW-CLASS5-CPP: #include "{{.*}}new_helper_decls_test.h" +// CHECK-NEW-CLASS5-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS5-CPP-NEXT: namespace { +// CHECK-NEW-CLASS5-CPP-NEXT: const int K1 = 1; +// CHECK-NEW-CLASS5-CPP-NEXT: } // namespace +// CHECK-NEW-CLASS5-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS5-CPP-NEXT: static const int K2 = 2; +// CHECK-NEW-CLASS5-CPP-NEXT: namespace a { +// CHECK-NEW-CLASS5-CPP-NEXT: static const int K3 = 3; +// CHECK-NEW-CLASS5-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS5-CPP-NEXT: static void HelperFun4() {} +// CHECK-NEW-CLASS5-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS5-CPP-NEXT: void Class5::f() { +// CHECK-NEW-CLASS5-CPP-NEXT: int Result = K1 + K2 + K3; +// CHECK-NEW-CLASS5-CPP-NEXT: HelperFun4(); +// CHECK-NEW-CLASS5-CPP-NEXT: } +// CHECK-NEW-CLASS5-CPP-NEXT: } // namespace a + +// CHECK-OLD-CLASS5-CPP-NOT: const int K1 = 1; +// CHECK-OLD-CLASS5-CPP: static const int K2 = 2; +// CHECK-OLD-CLASS5-CPP: static void HelperFun3() { K2; } +// CHECK-OLD-CLASS5-CPP: static const int K4 = HelperC3::I; +// CHECK-OLD-CLASS5-CPP-NOT: void Class5::f() { + + +// ---------------------------------------------------------------------------- +// Test moving helper variables and their transively used helper classes. +// ---------------------------------------------------------------------------- +// RUN: cp %S/Inputs/helper_decls_test* %T/used-helper-decls/ +// RUN: clang-move -names="a::Class6" -new_cc=%T/used-helper-decls/new_helper_decls_test.cpp -new_header=%T/used-helper-decls/new_helper_decls_test.h -old_cc=%T/used-helper-decls/helper_decls_test.cpp -old_header=../used-helper-decls/helper_decls_test.h %T/used-helper-decls/helper_decls_test.cpp -- -std=c++11 +// RUN: FileCheck -input-file=%T/used-helper-decls/new_helper_decls_test.cpp -check-prefix=CHECK-NEW-CLASS6-CPP %s +// RUN: FileCheck -input-file=%T/used-helper-decls/helper_decls_test.cpp -check-prefix=CHECK-OLD-CLASS6-CPP %s + +// CHECK-NEW-CLASS6-CPP: #include "{{.*}}new_helper_decls_test.h" +// CHECK-NEW-CLASS6-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS6-CPP-NEXT: namespace { +// CHECK-NEW-CLASS6-CPP-NEXT: class HelperC3 { +// CHECK-NEW-CLASS6-CPP-NEXT: public: +// CHECK-NEW-CLASS6-CPP-NEXT: static int I; +// CHECK-NEW-CLASS6-CPP-NEXT: }; +// CHECK-NEW-CLASS6-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS6-CPP-NEXT: int HelperC3::I = 0; +// CHECK-NEW-CLASS6-CPP-NEXT: } // namespace +// CHECK-NEW-CLASS6-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS6-CPP-NEXT: namespace a { +// CHECK-NEW-CLASS6-CPP-NEXT: static const int K4 = HelperC3::I; +// CHECK-NEW-CLASS6-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS6-CPP-NEXT: int Class6::f() { +// CHECK-NEW-CLASS6-CPP-NEXT: int R = K4; +// CHECK-NEW-CLASS6-CPP-NEXT: return R; +// CHECK-NEW-CLASS6-CPP-NEXT: } +// CHECK-NEW-CLASS6-CPP-NEXT: } // namespace a + +// CHECK-OLD-CLASS6-CPP-NOT: class HelperC3 { +// CHECK-OLD-CLASS6-CPP-NOT: int HelperC3::I = 0; +// CHECK-OLD-CLASS6-CPP-NOT: static const int K4 = HelperC3::I; + + +// ---------------------------------------------------------------------------- +// Test moving classes where its methods use helpers. +// ---------------------------------------------------------------------------- +// RUN: cp %S/Inputs/helper_decls_test* %T/used-helper-decls/ +// RUN: clang-move -names="a::Class7" -new_cc=%T/used-helper-decls/new_helper_decls_test.cpp -new_header=%T/used-helper-decls/new_helper_decls_test.h -old_cc=%T/used-helper-decls/helper_decls_test.cpp -old_header=../used-helper-decls/helper_decls_test.h %T/used-helper-decls/helper_decls_test.cpp -- -std=c++11 +// RUN: FileCheck -input-file=%T/used-helper-decls/new_helper_decls_test.cpp -check-prefix=CHECK-NEW-CLASS7-CPP %s +// RUN: FileCheck -input-file=%T/used-helper-decls/helper_decls_test.cpp -check-prefix=CHECK-OLD-CLASS7-CPP %s + +// CHECK-NEW-CLASS7-CPP: #include "{{.*}}new_helper_decls_test.h" +// CHECK-NEW-CLASS7-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS7-CPP-NEXT: namespace a { +// CHECK-NEW-CLASS7-CPP-NEXT: static const int K6 = 6; +// CHECK-NEW-CLASS7-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS7-CPP-NEXT: static void HelperFun6() {} +// CHECK-NEW-CLASS7-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS7-CPP-NEXT: int Class7::f() { +// CHECK-NEW-CLASS7-CPP-NEXT: int R = K6; +// CHECK-NEW-CLASS7-CPP-NEXT: return R; +// CHECK-NEW-CLASS7-CPP-NEXT: } +// CHECK-NEW-CLASS7-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CLASS7-CPP-NEXT: int Class7::g() { +// CHECK-NEW-CLASS7-CPP-NEXT: HelperFun6(); +// CHECK-NEW-CLASS7-CPP-NEXT: return 1; +// CHECK-NEW-CLASS7-CPP-NEXT: } +// CHECK-NEW-CLASS7-CPP-NEXT: } // namespace a +// +// CHECK-OLD-CLASS7-CPP-NOT: static const int K6 = 6; +// CHECK-OLD-CLASS7-CPP-NOT: static void HelperFun6() {} +// CHECK-OLD-CLASS7-CPP-NOT: int Class7::f() { +// CHECK-OLD-CLASS7-CPP-NOT: int Class7::g() { + + +// ---------------------------------------------------------------------------- +// Test moving helper function and its transively used helper variables. +// ---------------------------------------------------------------------------- +// RUN: cp %S/Inputs/helper_decls_test* %T/used-helper-decls/ +// RUN: clang-move -names="a::Fun1" -new_cc=%T/used-helper-decls/new_helper_decls_test.cpp -new_header=%T/used-helper-decls/new_helper_decls_test.h -old_cc=%T/used-helper-decls/helper_decls_test.cpp -old_header=../used-helper-decls/helper_decls_test.h %T/used-helper-decls/helper_decls_test.cpp -- -std=c++11 +// RUN: FileCheck -input-file=%T/used-helper-decls/new_helper_decls_test.cpp -check-prefix=CHECK-NEW-FUN1-CPP %s +// RUN: FileCheck -input-file=%T/used-helper-decls/helper_decls_test.cpp -check-prefix=CHECK-OLD-FUN1-CPP %s + +// CHECK-NEW-FUN1-CPP: #include "{{.*}}new_helper_decls_test.h" +// CHECK-NEW-FUN1-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-FUN1-CPP-NEXT: namespace a { +// CHECK-NEW-FUN1-CPP-NEXT: static const int K5 = 5; +// CHECK-NEW-FUN1-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-FUN1-CPP-NEXT: static int HelperFun5() { +// CHECK-NEW-FUN1-CPP-NEXT: int R = K5; +// CHECK-NEW-FUN1-CPP-NEXT: return R; +// CHECK-NEW-FUN1-CPP-NEXT: } +// CHECK-NEW-FUN1-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-FUN1-CPP-NEXT: void Fun1() { HelperFun5(); } +// CHECK-NEW-FUN1-CPP-NEXT: } // namespace a + +// CHECK-OLD-FUN1-CPP-NOT: static const int K5 = 5; +// CHECK-OLD-FUN1-CPP-NOT: static int HelperFun5() { +// CHECK-OLD-FUN1-CPP-NOT: void Fun1() { HelperFun5(); } + + +// ---------------------------------------------------------------------------- +// Test no moving helpers when moving inline functions in header. +// ---------------------------------------------------------------------------- +// RUN: cp %S/Inputs/helper_decls_test* %T/used-helper-decls/ +// RUN: clang-move -names="a::Fun2" -new_cc=%T/used-helper-decls/new_helper_decls_test.cpp -new_header=%T/used-helper-decls/new_helper_decls_test.h -old_cc=%T/used-helper-decls/helper_decls_test.cpp -old_header=../used-helper-decls/helper_decls_test.h %T/used-helper-decls/helper_decls_test.cpp -- -std=c++11 +// RUN: FileCheck -input-file=%T/used-helper-decls/new_helper_decls_test.cpp -check-prefix=CHECK-NEW-FUN2-CPP %s +// RUN: FileCheck -input-file=%T/used-helper-decls/new_helper_decls_test.h -check-prefix=CHECK-NEW-FUN2-H %s +// RUN: FileCheck -input-file=%T/used-helper-decls/helper_decls_test.h -check-prefix=CHECK-OLD-FUN2-H %s + +// CHECK-NEW-FUN2-H: namespace a { +// CHECK-NEW-FUN2-H-NEXT: inline void Fun2() {} +// CHECK-NEW-FUN2-H-NEXT: } // namespace a + +// CHECK-NEW-FUN2-CPP: #include "{{.*}}new_helper_decls_test.h" +// CHECK-NEW-FUN2-CPP-SAME: {{[[:space:]]}} + +// CHECK-OLD-FUN2-H-NOT: inline void Fun2() {} + + +// ---------------------------------------------------------------------------- +// Test moving all symbols in headers. +// ---------------------------------------------------------------------------- +// RUN: cp %S/Inputs/helper_decls_test* %T/used-helper-decls/ +// RUN: clang-move -names="a::Class1, a::Class2, a::Class3, a::Class4, a::Class5, a::Class5, a::Class6, a::Class7, a::Fun1, a::Fun2" -new_cc=%T/used-helper-decls/new_helper_decls_test.cpp -new_header=%T/used-helper-decls/new_helper_decls_test.h -old_cc=%T/used-helper-decls/helper_decls_test.cpp -old_header=../used-helper-decls/helper_decls_test.h %T/used-helper-decls/helper_decls_test.cpp -- -std=c++11 +// RUN: FileCheck -input-file=%T/used-helper-decls/new_helper_decls_test.h -check-prefix=CHECK-NEW-H %s +// RUN: FileCheck -input-file=%T/used-helper-decls/new_helper_decls_test.cpp -check-prefix=CHECK-NEW-CPP %s +// RUN: FileCheck -input-file=%T/used-helper-decls/helper_decls_test.h -allow-empty -check-prefix=CHECK-EMPTY %s +// RUN: FileCheck -input-file=%T/used-helper-decls/helper_decls_test.cpp -allow-empty -check-prefix=CHECK-EMPTY %s + + +// CHECK-NEW-H: namespace a { +// CHECK-NEW-H-NEXT: class Class1 { +// CHECK-NEW-H-NEXT: void f(); +// CHECK-NEW-H-NEXT: }; +// CHECK-NEW-H-SAME: {{[[:space:]]}} +// CHECK-NEW-H-NEXT: class Class2 { +// CHECK-NEW-H-NEXT: void f(); +// CHECK-NEW-H-NEXT: }; +// CHECK-NEW-H-SAME: {{[[:space:]]}} +// CHECK-NEW-H-NEXT: class Class3 { +// CHECK-NEW-H-NEXT: void f(); +// CHECK-NEW-H-NEXT: }; +// CHECK-NEW-H-SAME: {{[[:space:]]}} +// CHECK-NEW-H-NEXT: class Class4 { +// CHECK-NEW-H-NEXT: void f(); +// CHECK-NEW-H-NEXT: }; +// CHECK-NEW-H-SAME: {{[[:space:]]}} +// CHECK-NEW-H-NEXT: class Class5 { +// CHECK-NEW-H-NEXT: void f(); +// CHECK-NEW-H-NEXT: }; +// CHECK-NEW-H-SAME: {{[[:space:]]}} +// CHECK-NEW-H-NEXT: class Class6 { +// CHECK-NEW-H-NEXT: int f(); +// CHECK-NEW-H-NEXT: }; +// CHECK-NEW-H-SAME: {{[[:space:]]}} +// CHECK-NEW-H-NEXT: class Class7 { +// CHECK-NEW-H-NEXT: int f(); +// CHECK-NEW-H-NEXT: int g(); +// CHECK-NEW-H-NEXT: }; +// CHECK-NEW-H-SAME: {{[[:space:]]}} +// CHECK-NEW-H-NEXT: void Fun1(); +// CHECK-NEW-H-SAME: {{[[:space:]]}} +// CHECK-NEW-H-NEXT: inline void Fun2() {} +// CHECK-NEW-H-SAME: {{[[:space:]]}} +// CHECK-NEW-H-NEXT: } // namespace a + + +// CHECK-NEW-CPP: namespace { +// CHECK-NEW-CPP-NEXT: class HelperC1 { +// CHECK-NEW-CPP-NEXT: public: +// CHECK-NEW-CPP-NEXT: static int I; +// CHECK-NEW-CPP-NEXT: }; +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: int HelperC1::I = 0; +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: class HelperC2 {}; +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: class HelperC3 { +// CHECK-NEW-CPP-NEXT: public: +// CHECK-NEW-CPP-NEXT: static int I; +// CHECK-NEW-CPP-NEXT: }; +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: int HelperC3::I = 0; +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: void HelperFun1() {} +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: void HelperFun2() { HelperFun1(); } +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: const int K1 = 1; +// CHECK-NEW-CPP-NEXT: } // namespace +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: static const int K2 = 2; +// CHECK-NEW-CPP-NEXT: static void HelperFun3() { K2; } +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: namespace a { +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: static const int K3 = 3; +// CHECK-NEW-CPP-NEXT: static const int K4 = HelperC3::I; +// CHECK-NEW-CPP-NEXT: static const int K5 = 5; +// CHECK-NEW-CPP-NEXT: static const int K6 = 6; +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: static void HelperFun4() {} +// CHECK-NEW-CPP-NEXT: static void HelperFun6() {} +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: void Class1::f() { HelperFun2(); } +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: void Class2::f() { +// CHECK-NEW-CPP-NEXT: HelperFun1(); +// CHECK-NEW-CPP-NEXT: HelperFun3(); +// CHECK-NEW-CPP-NEXT: } +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: void Class3::f() { HelperC1::I; } +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: void Class4::f() { HelperC2 c2; } +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: void Class5::f() { +// CHECK-NEW-CPP-NEXT: int Result = K1 + K2 + K3; +// CHECK-NEW-CPP-NEXT: HelperFun4(); +// CHECK-NEW-CPP-NEXT: } +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: int Class6::f() { +// CHECK-NEW-CPP-NEXT: int R = K4; +// CHECK-NEW-CPP-NEXT: return R; +// CHECK-NEW-CPP-NEXT: } +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: int Class7::f() { +// CHECK-NEW-CPP-NEXT: int R = K6; +// CHECK-NEW-CPP-NEXT: return R; +// CHECK-NEW-CPP-NEXT: } +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: int Class7::g() { +// CHECK-NEW-CPP-NEXT: HelperFun6(); +// CHECK-NEW-CPP-NEXT: return 1; +// CHECK-NEW-CPP-NEXT: } +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: static int HelperFun5() { +// CHECK-NEW-CPP-NEXT: int R = K5; +// CHECK-NEW-CPP-NEXT: return R; +// CHECK-NEW-CPP-NEXT: } +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: void Fun1() { HelperFun5(); } +// CHECK-NEW-CPP-SAME: {{[[:space:]]}} +// CHECK-NEW-CPP-NEXT: } // namespace a + +// CHECK-EMPTY: {{^}}{{$}} |