webm/build/cxx11_tests.cmake
Tom Finegan 4ff5785938 cmake: Add C++11 move ctor and member initializer tests.
Change-Id: I747a206db03fcb8f13265e0c56c86dd5a9f6eff8
2016-03-21 14:41:49 -07:00

139 lines
3.1 KiB
CMake

## Copyright (c) 2016 The WebM project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license
## that can be found in the LICENSE file in the root of the source
## tree. An additional intellectual property rights grant can be found
## in the file PATENTS. All contributing project authors may
## be found in the AUTHORS file in the root of the source tree.
cmake_minimum_required(VERSION 3.2)
if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR
CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR
CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
CHECK_CXX_COMPILER_FLAG("-std=c++11" HAVE_CXX11)
if (HAVE_CXX11)
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}" CACHE STRING "" FORCE)
endif ()
endif ()
# C++11 compile tests.
if (MSVC OR HAVE_CXX11)
# std::unique_ptr
check_cxx_source_compiles("
#include <memory>
int main() {
std::unique_ptr<int> ptr;
(void)ptr;
return 0;
}"
HAVE_UNIQUE_PTR)
# default member values
check_cxx_source_compiles("
struct Foo {
int a = 0;
};
int main() {
Foo bar;
(void)bar;
return 0;
}"
HAVE_DEFAULT_MEMBER_VALUES)
# defaulted methods
check_cxx_source_compiles("
struct Foo {
Foo() = default;
~Foo() = default;
};
int main() {
Foo bar;
(void)bar;
return 0;
}"
HAVE_DEFAULTED_MEMBER_FUNCTIONS)
# deleted methods
check_cxx_source_compiles("
struct Foo {
Foo() {}
Foo(const Foo&) = delete;
};
int main() {
Foo bar;
(void)bar;
return 0;
}"
HAVE_DELETED_MEMBER_FUNCTIONS)
# auto&
check_cxx_source_compiles("
int main() {
int a;
auto& b = a;
(void)b;
return 0;
}"
HAVE_AUTO_REF)
# ranged for
check_cxx_source_compiles("
int main() {
int a[4];
for (int& b : a) {
b = 0;
}
return 0;
}"
HAVE_RANGED_FOR)
# move constructors
check_cxx_source_compiles("
struct Foo {
Foo() {}
Foo(Foo&&) = default;
Foo(const Foo&) = delete;
};
int main() {
Foo bar;
(void)bar;
return 0;
}"
HAVE_MOVE_CONSTRUCTORS)
# member initializers
check_cxx_source_compiles("
struct Foo {
Foo() {}
Foo(int a_val, int b_val) : a(a_val), b(b_val) {}
int a;
int b;
};
struct Bar {
Bar() {}
Foo f = Foo(1, 2);
};
int main() {
Bar bar;
(void)bar;
return 0;
}"
HAVE_MEMBER_INITIALIZERS)
endif ()
if (NOT HAVE_UNIQUE_PTR
OR NOT HAVE_DEFAULT_MEMBER_VALUES
OR NOT HAVE_DEFAULTED_MEMBER_FUNCTIONS
OR NOT HAVE_DELETED_MEMBER_FUNCTIONS
OR NOT HAVE_AUTO_REF
OR NOT HAVE_RANGED_FOR
OR NOT HAVE_MOVE_CONSTRUCTORS
OR NOT HAVE_MEMBER_INITIALIZERS)
# TODO(tomfinegan): Update settings at the include site instead of in here.
set(ENABLE_TESTS OFF)
set(ENABLE_WEBMTS OFF)
message(WARNING "C++11 feature(s) not supported, tests and webmts disabled.")
endif ()