[libcxx-commits] [libcxx] e980523 - [libc++] Move libcxx/test/libcxx/extensions to libcxx/test/extensions and update the tests (#145476)

via libcxx-commits libcxx-commits at lists.llvm.org
Fri Jun 27 04:16:40 PDT 2025


Author: Nikolas Klauser
Date: 2025-06-27T13:16:37+02:00
New Revision: e9805235bf685e81b7092e629aec3c097030ec6b

URL: https://github.com/llvm/llvm-project/commit/e9805235bf685e81b7092e629aec3c097030ec6b
DIFF: https://github.com/llvm/llvm-project/commit/e9805235bf685e81b7092e629aec3c097030ec6b.diff

LOG: [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.

Added: 
    libcxx/test/extensions/gnu/hash/specializations.pass.cpp
    libcxx/test/extensions/gnu/hash/specializations.verify.cpp
    libcxx/test/extensions/gnu/hash_map/const_iterator.verify.cpp
    libcxx/test/extensions/gnu/lit.local.cfg

Modified: 
    

Removed: 
    libcxx/test/libcxx/extensions/hash/specializations.compile.fail.cpp
    libcxx/test/libcxx/extensions/hash/specializations.pass.cpp
    libcxx/test/libcxx/extensions/hash_map/const_iterator.compile.fail.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 0000000000000..6661ed0da7dad
--- /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 <ext/hash_set> from generating deprecated warnings for this test.
+// ADDITIONAL_COMPILE_FLAGS: -Wno-deprecated
+
+#include <cassert>
+#include <ext/hash_map>
+#include <string>
+
+int main(int, char**) {
+  char str[] = "test";
+  assert(__gnu_cxx::hash<const char*>()("test") == std::hash<std::string>()("test"));
+  assert(__gnu_cxx::hash<char*>()(str) == std::hash<std::string>()("test"));
+  assert(__gnu_cxx::hash<char>()(42) == 42);
+  assert(__gnu_cxx::hash<signed char>()(42) == 42);
+  assert(__gnu_cxx::hash<unsigned char>()(42) == 42);
+  assert(__gnu_cxx::hash<short>()(42) == 42);
+  assert(__gnu_cxx::hash<unsigned short>()(42) == 42);
+  assert(__gnu_cxx::hash<int>()(42) == 42);
+  assert(__gnu_cxx::hash<unsigned int>()(42) == 42);
+  assert(__gnu_cxx::hash<long>()(42) == 42);
+  assert(__gnu_cxx::hash<unsigned long>()(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 f81ec5dacb91e..5a74a52dd3956 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 <assert.h>
 #include <ext/hash_map>
 #include <string>
 
-int main(int, char**)
-{
-    assert(__gnu_cxx::hash<std::string>()(std::string()) == 0);  // error
+int main(int, char**) {
+  assert(__gnu_cxx::hash<std::string>()(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 db09e40801a1f..eacdacd035b37 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 <ext/hash_map>
 
-int main(int, char**)
-{
-    __gnu_cxx::hash_map<int, int> m;
-    m[1] = 1;
-    const __gnu_cxx::hash_map<int, int> &cm = m;
-    cm.find(1)->second = 2;  // error
+int main(int, char**) {
+  __gnu_cxx::hash_map<int, int> m;
+  m[1]                                    = 1;
+  const __gnu_cxx::hash_map<int, int>& 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 0000000000000..ffc4fc420f4ce
--- /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 345a2721dc035..0000000000000
--- 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 <ext/hash_set> from generating deprecated warnings for this test.
-// ADDITIONAL_COMPILE_FLAGS: -Wno-deprecated
-#include <assert.h>
-#include <ext/hash_map>
-#include <string>
-
-#include "test_macros.h"
-
-int main(int, char**)
-{
-    char str[] = "test";
-    assert(__gnu_cxx::hash<const char *>()("test") ==
-           std::hash<std::string>()("test"));
-    assert(__gnu_cxx::hash<char *>()(str) == std::hash<std::string>()("test"));
-    assert(__gnu_cxx::hash<char>()(42) == 42);
-    assert(__gnu_cxx::hash<signed char>()(42) == 42);
-    assert(__gnu_cxx::hash<unsigned char>()(42) == 42);
-    assert(__gnu_cxx::hash<short>()(42) == 42);
-    assert(__gnu_cxx::hash<unsigned short>()(42) == 42);
-    assert(__gnu_cxx::hash<int>()(42) == 42);
-    assert(__gnu_cxx::hash<unsigned int>()(42) == 42);
-    assert(__gnu_cxx::hash<long>()(42) == 42);
-    assert(__gnu_cxx::hash<unsigned long>()(42) == 42);
-
-  return 0;
-}


        


More information about the libcxx-commits mailing list