aboutsummaryrefslogtreecommitdiffstats
path: root/cmake/cmake-cxx11
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/cmake-cxx11')
-rw-r--r--cmake/cmake-cxx11/.gitignore1
-rw-r--r--cmake/cmake-cxx11/MERGE-TODO7
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features.cmake142
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-__func__.cpp8
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-auto.cpp12
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-auto_fail_compile.cpp7
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-auto_ret_type.cpp8
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-class_override_final.cpp21
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-class_override_final_fail_compile.cpp25
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-constexpr.cpp19
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-cstdint.cpp11
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-decltype.cpp10
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-initializer_list.cpp27
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-lambda.cpp5
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-long_long.cpp7
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-nullptr.cpp6
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-nullptr_fail_compile.cpp6
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-regex.cpp26
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-rvalue-references.cpp57
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-sizeof_member.cpp14
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-sizeof_member_fail.cpp9
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-static_assert.cpp5
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-static_assert_fail_compile.cpp5
-rw-r--r--cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-variadic_templates.cpp23
-rw-r--r--cmake/cmake-cxx11/Tests/Module/CXX11Features/CMakeLists.txt33
-rw-r--r--cmake/cmake-cxx11/Tests/Module/CXX11Features/cxx11features.cxx57
26 files changed, 551 insertions, 0 deletions
diff --git a/cmake/cmake-cxx11/.gitignore b/cmake/cmake-cxx11/.gitignore
new file mode 100644
index 00000000..378eac25
--- /dev/null
+++ b/cmake/cmake-cxx11/.gitignore
@@ -0,0 +1 @@
+build
diff --git a/cmake/cmake-cxx11/MERGE-TODO b/cmake/cmake-cxx11/MERGE-TODO
new file mode 100644
index 00000000..dc2ce480
--- /dev/null
+++ b/cmake/cmake-cxx11/MERGE-TODO
@@ -0,0 +1,7 @@
+These things need to be changed when this module is merged into CMake:
+
+-change include(CheckCXXCompilerFlag) in CheckCXX11Features.cmake to
+ include(${CMAKE_CURRENT_LIST_DIR}/CheckCXXCompilerFlag.cmake)
+-remove the setting of CMAKE_MODULE_PATH from the testcase CMakeLists.txt
+-change all tabs to spaces in the cpp files
+
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features.cmake b/cmake/cmake-cxx11/Modules/CheckCXX11Features.cmake
new file mode 100644
index 00000000..05c986ce
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features.cmake
@@ -0,0 +1,142 @@
+# - Check which parts of the C++11 standard the compiler supports
+#
+# When found it will set the following variables
+#
+# CXX11_COMPILER_FLAGS - the compiler flags needed to get C++11 features
+#
+# HAS_CXX11_AUTO - auto keyword
+# HAS_CXX11_AUTO_RET_TYPE - function declaration with deduced return types
+# HAS_CXX11_CLASS_OVERRIDE - override and final keywords for classes and methods
+# HAS_CXX11_CONSTEXPR - constexpr keyword
+# HAS_CXX11_CSTDINT_H - cstdint header
+# HAS_CXX11_DECLTYPE - decltype keyword
+# HAS_CXX11_FUNC - __func__ preprocessor constant
+# HAS_CXX11_INITIALIZER_LIST - initializer list
+# HAS_CXX11_LAMBDA - lambdas
+# HAS_CXX11_LIB_REGEX - regex library
+# HAS_CXX11_LONG_LONG - long long signed & unsigned types
+# HAS_CXX11_NULLPTR - nullptr
+# HAS_CXX11_RVALUE_REFERENCES - rvalue references
+# HAS_CXX11_SIZEOF_MEMBER - sizeof() non-static members
+# HAS_CXX11_STATIC_ASSERT - static_assert()
+# HAS_CXX11_VARIADIC_TEMPLATES - variadic templates
+
+#=============================================================================
+# Copyright 2011,2012 Rolf Eike Beer <[email protected]>
+# Copyright 2012 Andreas Weis
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+#
+# Each feature may have up to 3 checks, every one of them in it's own file
+# FEATURE.cpp - example that must build and return 0 when run
+# FEATURE_fail.cpp - example that must build, but may not return 0 when run
+# FEATURE_fail_compile.cpp - example that must fail compilation
+#
+# The first one is mandatory, the latter 2 are optional and do not depend on
+# each other (i.e. only one may be present).
+#
+
+if (NOT CMAKE_CXX_COMPILER_LOADED)
+ message(FATAL_ERROR "CheckCXX11Features modules only works if language CXX is enabled")
+endif ()
+
+cmake_minimum_required(VERSION 2.8.3)
+
+#
+### Check for needed compiler flags
+#
+include(CheckCXXCompilerFlag)
+check_cxx_compiler_flag("-std=c++11" _HAS_CXX11_FLAG)
+if (NOT _HAS_CXX11_FLAG)
+ check_cxx_compiler_flag("-std=c++0x" _HAS_CXX0X_FLAG)
+endif ()
+
+if (_HAS_CXX11_FLAG)
+ set(CXX11_COMPILER_FLAGS "-std=c++11")
+elseif (_HAS_CXX0X_FLAG)
+ set(CXX11_COMPILER_FLAGS "-std=c++0x")
+endif ()
+
+function(cxx11_check_feature FEATURE_NAME RESULT_VAR)
+ if (NOT DEFINED ${RESULT_VAR})
+ set(_bindir "${CMAKE_CURRENT_BINARY_DIR}/cxx11_${FEATURE_NAME}")
+
+ set(_SRCFILE_BASE ${CMAKE_CURRENT_LIST_DIR}/CheckCXX11Features/cxx11-test-${FEATURE_NAME})
+ set(_LOG_NAME "\"${FEATURE_NAME}\"")
+ message(STATUS "Checking C++11 support for ${_LOG_NAME}")
+
+ set(_SRCFILE "${_SRCFILE_BASE}.cpp")
+ set(_SRCFILE_FAIL "${_SRCFILE_BASE}_fail.cpp")
+ set(_SRCFILE_FAIL_COMPILE "${_SRCFILE_BASE}_fail_compile.cpp")
+
+ if (CROSS_COMPILING)
+ try_compile(${RESULT_VAR} "${_bindir}" "${_SRCFILE}"
+ COMPILE_DEFINITIONS "${CXX11_COMPILER_FLAGS}")
+ if (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
+ try_compile(${RESULT_VAR} "${_bindir}_fail" "${_SRCFILE_FAIL}"
+ COMPILE_DEFINITIONS "${CXX11_COMPILER_FLAGS}")
+ endif (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
+ else (CROSS_COMPILING)
+ try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR
+ "${_bindir}" "${_SRCFILE}"
+ COMPILE_DEFINITIONS "${CXX11_COMPILER_FLAGS}")
+ if (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR)
+ set(${RESULT_VAR} TRUE)
+ else (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR)
+ set(${RESULT_VAR} FALSE)
+ endif (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR)
+ if (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
+ try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR
+ "${_bindir}_fail" "${_SRCFILE_FAIL}"
+ COMPILE_DEFINITIONS "${CXX11_COMPILER_FLAGS}")
+ if (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR)
+ set(${RESULT_VAR} TRUE)
+ else (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR)
+ set(${RESULT_VAR} FALSE)
+ endif (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR)
+ endif (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL})
+ endif (CROSS_COMPILING)
+ if (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL_COMPILE})
+ try_compile(_TMP_RESULT "${_bindir}_fail_compile" "${_SRCFILE_FAIL_COMPILE}"
+ COMPILE_DEFINITIONS "${CXX11_COMPILER_FLAGS}")
+ if (_TMP_RESULT)
+ set(${RESULT_VAR} FALSE)
+ else (_TMP_RESULT)
+ set(${RESULT_VAR} TRUE)
+ endif (_TMP_RESULT)
+ endif (${RESULT_VAR} AND EXISTS ${_SRCFILE_FAIL_COMPILE})
+
+ if (${RESULT_VAR})
+ message(STATUS "Checking C++11 support for ${_LOG_NAME}: works")
+ else (${RESULT_VAR})
+ message(STATUS "Checking C++11 support for ${_LOG_NAME}: not supported")
+ endif (${RESULT_VAR})
+ set(${RESULT_VAR} ${${RESULT_VAR}} CACHE INTERNAL "C++11 support for ${_LOG_NAME}")
+ endif (NOT DEFINED ${RESULT_VAR})
+endfunction(cxx11_check_feature)
+
+cxx11_check_feature("__func__" HAS_CXX11_FUNC)
+cxx11_check_feature("auto" HAS_CXX11_AUTO)
+cxx11_check_feature("auto_ret_type" HAS_CXX11_AUTO_RET_TYPE)
+cxx11_check_feature("class_override_final" HAS_CXX11_CLASS_OVERRIDE)
+cxx11_check_feature("constexpr" HAS_CXX11_CONSTEXPR)
+cxx11_check_feature("cstdint" HAS_CXX11_CSTDINT_H)
+cxx11_check_feature("decltype" HAS_CXX11_DECLTYPE)
+cxx11_check_feature("initializer_list" HAS_CXX11_INITIALIZER_LIST)
+cxx11_check_feature("lambda" HAS_CXX11_LAMBDA)
+cxx11_check_feature("long_long" HAS_CXX11_LONG_LONG)
+cxx11_check_feature("nullptr" HAS_CXX11_NULLPTR)
+cxx11_check_feature("regex" HAS_CXX11_LIB_REGEX)
+cxx11_check_feature("rvalue-references" HAS_CXX11_RVALUE_REFERENCES)
+cxx11_check_feature("sizeof_member" HAS_CXX11_SIZEOF_MEMBER)
+cxx11_check_feature("static_assert" HAS_CXX11_STATIC_ASSERT)
+cxx11_check_feature("variadic_templates" HAS_CXX11_VARIADIC_TEMPLATES)
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-__func__.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-__func__.cpp
new file mode 100644
index 00000000..3bfd8a89
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-__func__.cpp
@@ -0,0 +1,8 @@
+int main(void)
+{
+ if (!__func__)
+ return 1;
+ if (!(*__func__))
+ return 1;
+ return 0;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-auto.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-auto.cpp
new file mode 100644
index 00000000..948648e9
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-auto.cpp
@@ -0,0 +1,12 @@
+
+int main()
+{
+ auto i = 5;
+ auto f = 3.14159f;
+ auto d = 3.14159;
+ bool ret = (
+ (sizeof(f) < sizeof(d)) &&
+ (sizeof(i) == sizeof(int))
+ );
+ return ret ? 0 : 1;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-auto_fail_compile.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-auto_fail_compile.cpp
new file mode 100644
index 00000000..3c0e3f2e
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-auto_fail_compile.cpp
@@ -0,0 +1,7 @@
+int main(void)
+{
+ // must fail because there is no initializer
+ auto i;
+
+ return 0;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-auto_ret_type.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-auto_ret_type.cpp
new file mode 100644
index 00000000..937b6835
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-auto_ret_type.cpp
@@ -0,0 +1,8 @@
+auto foo(int i) -> int {
+ return i - 1;
+}
+
+int main()
+{
+ return foo(1);
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-class_override_final.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-class_override_final.cpp
new file mode 100644
index 00000000..f5870b19
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-class_override_final.cpp
@@ -0,0 +1,21 @@
+class base {
+public:
+ virtual int foo(int a)
+ { return 4 + a; }
+ int bar(int a) final
+ { return a - 2; }
+};
+
+class sub final : public base {
+public:
+ virtual int foo(int a) override
+ { return 8 + 2 * a; };
+};
+
+int main(void)
+{
+ base b;
+ sub s;
+
+ return (b.foo(2) * 2 == s.foo(2)) ? 0 : 1;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-class_override_final_fail_compile.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-class_override_final_fail_compile.cpp
new file mode 100644
index 00000000..bc00b278
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-class_override_final_fail_compile.cpp
@@ -0,0 +1,25 @@
+class base {
+public:
+ virtual int foo(int a)
+ { return 4 + a; }
+ virtual int bar(int a) final
+ { return a - 2; }
+};
+
+class sub final : public base {
+public:
+ virtual int foo(int a) override
+ { return 8 + 2 * a; };
+ virtual int bar(int a)
+ { return a; }
+};
+
+class impossible : public sub { };
+
+int main(void)
+{
+ base b;
+ sub s;
+
+ return 1;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-constexpr.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-constexpr.cpp
new file mode 100644
index 00000000..ed624512
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-constexpr.cpp
@@ -0,0 +1,19 @@
+constexpr int square(int x)
+{
+ return x*x;
+}
+
+constexpr int the_answer()
+{
+ return 42;
+}
+
+int main()
+{
+ int test_arr[square(3)];
+ bool ret = (
+ (square(the_answer()) == 1764) &&
+ (sizeof(test_arr)/sizeof(test_arr[0]) == 9)
+ );
+ return ret ? 0 : 1;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-cstdint.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-cstdint.cpp
new file mode 100644
index 00000000..ca2c72dd
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-cstdint.cpp
@@ -0,0 +1,11 @@
+#include <cstdint>
+
+int main()
+{
+ bool test =
+ (sizeof(int8_t) == 1) &&
+ (sizeof(int16_t) == 2) &&
+ (sizeof(int32_t) == 4) &&
+ (sizeof(int64_t) == 8);
+ return test ? 0 : 1;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-decltype.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-decltype.cpp
new file mode 100644
index 00000000..0dbb1cc5
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-decltype.cpp
@@ -0,0 +1,10 @@
+bool check_size(int i)
+{
+ return sizeof(int) == sizeof(decltype(i));
+}
+
+int main()
+{
+ bool ret = check_size(42);
+ return ret ? 0 : 1;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-initializer_list.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-initializer_list.cpp
new file mode 100644
index 00000000..35e6c384
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-initializer_list.cpp
@@ -0,0 +1,27 @@
+#include <vector>
+
+class seq {
+public:
+ seq(std::initializer_list<int> list);
+
+ int length() const;
+private:
+ std::vector<int> m_v;
+};
+
+seq::seq(std::initializer_list<int> list)
+ : m_v(list)
+{
+}
+
+int seq::length() const
+{
+ return m_v.size();
+}
+
+int main(void)
+{
+ seq a = {18, 20, 2, 0, 4, 7};
+
+ return (a.length() == 6) ? 0 : 1;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-lambda.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-lambda.cpp
new file mode 100644
index 00000000..4c33ed58
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-lambda.cpp
@@ -0,0 +1,5 @@
+int main()
+{
+ int ret = 0;
+ return ([&ret]() -> int { return ret; })();
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-long_long.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-long_long.cpp
new file mode 100644
index 00000000..09111275
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-long_long.cpp
@@ -0,0 +1,7 @@
+int main(void)
+{
+ long long l;
+ unsigned long long ul;
+
+ return ((sizeof(l) >= 8) && (sizeof(ul) >= 8)) ? 0 : 1;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-nullptr.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-nullptr.cpp
new file mode 100644
index 00000000..9f410715
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-nullptr.cpp
@@ -0,0 +1,6 @@
+int main(void)
+{
+ void *v = nullptr;
+
+ return v ? 1 : 0;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-nullptr_fail_compile.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-nullptr_fail_compile.cpp
new file mode 100644
index 00000000..6a002bcb
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-nullptr_fail_compile.cpp
@@ -0,0 +1,6 @@
+int main(void)
+{
+ int i = nullptr;
+
+ return 1;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-regex.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-regex.cpp
new file mode 100644
index 00000000..2fe01c4f
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-regex.cpp
@@ -0,0 +1,26 @@
+#include <algorithm>
+#include <regex>
+
+int parse_line(std::string const& line)
+{
+ std::string tmp;
+ if(std::regex_search(line, std::regex("(\\s)+(-)?(\\d)+//(-)?(\\d)+(\\s)+"))) {
+ tmp = std::regex_replace(line, std::regex("(-)?(\\d)+//(-)?(\\d)+"), std::string("V"));
+ } else if(std::regex_search(line, std::regex("(\\s)+(-)?(\\d)+/(-)?(\\d)+(\\s)+"))) {
+ tmp = std::regex_replace(line, std::regex("(-)?(\\d)+/(-)?(\\d)+"), std::string("V"));
+ } else if(std::regex_search(line, std::regex("(\\s)+(-)?(\\d)+/(-)?(\\d)+/(-)?(\\d)+(\\s)+"))) {
+ tmp = std::regex_replace(line, std::regex("(-)?(\\d)+/(-)?(\\d)+/(-)?(\\d)+"), std::string("V"));
+ } else {
+ tmp = std::regex_replace(line, std::regex("(-)?(\\d)+"), std::string("V"));
+ }
+ return static_cast<int>(std::count(tmp.begin(), tmp.end(), 'V'));
+}
+
+int main()
+{
+ bool test = (parse_line("f 7/7/7 -3/3/-3 2/-2/2") == 3) &&
+ (parse_line("f 7//7 3//-3 -2//2") == 3) &&
+ (parse_line("f 7/7 3/-3 -2/2") == 3) &&
+ (parse_line("f 7 3 -2") == 3);
+ return test ? 0 : 1;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-rvalue-references.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-rvalue-references.cpp
new file mode 100644
index 00000000..e6e7e5a9
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-rvalue-references.cpp
@@ -0,0 +1,57 @@
+#include <cassert>
+
+class rvmove {
+public:
+ void *ptr;
+ char *array;
+
+ rvmove()
+ : ptr(0),
+ array(new char[10])
+ {
+ ptr = this;
+ }
+
+ rvmove(rvmove &&other)
+ : ptr(other.ptr),
+ array(other.array)
+ {
+ other.array = 0;
+ other.ptr = 0;
+ }
+
+ ~rvmove()
+ {
+ assert(((ptr != 0) && (array != 0)) || ((ptr == 0) && (array == 0)));
+ delete[] array;
+ }
+
+ rvmove &operator=(rvmove &&other)
+ {
+ delete[] array;
+ ptr = other.ptr;
+ array = other.array;
+ other.array = 0;
+ other.ptr = 0;
+ return *this;
+ }
+
+ static rvmove create()
+ {
+ return rvmove();
+ }
+private:
+ rvmove(const rvmove &);
+ rvmove &operator=(const rvmove &);
+};
+
+int main()
+{
+ rvmove mine;
+ if (mine.ptr != &mine)
+ return 1;
+ mine = rvmove::create();
+ if (mine.ptr == &mine)
+ return 1;
+ return 0;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-sizeof_member.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-sizeof_member.cpp
new file mode 100644
index 00000000..4902fc73
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-sizeof_member.cpp
@@ -0,0 +1,14 @@
+struct foo {
+ char bar;
+ int baz;
+};
+
+int main(void)
+{
+ bool ret = (
+ (sizeof(foo::bar) == 1) &&
+ (sizeof(foo::baz) >= sizeof(foo::bar)) &&
+ (sizeof(foo) >= sizeof(foo::bar) + sizeof(foo::baz))
+ );
+ return ret ? 0 : 1;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-sizeof_member_fail.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-sizeof_member_fail.cpp
new file mode 100644
index 00000000..0348c2ce
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-sizeof_member_fail.cpp
@@ -0,0 +1,9 @@
+struct foo {
+ int baz;
+ double bar;
+};
+
+int main(void)
+{
+ return (sizeof(foo::bar) == 4) ? 0 : 1;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-static_assert.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-static_assert.cpp
new file mode 100644
index 00000000..47c2fefb
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-static_assert.cpp
@@ -0,0 +1,5 @@
+int main(void)
+{
+ static_assert(0 < 1, "your ordering of integers is screwed");
+ return 0;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-static_assert_fail_compile.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-static_assert_fail_compile.cpp
new file mode 100644
index 00000000..362fcdde
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-static_assert_fail_compile.cpp
@@ -0,0 +1,5 @@
+int main(void)
+{
+ static_assert(1 < 0, "your ordering of integers is screwed");
+ return 0;
+}
diff --git a/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-variadic_templates.cpp b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-variadic_templates.cpp
new file mode 100644
index 00000000..4518e886
--- /dev/null
+++ b/cmake/cmake-cxx11/Modules/CheckCXX11Features/cxx11-test-variadic_templates.cpp
@@ -0,0 +1,23 @@
+int Accumulate()
+{
+ return 0;
+}
+
+template<typename T, typename... Ts>
+int Accumulate(T v, Ts... vs)
+{
+ return v + Accumulate(vs...);
+}
+
+template<int... Is>
+int CountElements()
+{
+ return sizeof...(Is);
+}
+
+int main()
+{
+ int acc = Accumulate(1, 2, 3, 4, -5);
+ int count = CountElements<1,2,3,4,5>();
+ return ((acc == 5) && (count == 5)) ? 0 : 1;
+}
diff --git a/cmake/cmake-cxx11/Tests/Module/CXX11Features/CMakeLists.txt b/cmake/cmake-cxx11/Tests/Module/CXX11Features/CMakeLists.txt
new file mode 100644
index 00000000..f117eb16
--- /dev/null
+++ b/cmake/cmake-cxx11/Tests/Module/CXX11Features/CMakeLists.txt
@@ -0,0 +1,33 @@
+cmake_minimum_required(VERSION 2.8.3 FATAL_ERROR)
+project(Cxx11Features CXX)
+
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../../Modules")
+
+include(CheckCXX11Features)
+
+foreach (flag IN ITEMS
+ HAS_CXX11_AUTO
+ HAS_CXX11_AUTO_RET_TYPE
+ HAS_CXX11_CLASS_OVERRIDE
+ HAS_CXX11_CONSTEXPR
+ HAS_CXX11_CSTDINT_H
+ HAS_CXX11_DECLTYPE
+ HAS_CXX11_FUNC
+ HAS_CXX11_INITIALIZER_LIST
+ HAS_CXX11_LAMBDA
+ HAS_CXX11_LIB_REGEX
+ HAS_CXX11_LONG_LONG
+ HAS_CXX11_NULLPTR
+ HAS_CXX11_RVALUE_REFERENCES
+ HAS_CXX11_SIZEOF_MEMBER
+ HAS_CXX11_STATIC_ASSERT
+ HAS_CXX11_VARIADIC_TEMPLATES
+ )
+ if (${flag})
+ add_definitions("-D${flag}")
+ message(STATUS "Compiler C++11 support flag ${flag} set")
+ endif ()
+endforeach (flag)
+
+set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${CXX11_COMPILER_FLAGS})
+add_executable(CXX11Features cxx11features.cxx)
diff --git a/cmake/cmake-cxx11/Tests/Module/CXX11Features/cxx11features.cxx b/cmake/cmake-cxx11/Tests/Module/CXX11Features/cxx11features.cxx
new file mode 100644
index 00000000..c09038fb
--- /dev/null
+++ b/cmake/cmake-cxx11/Tests/Module/CXX11Features/cxx11features.cxx
@@ -0,0 +1,57 @@
+#if defined(HAS_CXX0X_CSTDINT_H)
+#include <cstdint>
+#endif
+
+#include <sys/types.h>
+
+struct thing {
+ unsigned char one;
+#if defined(HAS_CXX0X_CSTDINT_H)
+ uint32_t four;
+#endif
+#if defined(HAS_CXX0X_LONG_LONG)
+ long long eight;
+#endif
+};
+
+#include <stdio.h>
+
+int main()
+{
+#if defined (HAS_CXX0X_NULLPTR)
+ void *nix = nullptr;
+#else /* HAS_CXX0X_NULLPTR */
+ void *nix = 0;
+#endif /* HAS_CXX0X_NULLPTR */
+
+#if defined(HAS_CXX0X_STATIC_ASSERT)
+ static_assert(1 < 42, "Your C++ compiler is b0rked");
+#endif /* HAS_CXX0X_STATIC_ASSERT */
+
+#if defined(HAS_CXX0X_FUNC)
+ const char *funcname = __func__;
+ printf("the name of main() function is: %s\n", funcname);
+#endif /* HAS_CXX0X_FUNC */
+
+#if defined(HAS_CXX0X_SIZEOF_MEMBER)
+ size_t onesize = sizeof(thing::one);
+#if defined(HAS_CXX0X_STATIC_ASSERT)
+ static_assert(sizeof(thing::one) == 1, "Your char is not one byte long");
+#endif /* HAS_CXX0X_STATIC_ASSERT */
+
+#if defined(HAS_CXX0X_CSTDINT_H)
+ size_t foursize = sizeof(thing::four);
+#if defined(HAS_CXX0X_STATIC_ASSERT)
+ static_assert(sizeof(thing::four) == 4, "Your uint32_t is not 32 bit long");
+#endif /* HAS_CXX0X_STATIC_ASSERT */
+#endif /* HAS_CXX0X_CSTDINT_H */
+#if defined(HAS_CXX0X_LONG_LONG)
+ size_t eightsize = sizeof(thing::eight);
+#if defined(HAS_CXX0X_STATIC_ASSERT)
+ static_assert(sizeof(thing::eight) == 8, "Your long long is not 64 bit long");
+#endif /* HAS_CXX0X_STATIC_ASSERT */
+#endif /* HAS_CXX0X_LONG_LONG */
+#endif /* HAS_CXX0X_SIZEOF_MEMBER */
+
+ return 0;
+}