Explorar el Código

Stop mutating the original tests array when sorting. (#5387)

`FileTestCase` remembers its matching test by pointer, which breaks down
when `tests_` is sorted.
Jon Ross-Perkins hace 1 año
padre
commit
5eae636a33
Se han modificado 1 ficheros con 14 adiciones y 8 borrados
  1. 14 8
      testing/file_test/file_test_base.cpp

+ 14 - 8
testing/file_test/file_test_base.cpp

@@ -519,18 +519,24 @@ auto FileTestEventListener::OnTestProgramStart(
   // slowest tests.
   auto print_slowest_tests = absl::GetFlag(FLAGS_print_slowest_tests);
   if (run_count > 1 && print_slowest_tests != 0) {
+    // Sort in a copy so that `FileTestCase` pointers to the original tests
+    // remain stable.
+    llvm::SmallVector<const FileTestInfo*> sorted_tests(
+        llvm::make_pointer_range(tests_));
+    llvm::sort(sorted_tests,
+               [](const FileTestInfo* lhs, const FileTestInfo* rhs) {
+                 return lhs->elapsed_ms > rhs->elapsed_ms;
+               });
+
     llvm::errs() << "  Slowest tests:\n";
-    llvm::sort(tests_, [](const FileTestInfo& lhs, const FileTestInfo& rhs) {
-      return lhs.elapsed_ms > rhs.elapsed_ms;
-    });
     int count = print_slowest_tests > 0 ? print_slowest_tests : run_count;
-    for (const auto& test : tests_.take_front(count)) {
+    for (const auto* test : llvm::ArrayRef(sorted_tests).take_front(count)) {
       std::chrono::milliseconds run_ms(0);
-      if (test.test_result && test.test_result->ok()) {
-        run_ms = test.test_result.value()->run_elapsed_ms;
+      if (test->test_result && test->test_result->ok()) {
+        run_ms = test->test_result.value()->run_elapsed_ms;
       }
-      llvm::errs() << "  - " << test.test_name << ": "
-                   << test.elapsed_ms.count() << " ms, " << run_ms.count()
+      llvm::errs() << "  - " << test->test_name << ": "
+                   << test->elapsed_ms.count() << " ms, " << run_ms.count()
                    << " ms in Run\n";
     }
   }