chrono: Constexpr markup for is_monotonic.

2010-11-23  Benjamin Kosnik  <bkoz@redhat.com>

	* include/std/chrono: Constexpr markup for is_monotonic.
	* src/chrono.cc: Same.
	* testsuite/20_util/clocks/1.cc: Move...
	* testsuite/20_util/system_clock/1.cc: ...here.
	* testsuite/20_util/system_clock/constexpr_data.cc
	* testsuite/20_util/monotonic_clock/constexpr_data.cc

	* include/std/complex: Mark primary template constexpr.
	* testsuite/26_numerics/complex/cons/constexpr_primary.cc: Add.
	* testsuite/26_numerics/complex/complex_value.cc: Move...
	* testsuite/26_numerics/complex/dr387.cc: Move...
	* testsuite/26_numerics/complex/value_operations/1.cc: ... here.
	* testsuite/26_numerics/complex/value_operations/dr387.cc: ...here.
	* testsuite/26_numerics/complex/value_operations/constexpr.cc: New.

2010-11-23  Benjamin Kosnik  <bkoz@redhat.com>
	    Jason Merrill  <jason@redhat.com>

	* testsuite/lib/libstdc++.exp: Use scanasm.
	* testsuite/util/testsuite_common_types.h
	(constexpr_default_constructible): Add support for non-literal types.
	(constexpr_single_value_constructible): Same.
	* testsuite/20_util/enable_shared_from_this/cons/constexpr.cc:
	Remove xfail.
	* testsuite/20_util/shared_ptr/cons/constexpr.cc: Add.
	* testsuite/20_util/unique_ptr/cons/constexpr.cc: Add.
	* testsuite/20_util/weak_ptr/cons/constexpr.cc: Add.
	* testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Adjust line number.

2010-11-23  Benjamin Kosnik  <bkoz@redhat.com>
	    Jonathan Wakely  <jwakely.gcc@gmail.com>

	* include/std/future (shared_future): Default ctor constexpr.
	(future): Same.
	* testsuite/30_threads/shared_future/cons/constexpr.cc: New.
	* testsuite/30_threads/future/cons/constexpr.cc: New.


Co-Authored-By: Jason Merrill <jason@redhat.com>
Co-Authored-By: Jonathan Wakely <jwakely.gcc@gmail.com>

From-SVN: r167099
This commit is contained in:
Benjamin Kosnik 2010-11-23 23:47:44 +00:00 committed by Benjamin Kosnik
parent 9fdca9e332
commit 85db9dcc30
20 changed files with 515 additions and 55 deletions

View File

@ -1,3 +1,42 @@
2010-11-23 Benjamin Kosnik <bkoz@redhat.com>
* include/std/chrono: Constexpr markup for is_monotonic.
* src/chrono.cc: Same.
* testsuite/20_util/clocks/1.cc: Move...
* testsuite/20_util/system_clock/1.cc: ...here.
* testsuite/20_util/system_clock/constexpr_data.cc
* testsuite/20_util/monotonic_clock/constexpr_data.cc
* include/std/complex: Mark primary template constexpr.
* testsuite/26_numerics/complex/cons/constexpr_primary.cc: Add.
* testsuite/26_numerics/complex/complex_value.cc: Move...
* testsuite/26_numerics/complex/dr387.cc: Move...
* testsuite/26_numerics/complex/value_operations/1.cc: ... here.
* testsuite/26_numerics/complex/value_operations/dr387.cc: ...here.
* testsuite/26_numerics/complex/value_operations/constexpr.cc: New.
2010-11-23 Benjamin Kosnik <bkoz@redhat.com>
Jason Merrill <jason@redhat.com>
* testsuite/lib/libstdc++.exp: Use scanasm.
* testsuite/util/testsuite_common_types.h
(constexpr_default_constructible): Add support for non-literal types.
(constexpr_single_value_constructible): Same.
* testsuite/20_util/enable_shared_from_this/cons/constexpr.cc:
Remove xfail.
* testsuite/20_util/shared_ptr/cons/constexpr.cc: Add.
* testsuite/20_util/unique_ptr/cons/constexpr.cc: Add.
* testsuite/20_util/weak_ptr/cons/constexpr.cc: Add.
* testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Adjust line number.
2010-11-23 Benjamin Kosnik <bkoz@redhat.com>
Jonathan Wakely <jwakely.gcc@gmail.com>
* include/std/future (shared_future): Default ctor constexpr.
(future): Same.
* testsuite/30_threads/shared_future/cons/constexpr.cc: New.
* testsuite/30_threads/future/cons/constexpr.cc: New.
2010-11-23 Uros Bizjak <ubizjak@gmail.com>
* testsuite/22_locale/collate/hash/char/wrapped_locale.cc: Require

View File

@ -228,7 +228,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
&& (treat_as_floating_point<rep>::value
|| !treat_as_floating_point<_Rep2>::value)>::type>
constexpr explicit duration(const _Rep2& __rep)
: __r(static_cast<rep>(__rep)) { }
: __r(static_cast<rep>(__rep)) { }
template<typename _Rep2, typename _Period2, typename = typename
enable_if<treat_as_floating_point<rep>::value
@ -644,22 +644,22 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
struct system_clock
{
#ifdef _GLIBCXX_USE_CLOCK_REALTIME
typedef chrono::nanoseconds duration;
typedef chrono::nanoseconds duration;
#elif defined(_GLIBCXX_USE_GETTIMEOFDAY)
typedef chrono::microseconds duration;
typedef chrono::microseconds duration;
#else
typedef chrono::seconds duration;
typedef chrono::seconds duration;
#endif
typedef duration::rep rep;
typedef duration::period period;
typedef chrono::time_point<system_clock, duration> time_point;
typedef duration::rep rep;
typedef duration::period period;
typedef chrono::time_point<system_clock, duration> time_point;
static_assert(system_clock::duration::min()
< system_clock::duration::zero(),
"a clock's minimum duration cannot be less than its epoch");
static const bool is_monotonic = false;
static constexpr bool is_monotonic = false;
static time_point
now() throw ();
@ -685,12 +685,12 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
/// monotonic_clock
struct monotonic_clock
{
typedef chrono::nanoseconds duration;
typedef duration::rep rep;
typedef duration::period period;
typedef chrono::time_point<monotonic_clock, duration> time_point;
typedef chrono::nanoseconds duration;
typedef duration::rep rep;
typedef duration::period period;
typedef chrono::time_point<monotonic_clock, duration> time_point;
static const bool is_monotonic = true;
static constexpr bool is_monotonic = true;
static time_point
now();

View File

@ -529,12 +529,12 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
// Values
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename _Tp>
inline _Tp
inline constexpr _Tp
real(const complex<_Tp>& __z)
{ return __z.real(); }
template<typename _Tp>
inline _Tp
inline constexpr _Tp
imag(const complex<_Tp>& __z)
{ return __z.imag(); }
#else

View File

@ -556,7 +556,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
explicit
__basic_future(future<_Res>&&);
__basic_future() { }
constexpr __basic_future() : _M_state() { }
struct _Reset
{
@ -584,7 +584,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
future(const __state_type& __state) : _Base_type(__state) { }
public:
future() : _Base_type() { }
constexpr future() : _Base_type() { }
/// Move constructor
future(future&& __uf) : _Base_type(std::move(__uf)) { }
@ -625,7 +625,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
future(const __state_type& __state) : _Base_type(__state) { }
public:
future() : _Base_type() { }
constexpr future() : _Base_type() { }
/// Move constructor
future(future&& __uf) : _Base_type(std::move(__uf)) { }
@ -666,7 +666,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
future(const __state_type& __state) : _Base_type(__state) { }
public:
future() : _Base_type() { }
constexpr future() : _Base_type() { }
/// Move constructor
future(future&& __uf) : _Base_type(std::move(__uf)) { }
@ -698,7 +698,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
typedef __basic_future<_Res> _Base_type;
public:
shared_future() : _Base_type() { }
constexpr shared_future() : _Base_type() { }
/// Copy constructor
shared_future(const shared_future& __sf) : _Base_type(__sf) { }
@ -742,7 +742,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
typedef __basic_future<_Res&> _Base_type;
public:
shared_future() : _Base_type() { }
constexpr shared_future() : _Base_type() { }
/// Copy constructor
shared_future(const shared_future& __sf) : _Base_type(__sf) { }
@ -781,7 +781,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
typedef __basic_future<void> _Base_type;
public:
shared_future() : _Base_type() { }
constexpr shared_future() : _Base_type() { }
/// Copy constructor
shared_future(const shared_future& __sf) : _Base_type(__sf) { }

View File

@ -37,7 +37,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
namespace chrono
{
const bool system_clock::is_monotonic;
constexpr bool system_clock::is_monotonic;
system_clock::time_point
system_clock::now() throw ()
@ -61,7 +61,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
}
#ifdef _GLIBCXX_USE_CLOCK_MONOTONIC
const bool monotonic_clock::is_monotonic;
constexpr bool monotonic_clock::is_monotonic;
monotonic_clock::time_point
monotonic_clock::now()

View File

@ -1,5 +1,7 @@
// { dg-do compile { xfail *-*-* } }
// { dg-options "-std=gnu++0x" }
// { dg-do compile }
// { dg-options "-std=gnu++0x -fno-inline -save-temps" }
// { dg-final { scan-assembler-not "_ZNSt23enable_shared_from_thisIiEC2Ev" } }
// { dg-final { scan-assembler-not "_ZN7derivedC2Ev" } }
// Copyright (C) 2010 Free Software Foundation, Inc.
//
@ -29,7 +31,6 @@ struct derived : public std::enable_shared_from_this<int>
int main()
{
__gnu_test::constexpr_default_constructible test;
test.operator()<derived>(); // { dg-excess-errors "" }
derived d;
test.operator()<derived>();
return 0;
}

View File

@ -0,0 +1,52 @@
// { dg-do compile }
// { dg-options "-std=gnu++0x" }
// Copyright (C) 2010 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <chrono>
#include <testsuite_common_types.h>
namespace __gnu_test
{
struct constexpr_member_data
{
template<typename _Ttesttype>
void
operator()()
{
struct _Concept
{
void __constraint()
{
constexpr auto v1 __attribute__((unused))
= _Ttesttype::is_monotonic;
}
};
_Concept c;
c.__constraint();
}
};
}
int main()
{
__gnu_test::constexpr_member_data test;
test.operator()<std::chrono::monotonic_clock>();
return 0;
}

View File

@ -0,0 +1,35 @@
// { dg-do compile }
// { dg-options "-std=gnu++0x -fno-inline -save-temps" }
// { dg-final { scan-assembler-not "_ZNSt10shared_ptrIiEC2Ev" } }
// { dg-final { scan-assembler-not "_ZNSt10shared_ptrIiEC2EDn" } }
// Copyright (C) 2010 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <memory>
#include <testsuite_common_types.h>
int main()
{
__gnu_test::constexpr_default_constructible test1; //not literal
test1.operator()<std::shared_ptr<int>>();
__gnu_test::constexpr_single_value_constructible test2; //not literal
test2.operator()<std::shared_ptr<int>, std::nullptr_t>();
return 0;
}

View File

@ -0,0 +1,52 @@
// { dg-do compile }
// { dg-options "-std=gnu++0x" }
// Copyright (C) 2010 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <chrono>
#include <testsuite_common_types.h>
namespace __gnu_test
{
struct constexpr_member_data
{
template<typename _Ttesttype>
void
operator()()
{
struct _Concept
{
void __constraint()
{
constexpr auto v1 __attribute__((unused))
= _Ttesttype::is_monotonic;
}
};
_Concept c;
c.__constraint();
}
};
}
int main()
{
__gnu_test::constexpr_member_data test;
test.operator()<std::chrono::system_clock>();
return 0;
}

View File

@ -0,0 +1,35 @@
// { dg-do compile }
// { dg-options "-std=gnu++0x -fno-inline -save-temps" }
// { dg-final { scan-assembler-not "_ZNSt10unique_ptrIiSt14default_deleteIiEEC2Ev" } }
// { dg-final { scan-assembler-not "_ZNSt10unique_ptrIiSt14default_deleteIiEEC2EDn" } }
// Copyright (C) 2010 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <memory>
#include <testsuite_common_types.h>
int main()
{
__gnu_test::constexpr_default_constructible test1; //not literal
test1.operator()<std::unique_ptr<int>>();
__gnu_test::constexpr_single_value_constructible test2; //not literal
test2.operator()<std::unique_ptr<int>, std::nullptr_t>();
return 0;
}

View File

@ -0,0 +1,30 @@
// { dg-do compile }
// { dg-options "-std=gnu++0x -fno-inline -save-temps" }
// { dg-final { scan-assembler-not "_ZNSt8weak_ptrIiEC2Ev" } }
// Copyright (C) 2010 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <memory>
#include <testsuite_common_types.h>
int main()
{
__gnu_test::constexpr_default_constructible test; //not literal
test.operator()<std::weak_ptr<int>>();
return 0;
}

View File

@ -0,0 +1,67 @@
// { dg-do compile }
// { dg-options "-std=gnu++0x" }
// Copyright (C) 2010 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <complex>
// User defined type, so that the primary std::complex template is used.
namespace numext
{
struct ldld_base
{
long double one;
long double two;
};
struct ldld_lit : public ldld_base
{ };
struct ldld_nonlit : public ldld_base
{
~ldld_nonlit() { }
};
bool
operator<(const ldld_base __a, const ldld_base __b)
{ return __a.one < __b.one && __a.two < __b.two; }
bool
operator==(const ldld_base __a, const ldld_base __b)
{ return __a.one == __b.one && __a.two == __b.two; }
ldld_base
operator+=(const ldld_base __a, const ldld_base __b)
{ return ldld_base({ __a.one + __b.one, __a.two + __b.two}); }
ldld_base
operator-=(const ldld_base __a, const ldld_base __b)
{ return ldld_base({ __a.one - __b.one, __a.two - __b.two}); }
ldld_base
operator*=(const ldld_base __a, const ldld_base __b)
{ return ldld_base({ __a.one * __b.one, __a.two * __b.two}); }
ldld_base
operator/=(const ldld_base __a, const ldld_base __b)
{ return ldld_base({ __a.one / __b.one, __a.two / __b.two}); }
}
constexpr std::complex<numext::ldld_lit> lit; // ok
// constexpr std::complex<numext::ldld_nonlit> nonlit; // error

View File

@ -0,0 +1,57 @@
// { dg-do compile }
// { dg-options "-std=gnu++0x" }
// Copyright (C) 2010 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <complex>
#include <testsuite_common_types.h>
namespace __gnu_test
{
struct constexpr_functions
{
template<typename _Ttesttype>
void
operator()()
{
struct _Concept
{
void __constraint()
{
typedef typename _Ttesttype::_ComplexT _ComplexT;
const _ComplexT cc = { 1.1 };
constexpr _Ttesttype a(cc);
constexpr auto v1 __attribute__((unused)) = real(a);
constexpr auto v2 __attribute__((unused)) = imag(a);
}
};
_Concept c;
c.__constraint();
}
};
}
int main()
{
__gnu_test::constexpr_functions test;
test.operator()<std::complex<float>>();
test.operator()<std::complex<double>>();
test.operator()<std::complex<long double>>();
return 0;
}

View File

@ -0,0 +1,32 @@
// { dg-do compile }
// { dg-options "-std=gnu++0x -fno-inline -save-temps" }
// { dg-final { scan-assembler-not "_ZNSt6futureIvEC2Ev" } }
// { dg-final { scan-assembler-not "_ZNSt6futureIiEC2Ev" } }
// Copyright (C) 2010 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <future>
#include <testsuite_common_types.h>
int main()
{
__gnu_test::constexpr_default_constructible test; //not literal
test.operator()<std::future<int>>();
test.operator()<std::future<void>>();
return 0;
}

View File

@ -0,0 +1,32 @@
// { dg-do compile }
// { dg-options "-std=gnu++0x -fno-inline -save-temps" }
// { dg-final { scan-assembler-not "_ZNSt13shared_futureIvEC2Ev" } }
// { dg-final { scan-assembler-not "_ZNSt13shared_futureIiEC2Ev" } }
// Copyright (C) 2010 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <future>
#include <testsuite_common_types.h>
int main()
{
__gnu_test::constexpr_default_constructible test; //not literal
test.operator()<std::shared_future<int>>();
test.operator()<std::shared_future<void>>();
return 0;
}

View File

@ -51,6 +51,7 @@ load_gcc_lib target-supports.exp
load_gcc_lib target-supports-dg.exp
load_lib prune.exp
load_lib dg-options.exp
load_gcc_lib scanasm.exp
load_gcc_lib target-libpath.exp
load_gcc_lib timeout.exp
load_gcc_lib timeout-dg.exp

View File

@ -637,50 +637,77 @@ namespace __gnu_test
}
};
// Generator to test constexpr constructor
#ifdef __GXX_EXPERIMENTAL_CXX0X__
// Generator to test default constructor.
struct constexpr_default_constructible
{
template<typename _Tp, bool _IsLitp = std::is_literal_type<_Tp>::value>
struct _Concept;
// NB: _Tp must be a literal type.
// Have to have user-defined default ctor for this to work.
template<typename _Tp>
struct _Concept<_Tp, true>
{
void __constraint()
{ constexpr _Tp __obj; }
};
// Non-literal type, declare local static and verify no
// constructors generated for _Tp within the translation unit.
template<typename _Tp>
struct _Concept<_Tp, false>
{
void __constraint()
{ static _Tp __obj; }
};
template<typename _Tp>
void
operator()()
{
struct _Concept
{
// Have to have user-defined default ctor for this to work.
void __constraint()
{ constexpr _Tp __v; }
};
void (_Concept::*__x)() __attribute__((unused))
= &_Concept::__constraint;
_Concept<_Tp> c;
c.__constraint();
}
};
struct constexpr_single_value_constructible
{
// NB: _Tbasetype and _Ttesttype must be literal types.
template<typename _Ttesttype, typename _Tbasetype>
template<typename _Ttesttype, typename _Tvaluetype,
bool _IsLitp = std::is_literal_type<_Ttesttype>::value>
struct _Concept;
// NB: _Tvaluetype and _Ttesttype must be literal types.
// Additional constraint on _Tvaluetype needed. Either assume
// user-defined default ctor as per
// constexpr_default_constructible and provide no initializer,
// provide an initializer, or assume empty-list init-able. Choose
// the latter.
template<typename _Ttesttype, typename _Tvaluetype>
struct _Concept<_Ttesttype, _Tvaluetype, true>
{
void __constraint()
{
constexpr _Tvaluetype __v { };
constexpr _Ttesttype __obj(__v);
}
};
template<typename _Ttesttype, typename _Tvaluetype>
struct _Concept<_Ttesttype, _Tvaluetype, false>
{
void __constraint()
{
const _Tvaluetype __v { };
static _Ttesttype __obj(__v);
}
};
template<typename _Ttesttype, typename _Tvaluetype>
void
operator()()
{
struct _Concept
{
// Additional constraint on _Tbasetype needed.
// Either assume user-defined default ctor as per
// constexpr_default_constructible and provide no
// initializer, provide an initializer, or assume empty-list
// init-able. Choose the latter.
void __constraint()
{
constexpr _Tbasetype __v { };
constexpr _Ttesttype __t(__v);
}
};
_Concept c;
_Concept<_Ttesttype, _Tvaluetype> c;
c.__constraint();
}
};