[libcxx] r255585 - Fix various GCC mis-configurations for newer versions.

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Mon Dec 14 16:32:21 PST 2015


Author: ericwf
Date: Mon Dec 14 18:32:21 2015
New Revision: 255585

URL: http://llvm.org/viewvc/llvm-project?rev=255585&view=rev
Log:
Fix various GCC mis-configurations for newer versions.

This patch goes through and enables C++11 and C++14 features for newer GCC's.
The main changes are:

1. Turn on variable templates. (Uses __cpp_variable_templates)
2. Assert atomic<Tp> is trivially copyable (Uses _GNUC_VER >= 501).
3. Turn on trailing return support for GCC. (Uses _GNUC_VER >= 404)
4. XFAIL void_t test for GCC 5.1 and 5.2. Fixed in GCC 6.

Modified:
    libcxx/trunk/include/__config
    libcxx/trunk/include/atomic
    libcxx/trunk/test/std/atomics/atomics.types.generic/trivially_copyable.fail.cpp
    libcxx/trunk/test/std/utilities/meta/meta.unary.prop.query/void_t.pass.cpp

Modified: libcxx/trunk/include/__config
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=255585&r1=255584&r2=255585&view=diff
==============================================================================
--- libcxx/trunk/include/__config (original)
+++ libcxx/trunk/include/__config Mon Dec 14 18:32:21 2015
@@ -472,7 +472,9 @@ namespace std {
 #endif
 
 // GCC 5 will support variable templates
+#if !defined(__cpp_variable_templates) || __cpp_variable_templates < 201304L
 #define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
+#endif
 
 #define _NOEXCEPT throw()
 #define _NOEXCEPT_(x)
@@ -494,7 +496,6 @@ namespace std {
 
 #else  // __GXX_EXPERIMENTAL_CXX0X__
 
-#define _LIBCPP_HAS_NO_TRAILING_RETURN
 #define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
 
 #if _GNUC_VER < 403
@@ -508,6 +509,7 @@ namespace std {
 #if _GNUC_VER < 404
 #define _LIBCPP_HAS_NO_DECLTYPE
 #define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
+#define _LIBCPP_HAS_NO_TRAILING_RETURN
 #define _LIBCPP_HAS_NO_UNICODE_CHARS
 #define _LIBCPP_HAS_NO_VARIADICS
 #define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS

Modified: libcxx/trunk/include/atomic
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/atomic?rev=255585&r1=255584&r2=255585&view=diff
==============================================================================
--- libcxx/trunk/include/atomic (original)
+++ libcxx/trunk/include/atomic Mon Dec 14 18:32:21 2015
@@ -552,6 +552,12 @@ typedef enum memory_order
 namespace __gcc_atomic {
 template <typename _Tp>
 struct __gcc_atomic_t {
+
+#if _GNUC_VER >= 501
+    static_assert(is_trivially_copyable<_Tp>::value,
+      "std::atomic<Tp> requires that 'Tp' be a trivially copyable type");
+#endif
+
   _LIBCPP_INLINE_VISIBILITY
 #ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
     __gcc_atomic_t() _NOEXCEPT = default;

Modified: libcxx/trunk/test/std/atomics/atomics.types.generic/trivially_copyable.fail.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/atomics/atomics.types.generic/trivially_copyable.fail.cpp?rev=255585&r1=255584&r2=255585&view=diff
==============================================================================
--- libcxx/trunk/test/std/atomics/atomics.types.generic/trivially_copyable.fail.cpp (original)
+++ libcxx/trunk/test/std/atomics/atomics.types.generic/trivially_copyable.fail.cpp Mon Dec 14 18:32:21 2015
@@ -57,12 +57,12 @@ struct NotTriviallyCopyable {
     NotTriviallyCopyable ( int i ) : i_(i) {}
     NotTriviallyCopyable ( const NotTriviallyCopyable &rhs) : i_(rhs.i_) {}
     int i_;
-    };
+};
 
-template <class T>
+template <class T, class >
 void test ( T t ) {
     std::atomic<T> t0(t);
-    }
+}
 
 int main()
 {

Modified: libcxx/trunk/test/std/utilities/meta/meta.unary.prop.query/void_t.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/meta/meta.unary.prop.query/void_t.pass.cpp?rev=255585&r1=255584&r2=255585&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/meta/meta.unary.prop.query/void_t.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/meta/meta.unary.prop.query/void_t.pass.cpp Mon Dec 14 18:32:21 2015
@@ -11,11 +11,11 @@
 
 // void_t
 
-#include <type_traits>
+// UNSUPPORTED: c++98, c++03, c++11, c++14
+
+// XFAIL: gcc-5.1 gcc-5.2
 
-#if _LIBCPP_STD_VER <= 14
-int main () {}
-#else
+#include <type_traits>
 
 template <class T>
 void test1()
@@ -66,4 +66,3 @@ int main()
 
     static_assert( std::is_same<void, std::void_t<int, double const &, Class, volatile int[], void>>::value, "");
 }
-#endif




More information about the cfe-commits mailing list