Merge topic 'cxx11-features'
60c0d2dd
Features: Add cxx_defaulted_move_initializers.c4e67235
Features: Add cxx_long_long_type.dcaafada
Features: Add cxx_func_identifier.251a1f02
Features: Add cxx_local_type_template_args.53fe7773
Features: Add cxx_extended_friend_declarations.16603f7c
Features: Add cxx_enum_forward_declarations.adf22f61
Features: Add cxx_default_function_template_args.7b3e8a05
Features: Add cxx_right_angle_brackets.9a49fd21
Features: Add cxx_decltype_incomplete_return_types.1889045c
Features: Add cxx_sizeof_member.ab455eba
Features: Add cxx_thread_local.300ce248
Features: Add cxx_inline_namespaces.f9d04a96
Features: Add cxx_variadic_macros.3d76656f
Features: Add cxx_uniform_initialization.e74b216c
Features: Add cxx_generalized_initializers.ff80c3b4
Features: Add cxx_attributes. ...
This commit is contained in:
commit
8472ef243f
|
@ -12,7 +12,227 @@ command.
|
|||
|
||||
The features known to this version of CMake are:
|
||||
|
||||
``cxx_alias_templates``
|
||||
Template aliases, as defined in N2258_.
|
||||
|
||||
.. _N2258: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf
|
||||
|
||||
``cxx_alignas``
|
||||
Alignment control ``alignas``, as defined in N2341_.
|
||||
|
||||
.. _N2341: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf
|
||||
|
||||
``cxx_alignof``
|
||||
Alignment control ``alignof``, as defined in N2341_.
|
||||
|
||||
.. _N2341: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf
|
||||
|
||||
``cxx_attributes``
|
||||
Generic attributes, as defined in N2761_.
|
||||
|
||||
.. _N2761: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2761.pdf
|
||||
|
||||
``cxx_auto_type``
|
||||
Automatic type deduction, as defined in N1984_.
|
||||
|
||||
.. _N1984: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf
|
||||
|
||||
``cxx_constexpr``
|
||||
Constant expressions, as defined in N2235_.
|
||||
|
||||
.. _N2235: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf
|
||||
|
||||
``cxx_decltype_incomplete_return_types``
|
||||
Decltype on incomplete return types, as defined in N3276_.
|
||||
|
||||
.. _N3276 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3276.pdf
|
||||
|
||||
``cxx_decltype``
|
||||
Decltype, as defined in N2343_.
|
||||
|
||||
.. _N2343: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf
|
||||
|
||||
``cxx_default_function_template_args``
|
||||
Default template arguments for function templates, as defined in DR226_
|
||||
|
||||
.. _DR226: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#226
|
||||
|
||||
``cxx_defaulted_functions``
|
||||
Defaulted functions, as defined in N2346_.
|
||||
|
||||
.. _N2346: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm
|
||||
|
||||
``cxx_defaulted_move_initializers``
|
||||
Defaulted move initializers, as defined in N3053_.
|
||||
|
||||
.. _N3053: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3053.html
|
||||
|
||||
``cxx_delegating_constructors``
|
||||
Delegating constructors, as defined in N1986_.
|
||||
|
||||
.. _N1986: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986.pdf
|
||||
|
||||
``cxx_deleted_functions``
|
||||
Deleted functions, as defined in N2346_.
|
||||
|
||||
.. _N2346: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm
|
||||
|
||||
``cxx_enum_forward_declarations``
|
||||
Enum forward declarations, as defined in N2764_.
|
||||
|
||||
.. _N2764: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf
|
||||
|
||||
``cxx_explicit_conversions``
|
||||
Explicit conversion operators, as defined in N2437_.
|
||||
|
||||
.. _N2437: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf
|
||||
|
||||
``cxx_extended_friend_declarations``
|
||||
Extended friend declarations, as defined in N1791_.
|
||||
|
||||
.. _N1791: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf
|
||||
|
||||
``cxx_extern_templates``
|
||||
Extern templates, as defined in N1987_.
|
||||
|
||||
.. _N1987: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1987.htm
|
||||
|
||||
``cxx_final``
|
||||
Override control ``final`` keyword, as defined in N2928_.
|
||||
|
||||
.. _N2928: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2928.htm
|
||||
|
||||
``cxx_func_identifier``
|
||||
Predefined ``__func__`` identifier, as defined in N2340_.
|
||||
|
||||
.. _N2340: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2340.htm
|
||||
|
||||
``cxx_generalized_initializers``
|
||||
Initializer lists, as defined in N2672_.
|
||||
|
||||
.. _N2672: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm
|
||||
|
||||
``cxx_inheriting_constructors``
|
||||
Inheriting constructors, as defined in N2540_.
|
||||
|
||||
.. _N2540: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2540.htm
|
||||
|
||||
``cxx_inline_namespaces``
|
||||
Inline namespaces, as defined in N2535_.
|
||||
|
||||
.. _N2535: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm
|
||||
|
||||
``cxx_lambdas``
|
||||
Lambda functions, as defined in N2927_.
|
||||
|
||||
.. _N2927: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2927.pdf
|
||||
|
||||
``cxx_local_type_template_args``
|
||||
Local and unnamed types as template arguments, as defined in N2657_.
|
||||
|
||||
.. _N2657: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm
|
||||
|
||||
``cxx_long_long_type``
|
||||
``long long`` type, as defined in N1811_.
|
||||
|
||||
.. _N1811: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1811.pdf
|
||||
|
||||
``cxx_noexcept``
|
||||
Exception specifications, as defined in N3050_.
|
||||
|
||||
.. _N3050: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3050.html
|
||||
|
||||
``cxx_nonstatic_member_init``
|
||||
Non-static data member initialization, as defined in N2756.
|
||||
|
||||
.. _N2756: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2756.htm
|
||||
|
||||
``cxx_nullptr``
|
||||
Null pointer, as defined in N2431_.
|
||||
|
||||
.. _N2431: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf
|
||||
|
||||
``cxx_override``
|
||||
Override control ``override`` keyword, as defined in N2928_.
|
||||
|
||||
.. _N2928: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2928.htm
|
||||
|
||||
``cxx_range_for``
|
||||
Range-based for, as defined in N2930_.
|
||||
|
||||
.. _N2930: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2930.html
|
||||
|
||||
``cxx_raw_string_literals``
|
||||
Raw string literals, as defined in N2442_.
|
||||
|
||||
.. _N2442: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm
|
||||
|
||||
``cxx_reference_qualified_functions``
|
||||
Reference qualified functions, as defined in N2439_.
|
||||
|
||||
.. _N2439: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm
|
||||
|
||||
``cxx_right_angle_brackets``
|
||||
Right angle bracket parsing, as defined in N1757_.
|
||||
|
||||
.. _N1757: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html
|
||||
|
||||
``cxx_rvalue_references``
|
||||
R-value references, as defined in N2118_.
|
||||
|
||||
.. _N2118: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html
|
||||
|
||||
``cxx_sizeof_member``
|
||||
Size of non-static data members, as defined in N2253_.
|
||||
|
||||
.. _N2253: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html
|
||||
|
||||
``cxx_static_assert``
|
||||
Static assert, as defined in N1720_.
|
||||
|
||||
.. _N1720: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html
|
||||
|
||||
``cxx_strong_enums``
|
||||
Strongly typed enums, as defined in N2347_.
|
||||
|
||||
.. _N2347: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf
|
||||
|
||||
``cxx_thread_local``
|
||||
Thread-local variables, as defined in N2659_.
|
||||
|
||||
.. _N2659: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2659.htm
|
||||
|
||||
``cxx_trailing_return_types``
|
||||
Automatic function return type, as defined in N2541_.
|
||||
|
||||
.. _N2541: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2541.htm
|
||||
|
||||
``cxx_unicode_literals``
|
||||
Unicode string literals, as defined in N2442_.
|
||||
|
||||
.. _N2442: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm
|
||||
|
||||
``cxx_uniform_initialization``
|
||||
Uniform intialization, as defined in N2640_.
|
||||
|
||||
.. _N2640: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2640.pdf
|
||||
|
||||
``cxx_unrestricted_unions``
|
||||
Unrestricted unions, as defined in N2544_.
|
||||
|
||||
.. _N2544: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf
|
||||
|
||||
``cxx_user_literals``
|
||||
User-defined literals, as defined in N2765_.
|
||||
|
||||
.. _N2765: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2765.pdf
|
||||
|
||||
``cxx_variadic_macros``
|
||||
Variadic macros, as defined in N1653_.
|
||||
|
||||
.. _N1653: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm
|
||||
|
||||
``cxx_variadic_templates``
|
||||
Variadic templates, as defined in N2242_.
|
||||
|
||||
.. _N2242: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf
|
||||
|
|
|
@ -2,7 +2,76 @@
|
|||
# Reference: http://gcc.gnu.org/projects/cxx0x.html
|
||||
|
||||
set(_oldestSupported "(__GNUC__ * 100 + __GNUC_MINOR__) >= 408")
|
||||
# Introduced in GCC 4.8.1
|
||||
set(GNU481_CXX11 "((__GNUC__ * 100 + __GNUC_MINOR__) > 408 || __GNUC_PATCHLEVEL__ >= 1) && __cplusplus >= 201103L")
|
||||
set(_cmake_feature_test_cxx_decltype_incomplete_return_types "${GNU481_CXX11}")
|
||||
set(_cmake_feature_test_cxx_reference_qualified_functions "${GNU481_CXX11}")
|
||||
set(GNU48_CXX11 "(__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L")
|
||||
set(_cmake_feature_test_cxx_alignas "${GNU48_CXX11}")
|
||||
set(_cmake_feature_test_cxx_alignof "${GNU48_CXX11}")
|
||||
set(_cmake_feature_test_cxx_attributes "${GNU48_CXX11}")
|
||||
set(_cmake_feature_test_cxx_inheriting_constructors "${GNU48_CXX11}")
|
||||
set(_cmake_feature_test_cxx_thread_local "${GNU48_CXX11}")
|
||||
# TODO: Should be supported by GNU 4.7
|
||||
set(GNU47_CXX11 "${_oldestSupported} && __cplusplus >= 201103L")
|
||||
set(_cmake_feature_test_cxx_alias_templates "${GNU47_CXX11}")
|
||||
set(_cmake_feature_test_cxx_delegating_constructors "${GNU47_CXX11}")
|
||||
set(_cmake_feature_test_cxx_extended_friend_declarations "${GNU47_CXX11}")
|
||||
set(_cmake_feature_test_cxx_final "${GNU47_CXX11}")
|
||||
set(_cmake_feature_test_cxx_noexcept "${GNU47_CXX11}")
|
||||
set(_cmake_feature_test_cxx_nonstatic_member_init "${GNU47_CXX11}")
|
||||
set(_cmake_feature_test_cxx_override "${GNU47_CXX11}")
|
||||
set(_cmake_feature_test_cxx_user_literals "${GNU47_CXX11}")
|
||||
# NOTE: C++11 was ratified in September 2011. GNU 4.7 is the first minor
|
||||
# release following that (March 2012), and the first minor release to
|
||||
# support -std=c++11. Prior to that, support for C++11 features is technically
|
||||
# experiemental and possibly incomplete (see for example the note below about
|
||||
# cxx_variadic_template_template_parameters)
|
||||
# TODO: Should be supported by GNU 4.6
|
||||
set(GNU46_CXX11 "${_oldestSupported} && __cplusplus >= 201103L")
|
||||
set(_cmake_feature_test_cxx_constexpr "${GNU46_CXX11}")
|
||||
set(_cmake_feature_test_cxx_defaulted_move_initializers "${GNU46_CXX11}")
|
||||
set(_cmake_feature_test_cxx_enum_forward_declarations "${GNU46_CXX11}")
|
||||
set(_cmake_feature_test_cxx_nullptr "${GNU46_CXX11}")
|
||||
set(_cmake_feature_test_cxx_range_for "${GNU46_CXX11}")
|
||||
set(_cmake_feature_test_cxx_unrestricted_unions "${GNU46_CXX11}")
|
||||
# TODO: Should be supported by GNU 4.5
|
||||
set(GNU45_CXX11 "${_oldestSupported} && __cplusplus >= 201103L")
|
||||
set(_cmake_feature_test_cxx_explicit_conversions "${GNU45_CXX11}")
|
||||
set(_cmake_feature_test_cxx_lambdas "${GNU45_CXX11}")
|
||||
set(_cmake_feature_test_cxx_local_type_template_args "${GNU45_CXX11}")
|
||||
set(_cmake_feature_test_cxx_raw_string_literals "${GNU45_CXX11}")
|
||||
# TODO: Should be supported by GNU 4.4
|
||||
set(GNU44_CXX11 "${_oldestSupported} && __cplusplus >= 201103L")
|
||||
set(_cmake_feature_test_cxx_auto_type "${GNU44_CXX11}")
|
||||
set(_cmake_feature_test_cxx_defaulted_functions "${GNU44_CXX11}")
|
||||
set(_cmake_feature_test_cxx_deleted_functions "${GNU44_CXX11}")
|
||||
set(_cmake_feature_test_cxx_generalized_initializers "${GNU44_CXX11}")
|
||||
set(_cmake_feature_test_cxx_inline_namespaces "${GNU44_CXX11}")
|
||||
set(_cmake_feature_test_cxx_sizeof_member "${GNU44_CXX11}")
|
||||
set(_cmake_feature_test_cxx_strong_enums "${GNU44_CXX11}")
|
||||
set(_cmake_feature_test_cxx_trailing_return_types "${GNU44_CXX11}")
|
||||
set(_cmake_feature_test_cxx_unicode_literals "${GNU44_CXX11}")
|
||||
set(_cmake_feature_test_cxx_uniform_initialization "${GNU44_CXX11}")
|
||||
set(_cmake_feature_test_cxx_variadic_templates "${GNU44_CXX11}")
|
||||
# TODO: If features are ever recorded for GNU 4.3, there should possibly
|
||||
# be a new feature added like cxx_variadic_template_template_parameters,
|
||||
# which is implemented by GNU 4.4, but not 4.3. cxx_variadic_templates is
|
||||
# actually implemented by GNU 4.3, but variadic template template parameters
|
||||
# 'completes' it, so that is the version we record as having the variadic
|
||||
# templates capability in CMake. See
|
||||
# http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf
|
||||
# TODO: Should be supported by GNU 4.3
|
||||
set(GNU43_CXX11 "${_oldestSupported} && __cplusplus >= 201103L")
|
||||
set(_cmake_feature_test_cxx_decltype "${GNU43_CXX11}")
|
||||
set(_cmake_feature_test_cxx_default_function_template_args "${GNU43_CXX11}")
|
||||
set(_cmake_feature_test_cxx_long_long_type "${GNU43_CXX11}")
|
||||
set(_cmake_feature_test_cxx_right_angle_brackets "${GNU43_CXX11}")
|
||||
set(_cmake_feature_test_cxx_rvalue_references "${GNU43_CXX11}")
|
||||
set(_cmake_feature_test_cxx_static_assert "${GNU43_CXX11}")
|
||||
# TODO: Should be supported since GNU 3.4?
|
||||
set(_cmake_feature_test_cxx_extern_templates "${_oldestSupported} && __cplusplus >= 201103L")
|
||||
# TODO: Should be supported forever?
|
||||
set(_cmake_feature_test_cxx_func_identifier "${_oldestSupported} && __cplusplus >= 201103L")
|
||||
set(_cmake_feature_test_cxx_variadic_macros "${_oldestSupported} && __cplusplus >= 201103L")
|
||||
set(_oldestSupported)
|
||||
|
|
|
@ -42,7 +42,51 @@
|
|||
#include <assert.h>
|
||||
|
||||
#define FOR_EACH_CXX_FEATURE(F) \
|
||||
F(cxx_auto_type)
|
||||
F(cxx_alias_templates) \
|
||||
F(cxx_alignas) \
|
||||
F(cxx_alignof) \
|
||||
F(cxx_attributes) \
|
||||
F(cxx_auto_type) \
|
||||
F(cxx_constexpr) \
|
||||
F(cxx_decltype) \
|
||||
F(cxx_decltype_incomplete_return_types) \
|
||||
F(cxx_default_function_template_args) \
|
||||
F(cxx_defaulted_functions) \
|
||||
F(cxx_defaulted_move_initializers) \
|
||||
F(cxx_delegating_constructors) \
|
||||
F(cxx_deleted_functions) \
|
||||
F(cxx_enum_forward_declarations) \
|
||||
F(cxx_explicit_conversions) \
|
||||
F(cxx_extended_friend_declarations) \
|
||||
F(cxx_extern_templates) \
|
||||
F(cxx_final) \
|
||||
F(cxx_func_identifier) \
|
||||
F(cxx_generalized_initializers) \
|
||||
F(cxx_inheriting_constructors) \
|
||||
F(cxx_inline_namespaces) \
|
||||
F(cxx_lambdas) \
|
||||
F(cxx_local_type_template_args) \
|
||||
F(cxx_long_long_type) \
|
||||
F(cxx_noexcept) \
|
||||
F(cxx_nonstatic_member_init) \
|
||||
F(cxx_nullptr) \
|
||||
F(cxx_override) \
|
||||
F(cxx_range_for) \
|
||||
F(cxx_raw_string_literals) \
|
||||
F(cxx_reference_qualified_functions) \
|
||||
F(cxx_right_angle_brackets) \
|
||||
F(cxx_rvalue_references) \
|
||||
F(cxx_sizeof_member) \
|
||||
F(cxx_static_assert) \
|
||||
F(cxx_strong_enums) \
|
||||
F(cxx_thread_local) \
|
||||
F(cxx_trailing_return_types) \
|
||||
F(cxx_unicode_literals) \
|
||||
F(cxx_uniform_initialization) \
|
||||
F(cxx_unrestricted_unions) \
|
||||
F(cxx_user_literals) \
|
||||
F(cxx_variadic_macros) \
|
||||
F(cxx_variadic_templates)
|
||||
|
||||
class cmMakefile::Internals
|
||||
{
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
|
||||
template <typename T1, typename T2>
|
||||
struct A
|
||||
{
|
||||
typedef T1 MyT1;
|
||||
using MyT2 = T2;
|
||||
};
|
||||
|
||||
using B = A<int, char>;
|
||||
template<typename T>
|
||||
using C = A<int, T>;
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
struct S1 {
|
||||
alignas(8) int n;
|
||||
};
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
int someFunc()
|
||||
{
|
||||
return alignof(int);
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
void unusedFunc [[noreturn]] () { throw 1; }
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
constexpr int getNum()
|
||||
{
|
||||
return 42;
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
int someFunc()
|
||||
{
|
||||
int i = 0;
|
||||
decltype(i) other = 0;
|
||||
return other;
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
|
||||
template<class T>
|
||||
struct A
|
||||
{
|
||||
~A() = delete;
|
||||
};
|
||||
|
||||
template<class T> auto h() -> A<T>;
|
||||
template<class T> auto i(T) -> T;
|
||||
template<class T> auto f(T) -> decltype(i(h<T>()));
|
||||
template<class T> auto f(T) -> void;
|
||||
auto g() -> void {
|
||||
f(42);
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
|
||||
template<typename T = int>
|
||||
int someFunc()
|
||||
{
|
||||
T t = 0;
|
||||
return t;
|
||||
}
|
||||
|
||||
void otherFunc()
|
||||
{
|
||||
someFunc();
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
struct A {
|
||||
A() = default;
|
||||
};
|
||||
|
||||
void someFunc()
|
||||
{
|
||||
A a;
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
struct A
|
||||
{
|
||||
A() = default;
|
||||
A& operator=(A&&) = default;
|
||||
A(A&&) = default;
|
||||
};
|
|
@ -0,0 +1,15 @@
|
|||
|
||||
class Foo
|
||||
{
|
||||
public:
|
||||
Foo(int i);
|
||||
|
||||
Foo(double d)
|
||||
: Foo(static_cast<int>(d))
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private:
|
||||
int m_i;
|
||||
};
|
|
@ -0,0 +1,6 @@
|
|||
|
||||
struct A
|
||||
{
|
||||
A(const A&) = delete;
|
||||
A& operator=(const A&) = delete;
|
||||
};
|
|
@ -0,0 +1,8 @@
|
|||
|
||||
enum SomeEnum : short;
|
||||
|
||||
void someFunc()
|
||||
{
|
||||
SomeEnum value;
|
||||
int i = value;
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
|
||||
class A
|
||||
{
|
||||
int m_i;
|
||||
public:
|
||||
explicit operator bool()
|
||||
{
|
||||
return m_i != 0;
|
||||
}
|
||||
};
|
|
@ -0,0 +1,25 @@
|
|||
|
||||
template <typename T>
|
||||
struct B
|
||||
{
|
||||
B() : m_i(42) {}
|
||||
private:
|
||||
int m_i;
|
||||
friend T;
|
||||
};
|
||||
|
||||
struct A
|
||||
{
|
||||
template<typename T>
|
||||
int getBValue(B<T> b)
|
||||
{
|
||||
return b.m_i;
|
||||
}
|
||||
};
|
||||
|
||||
void someFunc()
|
||||
{
|
||||
A a;
|
||||
B<A> b;
|
||||
a.getBValue(b);
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
|
||||
template<typename T>
|
||||
void someFunc()
|
||||
{
|
||||
}
|
||||
|
||||
extern template void someFunc<int>();
|
||||
|
||||
void otherFunc()
|
||||
{
|
||||
someFunc<int>();
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
struct A final {};
|
|
@ -0,0 +1,6 @@
|
|||
|
||||
void someFunc()
|
||||
{
|
||||
bool b = sizeof(__func__);
|
||||
(void)b;
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
|
||||
// Dummy implementation. Test only the compiler feature.
|
||||
namespace std {
|
||||
typedef decltype(sizeof(int)) size_t;
|
||||
template <class _E>
|
||||
class initializer_list
|
||||
{
|
||||
const _E* __begin_;
|
||||
size_t __size_;
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
struct A
|
||||
{
|
||||
A(std::initializer_list<T>) {}
|
||||
};
|
||||
|
||||
void someFunc()
|
||||
{
|
||||
A<int> as = { 1, 2, 3, 4 };
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
|
||||
struct A
|
||||
{
|
||||
int m_i;
|
||||
|
||||
A(int i) : m_i(i) {}
|
||||
};
|
||||
|
||||
struct B : public A
|
||||
{
|
||||
using A::A;
|
||||
};
|
||||
|
||||
void someFunc()
|
||||
{
|
||||
int i;
|
||||
B b(i);
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
namespace Lib
|
||||
{
|
||||
inline namespace Lib_1
|
||||
{
|
||||
template <typename T> class A;
|
||||
}
|
||||
|
||||
template <typename T> void g(T);
|
||||
}
|
||||
|
||||
struct MyClass {
|
||||
|
||||
};
|
||||
namespace Lib
|
||||
{
|
||||
template<>
|
||||
class A<MyClass> {
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
void someFunc()
|
||||
{
|
||||
Lib::A<MyClass> a;
|
||||
g(a); // ok, Lib is an associated namespace of A
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
void someFunc()
|
||||
{
|
||||
[](){}();
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
|
||||
template <typename T>
|
||||
class X { };
|
||||
template <typename T>
|
||||
void f(T t) { }
|
||||
struct {} unnamed_obj;
|
||||
void f() {
|
||||
struct A { };
|
||||
enum { e1 };
|
||||
typedef struct {} B;
|
||||
B b;
|
||||
X<A> x1;
|
||||
X<A*> x2;
|
||||
X<B> x3;
|
||||
f(e1);
|
||||
f(unnamed_obj);
|
||||
f(b);
|
||||
(void)x1;
|
||||
(void)x2;
|
||||
(void)x3;
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
void someFunc()
|
||||
{
|
||||
long long ll = 9223372036854775807LL;
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
void someFunc() noexcept
|
||||
{
|
||||
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
class A
|
||||
{
|
||||
int m_i = 42;
|
||||
};
|
|
@ -0,0 +1,10 @@
|
|||
|
||||
void someFunc(int*)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void otherFunc()
|
||||
{
|
||||
someFunc(nullptr);
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
struct A {
|
||||
virtual void doNothing() {}
|
||||
};
|
||||
struct B : A {
|
||||
void doNothing() override {}
|
||||
};
|
|
@ -0,0 +1,10 @@
|
|||
|
||||
void someFunc()
|
||||
{
|
||||
int accumulated = 0;
|
||||
int numbers[] = { 1, 2, 5 };
|
||||
for (int i : numbers)
|
||||
{
|
||||
accumulated += i;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
void someFunc()
|
||||
{
|
||||
const char p[] = R"(a\
|
||||
b
|
||||
c)";
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
|
||||
struct test{
|
||||
void f() & { }
|
||||
void f() && { }
|
||||
};
|
||||
|
||||
void someFunc(){
|
||||
test t;
|
||||
t.f(); // lvalue
|
||||
test().f(); // rvalue
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
|
||||
template<typename T>
|
||||
struct A
|
||||
{
|
||||
typedef T Result;
|
||||
};
|
||||
|
||||
void someFunc()
|
||||
{
|
||||
A<A<int>> object;
|
||||
(void)object;
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
void someFunc(int&&)
|
||||
{
|
||||
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
|
||||
struct A
|
||||
{
|
||||
int m_i;
|
||||
};
|
||||
|
||||
int someFunc()
|
||||
{
|
||||
return sizeof(A::m_i) > 0 ? 1 : 2;
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
static_assert(true, "static_assert test");
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
enum class Colors
|
||||
{
|
||||
RedColor,
|
||||
GreenColor,
|
||||
BlueColor
|
||||
};
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
thread_local unsigned int rage = 1;
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
auto someFunc() -> int
|
||||
{
|
||||
return 42;
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
|
||||
const char16_t lit_16[] = u"\u00DA";
|
||||
const char32_t lit_32[] = U"\u00DA";
|
|
@ -0,0 +1,9 @@
|
|||
struct A {};
|
||||
struct B {
|
||||
B(A) {}
|
||||
};
|
||||
|
||||
void Func()
|
||||
{
|
||||
B b{A{}};
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
|
||||
struct point {
|
||||
point() {}
|
||||
point(int x, int y) : x_(x), y_(y) {}
|
||||
int x_, y_;
|
||||
};
|
||||
union u {
|
||||
point p_;
|
||||
int i_;
|
||||
const char* s_;
|
||||
};
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
long double operator "" _meters(long double);
|
||||
|
||||
void someFunc()
|
||||
{
|
||||
long double i = 1.2_meters;
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
|
||||
int someFunc(int, char, int)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define FUNC_WRAPPER(...) someFunc(__VA_ARGS__)
|
||||
|
||||
void otherFunc()
|
||||
{
|
||||
FUNC_WRAPPER(42, 'a', 7);
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
template<int I, int... Is>
|
||||
struct Interface;
|
||||
|
||||
template<int I>
|
||||
struct Interface<I>
|
||||
{
|
||||
static int accumulate()
|
||||
{
|
||||
return I;
|
||||
}
|
||||
};
|
||||
|
||||
template<int I, int... Is>
|
||||
struct Interface
|
||||
{
|
||||
static int accumulate()
|
||||
{
|
||||
return I + Interface<Is...>::accumulate();
|
||||
}
|
||||
};
|
||||
|
||||
// Note: split this into a separate test if a
|
||||
// cxx_variadic_template_template_parameters feature is added.
|
||||
|
||||
template<typename T>
|
||||
struct eval {
|
||||
enum {
|
||||
Matched = 0
|
||||
};
|
||||
};
|
||||
|
||||
template<template<typename...> class T, typename... U>
|
||||
struct eval<T<U...> > {
|
||||
enum {
|
||||
Matched = 1
|
||||
};
|
||||
};
|
||||
|
||||
template<typename...>
|
||||
struct A {
|
||||
|
||||
};
|
||||
template<typename T>
|
||||
struct B {
|
||||
|
||||
};
|
||||
template<typename T, typename U>
|
||||
struct C {
|
||||
|
||||
};
|
||||
template<typename T, typename U, typename...>
|
||||
struct D {
|
||||
|
||||
};
|
||||
|
||||
// Note: This test assumes that a compiler supporting this feature
|
||||
// supports static_assert. Add a workaround if that does not hold.
|
||||
static_assert(eval<A<> >::Matched, "A Matches");
|
||||
static_assert(eval<A<int> >::Matched, "A Matches");
|
||||
static_assert(eval<A<int, char> >::Matched, "A Matches");
|
||||
static_assert(eval<B<int> >::Matched, "B Matches");
|
||||
static_assert(eval<C<int, char> >::Matched, "C Matches");
|
||||
static_assert(eval<D<int, char> >::Matched, "D Matches");
|
||||
static_assert(eval<D<int, char, bool> >::Matched, "D Matches");
|
||||
static_assert(eval<D<int, char, bool, double> >::Matched, "D Matches");
|
Loading…
Reference in New Issue