[libcxx-commits] [libcxx] [libc++] Replace a few .compile.fail.cpp tests by proper clang-verify tests (PR #167346)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Nov 10 09:15:34 PST 2025
https://github.com/ldionne created https://github.com/llvm/llvm-project/pull/167346
We want to eliminate all .compile.fail.cpp tests since they are brittle: these tests pass regardless of the specific compilation error, which means that e.g. a mising include will render the test null.
This is not an exhaustive pass, just a few tests I stumbled upon.
>From 9b0386b96614ca4567694dc2ad85a00c82eb7e6c Mon Sep 17 00:00:00 2001
From: Louis Dionne <ldionne.2 at gmail.com>
Date: Sun, 9 Nov 2025 04:17:34 -1000
Subject: [PATCH] [libc++] Replace a few .compile.fail.cpp tests by proper
clang-verify tests
We want to eliminate all .compile.fail.cpp tests since they are brittle:
these tests pass regardless of the specific compilation error, which means
that e.g. a mising include will render the test null.
This is not an exhaustive pass, just a few tests I stumbled upon.
---
...mpile.fail.cpp => gets-removed.verify.cpp} | 10 +--
.../re.tokiter.cnstr/array.compile.fail.cpp | 40 -----------
.../re.tokiter.cnstr/init.compile.fail.cpp | 37 ----------
.../re.tokiter.cnstr/int.compile.fail.cpp | 36 ----------
.../temporary-objects.verify.cpp | 72 +++++++++++++++++++
.../re.tokiter.cnstr/vector.compile.fail.cpp | 41 -----------
6 files changed, 75 insertions(+), 161 deletions(-)
rename libcxx/test/std/input.output/file.streams/c.files/{gets.compile.fail.cpp => gets-removed.verify.cpp} (71%)
delete mode 100644 libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/array.compile.fail.cpp
delete mode 100644 libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/init.compile.fail.cpp
delete mode 100644 libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/int.compile.fail.cpp
create mode 100644 libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/temporary-objects.verify.cpp
delete mode 100644 libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/vector.compile.fail.cpp
diff --git a/libcxx/test/std/input.output/file.streams/c.files/gets.compile.fail.cpp b/libcxx/test/std/input.output/file.streams/c.files/gets-removed.verify.cpp
similarity index 71%
rename from libcxx/test/std/input.output/file.streams/c.files/gets.compile.fail.cpp
rename to libcxx/test/std/input.output/file.streams/c.files/gets-removed.verify.cpp
index 1a92cc925e2aa..77a0e4b424251 100644
--- a/libcxx/test/std/input.output/file.streams/c.files/gets.compile.fail.cpp
+++ b/libcxx/test/std/input.output/file.streams/c.files/gets-removed.verify.cpp
@@ -7,15 +7,11 @@
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++03, c++11
-// test <cstdio>
-// gets
+// Verify that std::gets has been removed in C++14 and later
#include <cstdio>
-int main(int, char**)
-{
- (void) std::gets((char *) NULL);
-
- return 0;
+void f() {
+ (void)std::gets((char*)NULL); // expected-error {{no member named 'gets' in namespace 'std'}}
}
diff --git a/libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/array.compile.fail.cpp b/libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/array.compile.fail.cpp
deleted file mode 100644
index a03fd52c03562..0000000000000
--- a/libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/array.compile.fail.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-// <regex>
-
-// class regex_iterator<BidirectionalIterator, charT, traits>
-
-// template <size_t N>
-// regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
-// const regex_type&& re,
-// const int (&submatches)[N],
-// regex_constants::match_flag_type m =
-// regex_constants::match_default);
-
-#include <regex>
-#include <vector>
-#include <cassert>
-#include "test_macros.h"
-
-#if TEST_STD_VER < 14
-#error
-#endif
-
-int main(int, char**)
-{
- {
- std::regex phone_numbers("\\d{3}-(\\d{4})");
- const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end";
- const int indices[] = {-1, 0, 1};
- std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book)-1,
- std::regex("\\d{3}-\\d{4}"), indices);
- }
-
- return 0;
-}
diff --git a/libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/init.compile.fail.cpp b/libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/init.compile.fail.cpp
deleted file mode 100644
index b6913e6b32d12..0000000000000
--- a/libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/init.compile.fail.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-// <regex>
-
-// class regex_iterator<BidirectionalIterator, charT, traits>
-
-// regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
-// const regex_type&& re,
-// initializer_list<int> submatches,
-// regex_constants::match_flag_type m =
-// regex_constants::match_default);
-
-#include <regex>
-#include <cassert>
-#include "test_macros.h"
-
-#if TEST_STD_VER < 14
-#error
-#endif
-
-int main(int, char**)
-{
- {
- std::regex phone_numbers("\\d{3}-(\\d{4})");
- const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end";
- std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book)-1,
- std::regex("\\d{3}-\\d{4}"), {-1, 0, 1});
- }
-
- return 0;
-}
diff --git a/libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/int.compile.fail.cpp b/libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/int.compile.fail.cpp
deleted file mode 100644
index 3c39d4983e26c..0000000000000
--- a/libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/int.compile.fail.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-// <regex>
-
-// class regex_iterator<BidirectionalIterator, charT, traits>
-
-// regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
-// const regex_type&& re, int submatch = 0,
-// regex_constants::match_flag_type m =
-// regex_constants::match_default);
-
-#include <regex>
-#include <cassert>
-#include "test_macros.h"
-
-#if TEST_STD_VER < 14
-#error
-#endif
-
-int main(int, char**)
-{
- {
- std::regex phone_numbers("\\d{3}-\\d{4}");
- const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end";
- std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book)-1,
- std::regex("\\d{3}-\\d{4}"), -1);
- }
-
- return 0;
-}
diff --git a/libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/temporary-objects.verify.cpp b/libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/temporary-objects.verify.cpp
new file mode 100644
index 0000000000000..b1ab0f337de2f
--- /dev/null
+++ b/libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/temporary-objects.verify.cpp
@@ -0,0 +1,72 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11
+
+// Ensure that we don't allow iterators into temporary std::regex objects.
+
+// <regex>
+//
+// class regex_iterator<BidirectionalIterator, charT, traits>
+//
+// regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
+// const regex_type&& re, int submatch = 0,
+// regex_constants::match_flag_type m =
+// regex_constants::match_default);
+//
+// template <size_t N>
+// regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
+// const regex_type&& re,
+// const int (&submatches)[N],
+// regex_constants::match_flag_type m =
+// regex_constants::match_default);
+//
+// regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
+// const regex_type&& re,
+// initializer_list<int> submatches,
+// regex_constants::match_flag_type m =
+// regex_constants::match_default);
+//
+// template <std::size_t N>
+// regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
+// const regex_type&& re,
+// const std::vector<int>& submatches,
+// regex_constants::match_flag_type m =
+// regex_constants::match_default);
+
+#include <iterator>
+#include <regex>
+#include <vector>
+
+void f() {
+ std::regex phone_numbers("\\d{3}-\\d{4}");
+ const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end";
+
+ { // int submatch
+ std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book) - 1, std::regex("\\d{3}-\\d{4}"), -1);
+ // expected-error at -1 {{call to deleted constructor of 'std::cregex_token_iterator'}}
+ }
+ { // const int (&submatches)[N]
+ const int indices[] = {-1, 0, 1};
+ std::cregex_token_iterator i(
+ std::begin(phone_book), std::end(phone_book) - 1, std::regex("\\d{3}-\\d{4}"), indices);
+ // expected-error at -2 {{call to deleted constructor of 'std::cregex_token_iterator'}}
+ }
+ { // initializer_list<int> submatches
+ std::cregex_token_iterator i(
+ std::begin(phone_book), std::end(phone_book) - 1, std::regex("\\d{3}-\\d{4}"), {-1, 0, 1});
+ // expected-error at -2 {{call to deleted constructor of 'std::cregex_token_iterator'}}
+ }
+ { // const std::vector<int>& submatches
+ std::vector<int> v;
+ v.push_back(-1);
+ v.push_back(-1);
+ std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book) - 1, std::regex("\\d{3}-\\d{4}"), v);
+ // expected-error at -1 {{call to deleted constructor of 'std::cregex_token_iterator'}}
+ }
+}
diff --git a/libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/vector.compile.fail.cpp b/libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/vector.compile.fail.cpp
deleted file mode 100644
index 9b07df9d1a783..0000000000000
--- a/libcxx/test/std/re/re.iter/re.tokiter/re.tokiter.cnstr/vector.compile.fail.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-// <regex>
-
-// class regex_iterator<BidirectionalIterator, charT, traits>
-
-// template <std::size_t N>
-// regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
-// const regex_type&& re,
-// const std::vector<int>& submatches,
-// regex_constants::match_flag_type m =
-// regex_constants::match_default);
-
-#include <regex>
-#include <cassert>
-#include "test_macros.h"
-
-#if TEST_STD_VER < 14
-#error
-#endif
-
-int main(int, char**)
-{
- {
- std::regex phone_numbers("\\d{3}-(\\d{4})");
- const char phone_book[] = "start 555-1234, 555-2345, 555-3456 end";
- std::vector<int> v;
- v.push_back(-1);
- v.push_back(-1);
- std::cregex_token_iterator i(std::begin(phone_book), std::end(phone_book)-1,
- std::regex("\\d{3}-\\d{4}"), v);
- }
-
- return 0;
-}
More information about the libcxx-commits
mailing list