diff options
Diffstat (limited to 'clang-tools-extra/test/cpp11-migrate/LoopConvert')
| -rw-r--r-- | clang-tools-extra/test/cpp11-migrate/LoopConvert/free_begin_end_fail.cpp | 32 | ||||
| -rw-r--r-- | clang-tools-extra/test/cpp11-migrate/LoopConvert/pseudoarray.cpp | 41 |
2 files changed, 72 insertions, 1 deletions
diff --git a/clang-tools-extra/test/cpp11-migrate/LoopConvert/free_begin_end_fail.cpp b/clang-tools-extra/test/cpp11-migrate/LoopConvert/free_begin_end_fail.cpp new file mode 100644 index 00000000000..27f7e8bf75e --- /dev/null +++ b/clang-tools-extra/test/cpp11-migrate/LoopConvert/free_begin_end_fail.cpp @@ -0,0 +1,32 @@ +// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp +// RUN: cpp11-migrate -loop-convert %t.cpp -- -I %S/Inputs -std=c++11 +// RUN: FileCheck -input-file=%t.cpp %s +// XFAIL: * + +struct MyArray { + unsigned size(); +}; + +template <typename T> +struct MyContainer { +}; + +int *begin(const MyArray &Arr); +int *end(const MyArray &Arr); + +template <typename T> +T *begin(const MyContainer<T> &C); +template <typename T> +T *end(const MyContainer<T> &C); + +// The Loop Convert Transform doesn't detect free functions begin()/end() and +// so fails to transform these cases which it should. +void f() { + MyArray Arr; + for (unsigned i = 0, e = Arr.size(); i < e; ++i) {} + // CHECK: for (auto & elem : Arr) {} + + MyContainer<int> C; + for (int *I = begin(C), *E = end(C); I != E; ++I) {} + // CHECK: for (auto & elem : C) {} +} diff --git a/clang-tools-extra/test/cpp11-migrate/LoopConvert/pseudoarray.cpp b/clang-tools-extra/test/cpp11-migrate/LoopConvert/pseudoarray.cpp index 37105f9e0b4..5aeaf79fc9f 100644 --- a/clang-tools-extra/test/cpp11-migrate/LoopConvert/pseudoarray.cpp +++ b/clang-tools-extra/test/cpp11-migrate/LoopConvert/pseudoarray.cpp @@ -1,5 +1,5 @@ // RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp -// RUN: cpp11-migrate -loop-convert %t.cpp -- -I %S/Inputs +// RUN: cpp11-migrate -loop-convert %t.cpp -- -I %S/Inputs -std=c++11 // RUN: FileCheck -input-file=%t.cpp %s #include "structures.h" @@ -64,3 +64,42 @@ void noContainer() { for (auto i = 0; i < v.size(); ++i) ; // CHECK: for (auto & elem : v) ; } + +struct NoBeginEnd { + unsigned size() const; +}; + +struct NoConstBeginEnd { + NoConstBeginEnd(); + unsigned size() const; + unsigned begin(); + unsigned end(); +}; + +struct ConstBeginEnd { + ConstBeginEnd(); + unsigned size() const; + unsigned begin() const; + unsigned end() const; +}; + +// Shouldn't transform pseudo-array uses if the container doesn't provide +// begin() and end() of the right const-ness. +void NoBeginEndTest() { + NoBeginEnd NBE; + for (unsigned i = 0, e = NBE.size(); i < e; ++i) {} + // CHECK: for (unsigned i = 0, e = NBE.size(); i < e; ++i) {} + + const NoConstBeginEnd const_NCBE; + for (unsigned i = 0, e = const_NCBE.size(); i < e; ++i) {} + // CHECK: for (unsigned i = 0, e = const_NCBE.size(); i < e; ++i) {} + + ConstBeginEnd CBE; + for (unsigned i = 0, e = CBE.size(); i < e; ++i) {} + // CHECK: for (auto & elem : CBE) {} + + const ConstBeginEnd const_CBE; + for (unsigned i = 0, e = const_CBE.size(); i < e; ++i) {} + // CHECK: for (auto & elem : const_CBE) {} +} + |

