From a3d0ae17581dd11f969eac3a1c43f9f009b23163 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Mon, 17 Nov 2014 23:24:31 +0100 Subject: [PATCH] Features: Fix the default C dialect for Clang and GNU. Clang 3.4 uses C99 by default, and Clang 3.6 uses C11 by default: http://thread.gmane.org/gmane.comp.compilers.clang.devel/39379 GNU 4.9 uses C90 by default, and GNU 5.0 uses C11 by default: https://gcc.gnu.org/gcc-5/changes.html Test that the default compiler settings result in the expected dialect macros being defined for both C and CXX. Remove the unused main.c file from the CompileFeatures unit test. --- Modules/Compiler/Clang-C.cmake | 6 +++++- Modules/Compiler/GNU-C.cmake | 7 +++++-- Tests/CompileFeatures/CMakeLists.txt | 22 ++++++++++++++++++++ Tests/CompileFeatures/default_dialect.c | 22 ++++++++++++++++++++ Tests/CompileFeatures/default_dialect.cpp | 25 +++++++++++++++++++++++ Tests/CompileFeatures/main.c | 12 ----------- 6 files changed, 79 insertions(+), 15 deletions(-) create mode 100644 Tests/CompileFeatures/default_dialect.c create mode 100644 Tests/CompileFeatures/default_dialect.cpp delete mode 100644 Tests/CompileFeatures/main.c diff --git a/Modules/Compiler/Clang-C.cmake b/Modules/Compiler/Clang-C.cmake index d8c360193..d504d699d 100644 --- a/Modules/Compiler/Clang-C.cmake +++ b/Modules/Compiler/Clang-C.cmake @@ -17,7 +17,11 @@ if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.4) set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11") endif() -set(CMAKE_C_STANDARD_DEFAULT 90) +if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.6) + set(CMAKE_C_STANDARD_DEFAULT 11) +elseif(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.4) + set(CMAKE_C_STANDARD_DEFAULT 99) +endif() macro(cmake_record_c_compile_features) macro(_get_clang_features std_version list) diff --git a/Modules/Compiler/GNU-C.cmake b/Modules/Compiler/GNU-C.cmake index 35954be52..24d439d4a 100644 --- a/Modules/Compiler/GNU-C.cmake +++ b/Modules/Compiler/GNU-C.cmake @@ -12,8 +12,11 @@ if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.7) set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11") endif() -# This may change in a future GNU version. -set(CMAKE_C_STANDARD_DEFAULT 90) +if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0) + set(CMAKE_C_STANDARD_DEFAULT 11) +else(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.7) + set(CMAKE_C_STANDARD_DEFAULT 90) +endif() macro(cmake_record_c_compile_features) macro(_get_gcc_features std_version list) diff --git a/Tests/CompileFeatures/CMakeLists.txt b/Tests/CompileFeatures/CMakeLists.txt index 5ce188a22..ff5d7450f 100644 --- a/Tests/CompileFeatures/CMakeLists.txt +++ b/Tests/CompileFeatures/CMakeLists.txt @@ -77,7 +77,29 @@ foreach(lang CXX C) endif() endforeach() +if (CMAKE_C_COMPILE_FEATURES) + string(FIND "${CMAKE_C_FLAGS}" "-std=" std_flag_idx) + if (std_flag_idx EQUAL -1) + add_executable(default_dialect_C default_dialect.c) + target_compile_definitions(default_dialect_C PRIVATE + DEFAULT_C11=$ + DEFAULT_C99=$ + DEFAULT_C90=$ + ) + endif() +endif() + if (CMAKE_CXX_COMPILE_FEATURES) + string(FIND "${CMAKE_CXX_FLAGS}" "-std=" std_flag_idx) + if (std_flag_idx EQUAL -1) + add_executable(default_dialect default_dialect.cpp) + target_compile_definitions(default_dialect PRIVATE + DEFAULT_CXX14=$ + DEFAULT_CXX11=$ + DEFAULT_CXX98=$ + ) + endif() + add_executable(CompileFeatures main.cpp) set_property(TARGET CompileFeatures PROPERTY COMPILE_FEATURES "cxx_auto_type" diff --git a/Tests/CompileFeatures/default_dialect.c b/Tests/CompileFeatures/default_dialect.c new file mode 100644 index 000000000..1b39deca6 --- /dev/null +++ b/Tests/CompileFeatures/default_dialect.c @@ -0,0 +1,22 @@ + +#if DEFAULT_C11 +# if __STDC_VERSION__ != 201112L +# error Unexpected value for __STDC_VERSION__. +# endif +#elif DEFAULT_C99 +# if __STDC_VERSION__ != 199901L +# error Unexpected value for __STDC_VERSION__. +# endif +#else +# if !DEFAULT_C90 +# error Buildsystem error +# endif +# if defined(__STDC_VERSION__) +# error Unexpected __STDC_VERSION__ definition +# endif +#endif + +int main() +{ + return 0; +} diff --git a/Tests/CompileFeatures/default_dialect.cpp b/Tests/CompileFeatures/default_dialect.cpp new file mode 100644 index 000000000..8d97926fe --- /dev/null +++ b/Tests/CompileFeatures/default_dialect.cpp @@ -0,0 +1,25 @@ + +template +struct Outputter; + +#if DEFAULT_CXX14 +# if __cplusplus != 201402L +Outputter<__cplusplus> o; +# endif +#elif DEFAULT_CXX11 +# if __cplusplus != 201103L +Outputter<__cplusplus> o; +# endif +#else +# if !DEFAULT_CXX98 +# error Buildsystem error +# endif +# if __cplusplus != 199711L +Outputter<__cplusplus> o; +# endif +#endif + +int main() +{ + return 0; +} diff --git a/Tests/CompileFeatures/main.c b/Tests/CompileFeatures/main.c deleted file mode 100644 index 831c5eb27..000000000 --- a/Tests/CompileFeatures/main.c +++ /dev/null @@ -1,12 +0,0 @@ - -int foo(int * restrict a, int * restrict b) -{ - (void)a; - (void)b; - return 0; -} - -int main() -{ - return 0; -}