From 529e3c7c5767a53f55ae7b1b5b42cae944da01ac Mon Sep 17 00:00:00 2001 From: Edwin Vane Date: Mon, 4 Mar 2013 16:56:04 +0000 Subject: Adding failing LoopConvert testcase LoopConvert isn't properly handling iterators whose dereference operator returns by value. This test case demonstrates the failure. See PR15437. llvm-svn: 176437 --- .../test/cpp11-migrate/LoopConvert/Inputs/structures.h | 13 +++++++++++++ .../test/cpp11-migrate/LoopConvert/iterator_failing.cpp | 14 ++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 clang-tools-extra/test/cpp11-migrate/LoopConvert/iterator_failing.cpp (limited to 'clang-tools-extra/test') diff --git a/clang-tools-extra/test/cpp11-migrate/LoopConvert/Inputs/structures.h b/clang-tools-extra/test/cpp11-migrate/LoopConvert/Inputs/structures.h index 2507b34200c..3379b05ac1e 100644 --- a/clang-tools-extra/test/cpp11-migrate/LoopConvert/Inputs/structures.h +++ b/clang-tools-extra/test/cpp11-migrate/LoopConvert/Inputs/structures.h @@ -137,4 +137,17 @@ struct Nested { iterator end(); }; +// Like llvm::SmallPtrSet, the iterator has a dereference operator that returns +// by value instead of by reference. +template +struct PtrSet { + struct iterator { + bool operator!=(const iterator &other) const; + const T operator*(); + iterator &operator++(); + }; + iterator begin() const; + iterator end() const; +}; + #endif // STRUCTURES_H diff --git a/clang-tools-extra/test/cpp11-migrate/LoopConvert/iterator_failing.cpp b/clang-tools-extra/test/cpp11-migrate/LoopConvert/iterator_failing.cpp new file mode 100644 index 00000000000..5684497f745 --- /dev/null +++ b/clang-tools-extra/test/cpp11-migrate/LoopConvert/iterator_failing.cpp @@ -0,0 +1,14 @@ +// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp +// RUN: cpp11-migrate -loop-convert %t.cpp -- -I %S/Inputs +// RUN: FileCheck -input-file=%t.cpp %s +// XFAIL: * +#include "structures.h" + +void f() { + // See PR15437 for details. + PtrSet int_ptrs; + for (PtrSet::iterator I = int_ptrs.begin(), + E = int_ptrs.end(); I != E; ++I) { + // CHECK: for (const auto & int_ptr : int_ptrs) { + } +} -- cgit v1.2.3