Browse Source

Merge topic 'default-lang-dialect-for-master'

f327a9fd Merge branch 'default-lang-dialect' into step2
36bb100e Fix the test for running the CxxDialog unit test.
a3d0ae17 Features: Fix the default C dialect for Clang and GNU.
49e2b689 Features: Fix references to CXX compiler version in Clang-C.cmake.
7565ab2c Features: Test the CXX compiler only if it has features.
Brad King 11 years ago
parent
commit
cbec5c0445

+ 7 - 3
Modules/Compiler/Clang-C.cmake

@@ -6,7 +6,7 @@ if(WIN32 OR (APPLE AND NOT appleClangPolicy STREQUAL NEW))
   return()
 endif()
 
-if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.4)
+if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.4)
   set(CMAKE_C90_STANDARD_COMPILE_OPTION "-std=c90")
   set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-std=gnu90")
 
@@ -17,14 +17,18 @@ if(NOT CMAKE_CXX_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)
     record_compiler_features(C "${std_version}" ${list})
   endmacro()
 
-  if (UNIX AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.4)
+  if (UNIX AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.4)
     _get_clang_features(${CMAKE_C11_STANDARD_COMPILE_OPTION} CMAKE_C11_COMPILE_FEATURES)
     if (_result EQUAL 0)
       _get_clang_features(${CMAKE_C99_STANDARD_COMPILE_OPTION} CMAKE_C99_COMPILE_FEATURES)

+ 5 - 2
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)

+ 2 - 2
Tests/CMakeLists.txt

@@ -292,11 +292,11 @@ if(BUILD_TESTING)
   endif()
   ADD_TEST_MACRO(SourcesProperty SourcesProperty)
   if(CMAKE_CXX_COMPILER_ID STREQUAL GNU
-      AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.6)
+      AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7)
     set(runCxxDialectTest 1)
   endif()
   if(CMAKE_CXX_COMPILER_ID STREQUAL Clang
-        AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 2.9)
+        AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.4)
     if(NOT APPLE OR POLICY CMP0025)
       set(runCxxDialectTest 1)
     endif()

+ 52 - 28
Tests/CompileFeatures/CMakeLists.txt

@@ -77,36 +77,60 @@ foreach(lang CXX C)
   endif()
 endforeach()
 
-add_executable(CompileFeatures main.cpp)
-set_property(TARGET CompileFeatures
-  PROPERTY COMPILE_FEATURES "cxx_auto_type"
-)
-set_property(TARGET CompileFeatures
-  PROPERTY CXX_STANDARD_REQUIRED TRUE
-)
+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=$<EQUAL:${CMAKE_C_STANDARD_DEFAULT},11>
+      DEFAULT_C99=$<EQUAL:${CMAKE_C_STANDARD_DEFAULT},99>
+      DEFAULT_C90=$<EQUAL:${CMAKE_C_STANDARD_DEFAULT},90>
+    )
+  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=$<EQUAL:${CMAKE_CXX_STANDARD_DEFAULT},14>
+      DEFAULT_CXX11=$<EQUAL:${CMAKE_CXX_STANDARD_DEFAULT},11>
+      DEFAULT_CXX98=$<EQUAL:${CMAKE_CXX_STANDARD_DEFAULT},98>
+    )
+  endif()
 
-add_executable(GenexCompileFeatures main.cpp)
-set_property(TARGET GenexCompileFeatures
-  PROPERTY COMPILE_FEATURES "$<1:cxx_auto_type>;$<0:not_a_feature>"
-)
+  add_executable(CompileFeatures main.cpp)
+  set_property(TARGET CompileFeatures
+    PROPERTY COMPILE_FEATURES "cxx_auto_type"
+  )
+  set_property(TARGET CompileFeatures
+    PROPERTY CXX_STANDARD_REQUIRED TRUE
+  )
+
+  add_executable(GenexCompileFeatures main.cpp)
+  set_property(TARGET GenexCompileFeatures
+    PROPERTY COMPILE_FEATURES "$<1:cxx_auto_type>;$<0:not_a_feature>"
+  )
 
-add_library(iface INTERFACE)
-set_property(TARGET iface
-  PROPERTY INTERFACE_COMPILE_FEATURES "cxx_auto_type"
-)
-add_executable(IfaceCompileFeatures main.cpp)
-target_link_libraries(IfaceCompileFeatures iface)
+  add_library(iface INTERFACE)
+  set_property(TARGET iface
+    PROPERTY INTERFACE_COMPILE_FEATURES "cxx_auto_type"
+  )
+  add_executable(IfaceCompileFeatures main.cpp)
+  target_link_libraries(IfaceCompileFeatures iface)
 
-add_executable(CompileFeaturesGenex genex_test.cpp)
-set_property(TARGET CompileFeaturesGenex PROPERTY CXX_STANDARD 11)
-target_compile_definitions(CompileFeaturesGenex PRIVATE HAVE_OVERRIDE_CONTROL=$<COMPILE_FEATURES:cxx_final,cxx_override>)
+  add_executable(CompileFeaturesGenex genex_test.cpp)
+  set_property(TARGET CompileFeaturesGenex PROPERTY CXX_STANDARD 11)
+  target_compile_definitions(CompileFeaturesGenex PRIVATE HAVE_OVERRIDE_CONTROL=$<COMPILE_FEATURES:cxx_final,cxx_override>)
 
-add_executable(CompileFeaturesGenex2 genex_test.cpp)
-target_compile_features(CompileFeaturesGenex2 PRIVATE cxx_constexpr)
-target_compile_definitions(CompileFeaturesGenex2 PRIVATE HAVE_OVERRIDE_CONTROL=$<COMPILE_FEATURES:cxx_final,cxx_override>)
+  add_executable(CompileFeaturesGenex2 genex_test.cpp)
+  target_compile_features(CompileFeaturesGenex2 PRIVATE cxx_constexpr)
+  target_compile_definitions(CompileFeaturesGenex2 PRIVATE HAVE_OVERRIDE_CONTROL=$<COMPILE_FEATURES:cxx_final,cxx_override>)
 
-add_library(noexcept_iface INTERFACE)
-target_compile_features(noexcept_iface INTERFACE cxx_noexcept)
-add_executable(CompileFeaturesGenex3 genex_test.cpp)
-target_link_libraries(CompileFeaturesGenex3 PRIVATE noexcept_iface)
-target_compile_definitions(CompileFeaturesGenex3 PRIVATE HAVE_OVERRIDE_CONTROL=$<COMPILE_FEATURES:cxx_final,cxx_override>)
+  add_library(noexcept_iface INTERFACE)
+  target_compile_features(noexcept_iface INTERFACE cxx_noexcept)
+  add_executable(CompileFeaturesGenex3 genex_test.cpp)
+  target_link_libraries(CompileFeaturesGenex3 PRIVATE noexcept_iface)
+  target_compile_definitions(CompileFeaturesGenex3 PRIVATE HAVE_OVERRIDE_CONTROL=$<COMPILE_FEATURES:cxx_final,cxx_override>)
+endif()

+ 22 - 0
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;
+}

+ 25 - 0
Tests/CompileFeatures/default_dialect.cpp

@@ -0,0 +1,25 @@
+
+template<long l>
+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;
+}

+ 0 - 12
Tests/CompileFeatures/main.c

@@ -1,12 +0,0 @@
-
-int foo(int * restrict a, int * restrict b)
-{
-  (void)a;
-  (void)b;
-  return 0;
-}
-
-int main()
-{
-  return 0;
-}