From 69182ce4ed95c62d51e208c8620ff4e6599dee2e Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Mon, 12 Jan 2015 21:47:01 +0100 Subject: [PATCH 1/5] Features: Ensure that the cxx_auto_type test is correct. SolarisStudio considers 'auto' to be a storage class specifier in C++98 mode (as appropriate), and considers variables without a specified type to be of type int. So, it treats auto x = 3.14; as auto int x = 3.14; which in C++98 mode is equivalent to int x = 3.14; and it does not fail to compile as expected. Change the test to use a reference so that the type must be known. --- Tests/CompileFeatures/cxx_auto_type.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Tests/CompileFeatures/cxx_auto_type.cpp b/Tests/CompileFeatures/cxx_auto_type.cpp index 7dbf04f67..1f36a7966 100644 --- a/Tests/CompileFeatures/cxx_auto_type.cpp +++ b/Tests/CompileFeatures/cxx_auto_type.cpp @@ -1,5 +1,12 @@ +double foo_ = 3.14; + +double& foo() +{ + return foo_; +} + void someFunc() { - auto x = 3.14; + auto& x = foo(); } From 5d57970dd9ddea70163bdd3c64fbf365a15af9fb Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Mon, 12 Jan 2015 21:49:56 +0100 Subject: [PATCH 2/5] Features: Use variable in cxx_inheriting_constructors test. Avoid warning with SolarisStudio. --- Tests/CompileFeatures/cxx_inheriting_constructors.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/CompileFeatures/cxx_inheriting_constructors.cpp b/Tests/CompileFeatures/cxx_inheriting_constructors.cpp index a83b624ca..cfce88022 100644 --- a/Tests/CompileFeatures/cxx_inheriting_constructors.cpp +++ b/Tests/CompileFeatures/cxx_inheriting_constructors.cpp @@ -13,6 +13,6 @@ struct B : public A void someFunc() { - int i; + int i = 0; B b(i); } From 536c535cb0cf245a1785d436b0662f7fe59ef1e4 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 16 Jan 2015 19:21:36 +0100 Subject: [PATCH 3/5] Features: Adjust cxx_variadic_templates unit test for SolarisStudio. The change in commit 1f19ac4d (Features: Adjust cxx_variadic_templates unit test for GNU < 4.7., 2015-01-11) pacified GNU 4.6, but leaves SolarisStudio 12.4 complaining: "cxx_variadic_templates.cpp", line 5: Error: Partial specialization for Interface has identical arguments. 1 Error(s) detected. Implement a preprocessor test for using the partial specialization workaround needed by GNU 4.6. --- .../cxx_variadic_templates.cpp | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/Tests/CompileFeatures/cxx_variadic_templates.cpp b/Tests/CompileFeatures/cxx_variadic_templates.cpp index a80e157e6..e1f641b81 100644 --- a/Tests/CompileFeatures/cxx_variadic_templates.cpp +++ b/Tests/CompileFeatures/cxx_variadic_templates.cpp @@ -1,5 +1,23 @@ +#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) < 407) +#define OLD_GNU +#endif + +#ifdef OLD_GNU template struct Interface; +#endif + +template +struct Interface +#ifdef OLD_GNU + +#endif +{ + static int accumulate() + { + return I + Interface::accumulate(); + } +}; template struct Interface @@ -10,15 +28,6 @@ struct Interface } }; -template -struct Interface -{ - static int accumulate() - { - return I + Interface::accumulate(); - } -}; - // Note: split this into a separate test if a // cxx_variadic_template_template_parameters feature is added. From bcb04783f7abd1e7781eda7499b53118fdbe8000 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 16 Jan 2015 19:26:37 +0100 Subject: [PATCH 4/5] Features: Record for SolarisStudio 12.4. It has similar C++11 capabilities compared to GCC 4.8. --- .../Compiler/SunPro-CXX-FeatureTests.cmake | 52 +++++++++++++++++++ Modules/Compiler/SunPro-CXX.cmake | 21 ++++++++ Modules/WriteCompilerDetectionHeader.cmake | 1 + Tests/CompileFeatures/CMakeLists.txt | 18 +++++++ .../CMakeLists.txt | 7 +-- 5 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 Modules/Compiler/SunPro-CXX-FeatureTests.cmake diff --git a/Modules/Compiler/SunPro-CXX-FeatureTests.cmake b/Modules/Compiler/SunPro-CXX-FeatureTests.cmake new file mode 100644 index 000000000..8e97e1d05 --- /dev/null +++ b/Modules/Compiler/SunPro-CXX-FeatureTests.cmake @@ -0,0 +1,52 @@ + +# Based on GNU 4.8.2 +# http://docs.oracle.com/cd/E37069_01/html/E37071/gncix.html +# Reference: http://gcc.gnu.org/projects/cxx0x.html + +set(_cmake_oldestSupported "__SUNPRO_CC >= 0x5130") + +set(SolarisStudio124_CXX11 "(__SUNPRO_CC >= 0x5130) && __cplusplus >= 201103L") +set(_cmake_feature_test_cxx_alignas "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_alignof "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_attributes "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_inheriting_constructors "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_thread_local "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_alias_templates "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_delegating_constructors "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_extended_friend_declarations "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_final "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_noexcept "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_nonstatic_member_init "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_override "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_constexpr "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_defaulted_move_initializers "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_enum_forward_declarations "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_nullptr "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_range_for "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_unrestricted_unions "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_explicit_conversions "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_lambdas "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_local_type_template_args "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_raw_string_literals "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_auto_type "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_defaulted_functions "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_deleted_functions "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_generalized_initializers "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_inline_namespaces "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_sizeof_member "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_strong_enums "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_trailing_return_types "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_unicode_literals "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_uniform_initialization "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_variadic_templates "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_decltype "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_default_function_template_args "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_long_long_type "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_right_angle_brackets "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_rvalue_references "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_static_assert "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_extern_templates "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_func_identifier "${SolarisStudio124_CXX11}") +set(_cmake_feature_test_cxx_variadic_macros "${SolarisStudio124_CXX11}") + +set(_cmake_feature_test_cxx_template_template_parameters "${_cmake_oldestSupported} && __cplusplus") diff --git a/Modules/Compiler/SunPro-CXX.cmake b/Modules/Compiler/SunPro-CXX.cmake index 59687129a..cb377138a 100644 --- a/Modules/Compiler/SunPro-CXX.cmake +++ b/Modules/Compiler/SunPro-CXX.cmake @@ -31,3 +31,24 @@ set(CMAKE_CXX_CREATE_ASSEMBLY_SOURCE " -S - set(CMAKE_CXX_CREATE_STATIC_LIBRARY " -xar -o " " ") + +if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.13) + set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-std=c++11") + set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=c++11") +endif() + +set(CMAKE_CXX_STANDARD_DEFAULT 98) + +macro(cmake_record_cxx_compile_features) + macro(_get_solaris_studio_features std_version list) + record_compiler_features(CXX "${std_version}" ${list}) + endmacro() + + set(_result 0) + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.13) + _get_solaris_studio_features(${CMAKE_CXX11_STANDARD_COMPILE_OPTION} CMAKE_CXX11_COMPILE_FEATURES) + if (_result EQUAL 0) + _get_solaris_studio_features("" CMAKE_CXX98_COMPILE_FEATURES) + endif() + endif() +endmacro() diff --git a/Modules/WriteCompilerDetectionHeader.cmake b/Modules/WriteCompilerDetectionHeader.cmake index a6ff475a2..e81bc08e7 100644 --- a/Modules/WriteCompilerDetectionHeader.cmake +++ b/Modules/WriteCompilerDetectionHeader.cmake @@ -321,6 +321,7 @@ function(write_compiler_detection_header GNU Clang AppleClang + SunPro ) set(_hex_compilers ADSP Borland Embarcadero SunPro) diff --git a/Tests/CompileFeatures/CMakeLists.txt b/Tests/CompileFeatures/CMakeLists.txt index 106f29c0c..182954ea7 100644 --- a/Tests/CompileFeatures/CMakeLists.txt +++ b/Tests/CompileFeatures/CMakeLists.txt @@ -51,6 +51,17 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" ) endif() +if (CMAKE_CXX_COMPILER_ID STREQUAL SunPro) + list(REMOVE_ITEM CXX_non_features + cxx_attribute_deprecated + cxx_contextual_conversions + cxx_extended_friend_declarations + cxx_long_long_type + cxx_sizeof_member + cxx_variadic_macros + ) +endif() + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8) # The cxx_alignof feature happens to work (for *this* testcase) with @@ -188,6 +199,13 @@ if (CMAKE_CXX_COMPILE_FEATURES) -DEXPECT_INHERITING_CONSTRUCTORS_AND_FINAL=0 ) endif() + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro") + add_definitions( + -DEXPECT_OVERRIDE_CONTROL=1 + -DEXPECT_INHERITING_CONSTRUCTORS=1 + -DEXPECT_FINAL=1 + -DEXPECT_INHERITING_CONSTRUCTORS_AND_FINAL=1 + ) endif() add_executable(CompileFeaturesGenex genex_test.cpp) diff --git a/Tests/Module/WriteCompilerDetectionHeader/CMakeLists.txt b/Tests/Module/WriteCompilerDetectionHeader/CMakeLists.txt index 401de9581..b7259198e 100644 --- a/Tests/Module/WriteCompilerDetectionHeader/CMakeLists.txt +++ b/Tests/Module/WriteCompilerDetectionHeader/CMakeLists.txt @@ -11,7 +11,7 @@ get_property(c_known_features GLOBAL PROPERTY CMAKE_C_KNOWN_FEATURES) write_compiler_detection_header( FILE "${CMAKE_CURRENT_BINARY_DIR}/test_compiler_detection.h" PREFIX TEST - COMPILERS GNU Clang AppleClang + COMPILERS GNU Clang AppleClang SunPro VERSION 3.1 PROLOG "// something" EPILOG "// more" @@ -58,7 +58,8 @@ endmacro() if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" - OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" + OR CMAKE_CXX_COMPILER_ID STREQUAL "SunPro") # False for C++98 mode. list(APPEND false_defs EXPECTED_COMPILER_CXX_DELEGATING_CONSTRUCTORS) list(APPEND false_defs EXPECTED_COMPILER_CXX_VARIADIC_TEMPLATES) @@ -81,7 +82,7 @@ write_compiler_detection_header( PREFIX MULTI OUTPUT_FILES_VAR multi_files OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/compiler_multi_files/compiler_support" - COMPILERS GNU Clang AppleClang + COMPILERS GNU Clang AppleClang SunPro VERSION 3.1 FEATURES ${cxx_known_features} ${c_known_features} From 00194ea752ed02dbe70a808b337cf630735f2894 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 19 Jan 2015 13:51:38 -0500 Subject: [PATCH 5/5] Help: Add notes for topic 'SolarisStudio-compile-features' --- Help/release/dev/SolarisStudio-compile-features.rst | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 Help/release/dev/SolarisStudio-compile-features.rst diff --git a/Help/release/dev/SolarisStudio-compile-features.rst b/Help/release/dev/SolarisStudio-compile-features.rst new file mode 100644 index 000000000..83110cd68 --- /dev/null +++ b/Help/release/dev/SolarisStudio-compile-features.rst @@ -0,0 +1,5 @@ +SolarisStudio-compile-features +------------------------------ + +* The :manual:`Compile Features ` functionality + is now aware of features supported by Oracle SolarisStudio (``SunPro``).