mirror of
https://github.com/llvm-mirror/libcxx.git
synced 2025-10-21 23:30:38 +08:00
Implement LWG 2960: nonesuch is insufficiently useless
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@359526 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -72,6 +72,7 @@ inline namespace fundamentals_v1 {
|
|||||||
|
|
||||||
#if _LIBCPP_STD_VER > 11
|
#if _LIBCPP_STD_VER > 11
|
||||||
|
|
||||||
|
#include <initializer_list>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
@@ -104,11 +105,10 @@ using raw_invocation_type_t = typename raw_invocation_type<_Tp>::type;
|
|||||||
// 3.3.4, Detection idiom
|
// 3.3.4, Detection idiom
|
||||||
template <class...> using void_t = void;
|
template <class...> using void_t = void;
|
||||||
|
|
||||||
struct nonesuch {
|
struct nonesuch : private _VSTD::__nat { // make nonesuch "not an aggregate"
|
||||||
nonesuch() = delete;
|
~nonesuch() = delete;
|
||||||
~nonesuch() = delete;
|
nonesuch (nonesuch const&) = delete;
|
||||||
nonesuch (nonesuch const&) = delete;
|
void operator=(nonesuch const&) = delete;
|
||||||
void operator=(nonesuch const&) = delete;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class _Default, class _AlwaysVoid, template <class...> class _Op, class... _Args>
|
template <class _Default, class _AlwaysVoid, template <class...> class _Op, class... _Args>
|
||||||
|
@@ -0,0 +1,32 @@
|
|||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// 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++98, c++03, c++11
|
||||||
|
// <experimental/type_traits>
|
||||||
|
//
|
||||||
|
// struct nonesuch;
|
||||||
|
// nonesuch has no default constructor (C++17 §15.1)
|
||||||
|
// or initializer-list constructor (C++17 §11.6.4),
|
||||||
|
// and is not an aggregate (C++17 §11.6.1).
|
||||||
|
|
||||||
|
|
||||||
|
#include <experimental/type_traits>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "test_macros.h"
|
||||||
|
|
||||||
|
namespace ex = std::experimental;
|
||||||
|
|
||||||
|
void doSomething (const ex::nonesuch &) {}
|
||||||
|
|
||||||
|
int main(int, char**) {
|
||||||
|
ex::nonesuch *e0 = new ex::nonesuch; // expected-error {{no matching constructor for initialization of 'ex::nonesuch'}}
|
||||||
|
doSomething({}); // expected-error{{no matching function for call to 'doSomething'}}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@@ -0,0 +1,29 @@
|
|||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// 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++98, c++03, c++11
|
||||||
|
// <experimental/type_traits>
|
||||||
|
//
|
||||||
|
// struct nonesuch
|
||||||
|
|
||||||
|
#include <experimental/type_traits>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "test_macros.h"
|
||||||
|
|
||||||
|
namespace ex = std::experimental;
|
||||||
|
|
||||||
|
struct such {};
|
||||||
|
void foo(const such &) {}
|
||||||
|
void foo(const ex::nonesuch &) {}
|
||||||
|
|
||||||
|
int main(int, char**) {
|
||||||
|
foo({}); // nonesuch is not an aggregate
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@@ -278,7 +278,7 @@
|
|||||||
<tr><td><a href="https://wg21.link/LWG2797">2797</a></td><td>Trait precondition violations</td><td>San Diego</td><td>Resolved by 1285R0</td></tr>
|
<tr><td><a href="https://wg21.link/LWG2797">2797</a></td><td>Trait precondition violations</td><td>San Diego</td><td>Resolved by 1285R0</td></tr>
|
||||||
<tr><td><a href="https://wg21.link/LWG2936">2936</a></td><td>Path comparison is defined in terms of the generic format</td><td>San Diego</td><td>Complete</td></tr>
|
<tr><td><a href="https://wg21.link/LWG2936">2936</a></td><td>Path comparison is defined in terms of the generic format</td><td>San Diego</td><td>Complete</td></tr>
|
||||||
<tr><td><a href="https://wg21.link/LWG2943">2943</a></td><td>Problematic specification of the wide version of <tt>basic_filebuf::open</tt></td><td>San Diego</td><td>Nothing to do</td></tr>
|
<tr><td><a href="https://wg21.link/LWG2943">2943</a></td><td>Problematic specification of the wide version of <tt>basic_filebuf::open</tt></td><td>San Diego</td><td>Nothing to do</td></tr>
|
||||||
<tr><td><a href="https://wg21.link/LWG2960">2960</a></td><td>[fund.ts.v3] <tt>nonesuch</tt> is insufficiently useless</td><td>San Diego</td><td></td></tr>
|
<tr><td><a href="https://wg21.link/LWG2960">2960</a></td><td>[fund.ts.v3] <tt>nonesuch</tt> is insufficiently useless</td><td>San Diego</td><td>Complete</td></tr>
|
||||||
<tr><td><a href="https://wg21.link/LWG2995">2995</a></td><td><tt>basic_stringbuf</tt> default constructor forbids it from using SSO capacity</td><td>San Diego</td><td></td></tr>
|
<tr><td><a href="https://wg21.link/LWG2995">2995</a></td><td><tt>basic_stringbuf</tt> default constructor forbids it from using SSO capacity</td><td>San Diego</td><td></td></tr>
|
||||||
<tr><td><a href="https://wg21.link/LWG2996">2996</a></td><td>Missing rvalue overloads for <tt>shared_ptr</tt> operations</td><td>San Diego</td><td></td></tr>
|
<tr><td><a href="https://wg21.link/LWG2996">2996</a></td><td>Missing rvalue overloads for <tt>shared_ptr</tt> operations</td><td>San Diego</td><td></td></tr>
|
||||||
<tr><td><a href="https://wg21.link/LWG3008">3008</a></td><td><tt>make_shared</tt> (sub)object destruction semantics are not specified</td><td>San Diego</td><td></td></tr>
|
<tr><td><a href="https://wg21.link/LWG3008">3008</a></td><td><tt>make_shared</tt> (sub)object destruction semantics are not specified</td><td>San Diego</td><td></td></tr>
|
||||||
|
Reference in New Issue
Block a user