Add static assertions to enforce requirements on the traits used with
basic_filebuf, improving the diagnostics for invalid traits.

Tested x86_64-linux, committed to trunk.

commit 78df7e78e805c873883e63d9df4e6befa32ddac5
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Thu May 8 18:20:37 2014 +0100

    	PR libstdc++/13860
    	* include/std/fstream (basic_filebuf): Enforce requirements on traits.

diff --git a/libstdc++-v3/include/std/fstream b/libstdc++-v3/include/std/fstream
index 17ccac6..51db21b 100644
--- a/libstdc++-v3/include/std/fstream
+++ b/libstdc++-v3/include/std/fstream
@@ -71,6 +71,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<typename _CharT, typename _Traits>
     class basic_filebuf : public basic_streambuf<_CharT, _Traits>
     {
+#if __cplusplus >= 201103L
+      template<typename _Tp>
+	using __chk_state = __and_<is_copy_assignable<_Tp>,
+				   is_copy_constructible<_Tp>,
+				   is_default_constructible<_Tp>>;
+
+      static_assert(__chk_state<typename _Traits::state_type>::value,
+		    "state_type must be CopyAssignable, CopyConstructible"
+		    " and DefaultConstructible");
+
+      static_assert(is_same<typename _Traits::pos_type,
+			    fpos<typename _Traits::state_type>>::value,
+		    "pos_type must be fpos<state_type>");
+#endif
     public:
       // Types:
       typedef _CharT                     	        char_type;

Reply via email to