From e9805235bf685e81b7092e629aec3c097030ec6b Mon Sep 17 00:00:00 2001 From: Nikolas Klauser Date: Fri, 27 Jun 2025 13:16:37 +0200 Subject: [PATCH] [libc++] Move libcxx/test/libcxx/extensions to libcxx/test/extensions and update the tests (#145476) This patch adds a separate `extensions` directory, since there are quite a few extensions in libc++ that aren't necessarily libc++-specific. For example, the tests currently in `libcxx/test/libcxx/extensions` should also pass with libstdc++, since they originally added the extension. This also "documents" what users are allowed to rely on and what parts are just libc++ tests to make sure our implementation is behaving as we expect, which may be subject to change. This patch also formats the tests and refactors `.fail.cpp` tests to `.verify.cpp` tests. --- .../gnu/hash/specializations.pass.cpp | 31 ++++++++++++++++ .../gnu/hash/specializations.verify.cpp} | 7 ++-- .../gnu/hash_map/const_iterator.verify.cpp} | 13 +++---- libcxx/test/extensions/gnu/lit.local.cfg | 5 +++ .../extensions/hash/specializations.pass.cpp | 36 ------------------- 5 files changed, 47 insertions(+), 45 deletions(-) create mode 100644 libcxx/test/extensions/gnu/hash/specializations.pass.cpp rename libcxx/test/{libcxx/extensions/hash/specializations.compile.fail.cpp => extensions/gnu/hash/specializations.verify.cpp} (70%) rename libcxx/test/{libcxx/extensions/hash_map/const_iterator.compile.fail.cpp => extensions/gnu/hash_map/const_iterator.verify.cpp} (55%) create mode 100644 libcxx/test/extensions/gnu/lit.local.cfg delete mode 100644 libcxx/test/libcxx/extensions/hash/specializations.pass.cpp diff --git a/libcxx/test/extensions/gnu/hash/specializations.pass.cpp b/libcxx/test/extensions/gnu/hash/specializations.pass.cpp new file mode 100644 index 000000000000..6661ed0da7da --- /dev/null +++ b/libcxx/test/extensions/gnu/hash/specializations.pass.cpp @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +// Prevent from generating deprecated warnings for this test. +// ADDITIONAL_COMPILE_FLAGS: -Wno-deprecated + +#include +#include +#include + +int main(int, char**) { + char str[] = "test"; + assert(__gnu_cxx::hash()("test") == std::hash()("test")); + assert(__gnu_cxx::hash()(str) == std::hash()("test")); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); + assert(__gnu_cxx::hash()(42) == 42); + + return 0; +} diff --git a/libcxx/test/libcxx/extensions/hash/specializations.compile.fail.cpp b/libcxx/test/extensions/gnu/hash/specializations.verify.cpp similarity index 70% rename from libcxx/test/libcxx/extensions/hash/specializations.compile.fail.cpp rename to libcxx/test/extensions/gnu/hash/specializations.verify.cpp index f81ec5dacb91..5a74a52dd395 100644 --- a/libcxx/test/libcxx/extensions/hash/specializations.compile.fail.cpp +++ b/libcxx/test/extensions/gnu/hash/specializations.verify.cpp @@ -6,13 +6,14 @@ // //===----------------------------------------------------------------------===// +// ADDITIONAL_COMPILE_FLAGS: -Wno-deprecated + #include #include #include -int main(int, char**) -{ - assert(__gnu_cxx::hash()(std::string()) == 0); // error +int main(int, char**) { + assert(__gnu_cxx::hash()(std::string()) == 0); // expected-error {{does not provide a call operator}} return 0; } diff --git a/libcxx/test/libcxx/extensions/hash_map/const_iterator.compile.fail.cpp b/libcxx/test/extensions/gnu/hash_map/const_iterator.verify.cpp similarity index 55% rename from libcxx/test/libcxx/extensions/hash_map/const_iterator.compile.fail.cpp rename to libcxx/test/extensions/gnu/hash_map/const_iterator.verify.cpp index db09e40801a1..eacdacd035b3 100644 --- a/libcxx/test/libcxx/extensions/hash_map/const_iterator.compile.fail.cpp +++ b/libcxx/test/extensions/gnu/hash_map/const_iterator.verify.cpp @@ -6,14 +6,15 @@ // //===----------------------------------------------------------------------===// +// ADDITIONAL_COMPILE_FLAGS: -Wno-deprecated + #include -int main(int, char**) -{ - __gnu_cxx::hash_map m; - m[1] = 1; - const __gnu_cxx::hash_map &cm = m; - cm.find(1)->second = 2; // error +int main(int, char**) { + __gnu_cxx::hash_map m; + m[1] = 1; + const __gnu_cxx::hash_map& cm = m; + cm.find(1)->second = 2; // expected-error {{cannot assign to return value because function 'operator->' returns a const value}} return 0; } diff --git a/libcxx/test/extensions/gnu/lit.local.cfg b/libcxx/test/extensions/gnu/lit.local.cfg new file mode 100644 index 000000000000..ffc4fc420f4c --- /dev/null +++ b/libcxx/test/extensions/gnu/lit.local.cfg @@ -0,0 +1,5 @@ + +# Only libc++ and libstdc++ have any gnu extensions +if ("stdlib=libc++" not in config.available_features and + "stdlib=libstdc++" not in config.available_features): + config.unsupported = True diff --git a/libcxx/test/libcxx/extensions/hash/specializations.pass.cpp b/libcxx/test/libcxx/extensions/hash/specializations.pass.cpp deleted file mode 100644 index 345a2721dc03..000000000000 --- a/libcxx/test/libcxx/extensions/hash/specializations.pass.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 -// -//===----------------------------------------------------------------------===// - -// UNSUPPORTED: clang-modules-build - -// Prevent from generating deprecated warnings for this test. -// ADDITIONAL_COMPILE_FLAGS: -Wno-deprecated -#include -#include -#include - -#include "test_macros.h" - -int main(int, char**) -{ - char str[] = "test"; - assert(__gnu_cxx::hash()("test") == - std::hash()("test")); - assert(__gnu_cxx::hash()(str) == std::hash()("test")); - assert(__gnu_cxx::hash()(42) == 42); - assert(__gnu_cxx::hash()(42) == 42); - assert(__gnu_cxx::hash()(42) == 42); - assert(__gnu_cxx::hash()(42) == 42); - assert(__gnu_cxx::hash()(42) == 42); - assert(__gnu_cxx::hash()(42) == 42); - assert(__gnu_cxx::hash()(42) == 42); - assert(__gnu_cxx::hash()(42) == 42); - assert(__gnu_cxx::hash()(42) == 42); - - return 0; -}