+// { dg-options "-std=gnu++20" }
+// { dg-do compile { target c++20 } }
+
+#include <atomic>
+
+#ifndef __cpp_lib_atomic_lock_free_type_aliases
+# error "Feature test macro for lock-free type aliases is missing in <atomic>"
+#elif __cpp_lib_atomic_lock_free_type_aliases != 201907L
+# error "Feature test macro for lock-free type aliases has wrong value in <atomic>"
+#endif
+
+template<typename T>
+constexpr bool is_atomic_specialization = false;
+template<typename T>
+constexpr bool is_atomic_specialization<std::atomic<T>> = true;
+
+// The type aliases atomic_signed_lock_free and atomic_unsigned_lock_free
+// name specializations of atomic
+static_assert( is_atomic_specialization<std::atomic_signed_lock_free> );
+static_assert( is_atomic_specialization<std::atomic_unsigned_lock_free> );
+
+#include <type_traits>
+
+// ... whose template arguments are integral types,
+static_assert( std::is_integral_v<std::atomic_signed_lock_free::value_type> );
+static_assert( std::is_integral_v<std::atomic_unsigned_lock_free::value_type> );
+
+// ... respectively signed and unsigned,
+static_assert( std::is_signed_v<std::atomic_signed_lock_free::value_type> );
+static_assert( std::is_unsigned_v<std::atomic_unsigned_lock_free::value_type> );
+
+// and whose is_always_lock_free property is true.
+static_assert( std::atomic_signed_lock_free::is_always_lock_free );
+static_assert( std::atomic_unsigned_lock_free::is_always_lock_free );