public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Re: Additional headers under include/experimental/
       [not found] <20140703103529.GI4871@redhat.com>
@ 2015-10-06 14:12 ` Jonathan Wakely
  2015-10-09 11:20   ` Jonathan Wakely
  0 siblings, 1 reply; 2+ messages in thread
From: Jonathan Wakely @ 2015-10-06 14:12 UTC (permalink / raw)
  To: libstdc++; +Cc: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 1010 bytes --]

On 03/07/14 11:35 +0100, Jonathan Wakely wrote:
>I'm working on parts of the Filesystem TS and think it makes sense to
>split it up into separate headers for path, directory utils and the
>free functions, then include those from <experimental/filesystem>,
>otherwise it's going to be a whopper.
>
>Currently I've created include/experimental/fs_path.h for the path
>class, does that seem OK?
>
>Would a new include/experimental/bits directory be better, so that
>only official headers required by a TS are in include/experimental?
>(That would imply moving string_view.tcc to another directory).

I'm thinking about adding an include/experimental/bits directory
again, for internal pieces of the Networking TS.

I didn't do it last time because I was too lazy, but as I'm adding
more non-public headers to include/experimental I think it makes
sense.

That patch looks like this, plus moving erase_if.h, string_view.tcc
and fs_{dir,fwd,ops,path}.h to the new bits sub-directory.

Anyone else got an opinion?



[-- Attachment #2: patch.txt --]
[-- Type: text/x-patch, Size: 6799 bytes --]

commit e4f2b74da0de2f49bb01cf0cc6ad5145b6b651f8
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Tue Oct 6 13:03:31 2015 +0100

    Add include/experimental/bits dir

diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
index 74100f2..15b7dd8 100644
--- a/libstdc++-v3/include/Makefile.am
+++ b/libstdc++-v3/include/Makefile.am
@@ -650,7 +650,6 @@ experimental_headers = \
 	${experimental_srcdir}/array \
 	${experimental_srcdir}/chrono \
 	${experimental_srcdir}/deque \
-	${experimental_srcdir}/erase_if.h \
 	${experimental_srcdir}/forward_list \
 	${experimental_srcdir}/functional \
 	${experimental_srcdir}/iterator \
@@ -664,7 +663,6 @@ experimental_headers = \
 	${experimental_srcdir}/set \
 	${experimental_srcdir}/string \
 	${experimental_srcdir}/string_view \
-	${experimental_srcdir}/string_view.tcc \
 	${experimental_srcdir}/system_error \
 	${experimental_srcdir}/tuple \
 	${experimental_srcdir}/type_traits \
@@ -673,15 +671,24 @@ experimental_headers = \
 	${experimental_srcdir}/vector \
 	${experimental_filesystem_headers}
 
+experimental_bits_srcdir = ${glibcxx_srcdir}/include/experimental/bits
+experimental_bits_builddir = ./experimental/bits
+experimental_bits_headers = \
+	${experimental_bits_srcdir}/erase_if.h \
+	${experimental_bits_srcdir}/string_view.tcc \
+	${experimental_bits_filesystem_headers}
+
 if ENABLE_FILESYSTEM_TS
 experimental_filesystem_headers = \
-	${experimental_srcdir}/filesystem \
-	${experimental_srcdir}/fs_dir.h \
-	${experimental_srcdir}/fs_fwd.h \
-	${experimental_srcdir}/fs_ops.h \
-	${experimental_srcdir}/fs_path.h
+	${experimental_srcdir}/filesystem
+experimental_bits_filesystem_headers = \
+	${experimental_bits_srcdir}/fs_dir.h \
+	${experimental_bits_srcdir}/fs_fwd.h \
+	${experimental_bits_srcdir}/fs_ops.h \
+	${experimental_bits_srcdir}/fs_path.h
 else
 experimental_filesystem_headers =
+experimental_bits_filesystem_headers =
 endif
 
 # This is the common subset of C++ files that all three "C" header models use.
@@ -968,8 +975,8 @@ endif
 allstamped = \
 	stamp-std stamp-bits stamp-bits-sup stamp-c_base stamp-c_compatibility \
 	stamp-backward stamp-ext stamp-pb stamp-tr1 stamp-tr2 stamp-decimal \
-	stamp-experimental stamp-debug stamp-parallel stamp-profile \
-	stamp-profile-impl stamp-host
+	stamp-experimental stamp-experimental-bits stamp-debug stamp-parallel \
+	stamp-profile stamp-profile-impl stamp-host
 
 # List of all files that are created by explicit building, editing, or
 # catenation.
@@ -1097,6 +1104,11 @@ stamp-experimental: ${experimental_headers}
 	@-cd ${experimental_builddir} && $(LN_S) $? . 2>/dev/null
 	@$(STAMP) stamp-experimental
 
+stamp-experimental-bits: stamp-experimental ${experimental_bits_headers}
+	@-mkdir -p ${experimental_bits_builddir}
+	@-cd ${experimental_bits_builddir} && $(LN_S) $? . 2>/dev/null
+	@$(STAMP) stamp-experimental-bits
+
 stamp-debug: ${debug_headers}
 	@-mkdir -p ${debug_builddir}
 	@-cd ${debug_builddir} && $(LN_S) $? . 2>/dev/null
@@ -1369,6 +1381,9 @@ install-headers:
 	$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${experimental_builddir}
 	for file in ${experimental_headers}; do \
 	  $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${experimental_builddir}; done
+	$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${experimental_bits_builddir}
+	for file in ${experimental_bits_headers}; do \
+	  $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${experimental_bits_builddir}; done
 	$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${c_base_builddir}
 	for file in ${c_base_headers}; do \
 	  $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${c_base_builddir}; done
@@ -1415,9 +1430,11 @@ clean-local:
 # be made.)
 .PRECIOUS: $(std_headers) $(c_base_headers) $(tr1_headers) $(tr2_headers)
 	   $(decimal_headers) $(ext_headers) $(experimental_headers)
+	   $(experimental_bits_headers)
 $(std_headers): ; @:
 $(c_base_headers): ; @:
 $(tr1_headers): ; @:
 $(decimal_headers): ; @:
 $(ext_headers): ; @:
 $(experimental_headers): ; @:
+$(experimental_bits_headers): ; @:
diff --git a/libstdc++-v3/include/experimental/filesystem b/libstdc++-v3/include/experimental/filesystem
index db7ab11..6713463 100644
--- a/libstdc++-v3/include/experimental/filesystem
+++ b/libstdc++-v3/include/experimental/filesystem
@@ -35,10 +35,10 @@
 # include <bits/c++0x_warning.h>
 #else
 
-#include <experimental/fs_fwd.h>
-#include <experimental/fs_path.h>
-#include <experimental/fs_dir.h>
-#include <experimental/fs_ops.h>
+#include <experimental/bits/fs_fwd.h>
+#include <experimental/bits/fs_path.h>
+#include <experimental/bits/fs_dir.h>
+#include <experimental/bits/fs_ops.h>
 
 #define __cpp_lib_experimental_filesystem 201406
 
diff --git a/libstdc++-v3/include/experimental/map b/libstdc++-v3/include/experimental/map
index e4b3620..89bf260 100644
--- a/libstdc++-v3/include/experimental/map
+++ b/libstdc++-v3/include/experimental/map
@@ -36,7 +36,7 @@
 #else
 
 #include <map>
-#include <experimental/erase_if.h>
+#include <experimental/bits/erase_if.h>
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
diff --git a/libstdc++-v3/include/experimental/set b/libstdc++-v3/include/experimental/set
index c742d91..709fe32 100644
--- a/libstdc++-v3/include/experimental/set
+++ b/libstdc++-v3/include/experimental/set
@@ -36,7 +36,7 @@
 #else
 
 #include <set>
-#include <experimental/erase_if.h>
+#include <experimental/bits/erase_if.h>
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
diff --git a/libstdc++-v3/include/experimental/string_view b/libstdc++-v3/include/experimental/string_view
index 9dca400..9931ad0 100644
--- a/libstdc++-v3/include/experimental/string_view
+++ b/libstdc++-v3/include/experimental/string_view
@@ -686,7 +686,7 @@ _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace experimental
 } // namespace std
 
-#include <experimental/string_view.tcc>
+#include <experimental/bits/string_view.tcc>
 
 #endif // __cplusplus <= 201103L
 
diff --git a/libstdc++-v3/include/experimental/unordered_map b/libstdc++-v3/include/experimental/unordered_map
index d3a578e..c80c382 100644
--- a/libstdc++-v3/include/experimental/unordered_map
+++ b/libstdc++-v3/include/experimental/unordered_map
@@ -36,7 +36,7 @@
 #else
 
 #include <unordered_map>
-#include <experimental/erase_if.h>
+#include <experimental/bits/erase_if.h>
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
diff --git a/libstdc++-v3/include/experimental/unordered_set b/libstdc++-v3/include/experimental/unordered_set
index 2e5e08a..8461f9c 100644
--- a/libstdc++-v3/include/experimental/unordered_set
+++ b/libstdc++-v3/include/experimental/unordered_set
@@ -36,7 +36,7 @@
 #else
 
 #include <unordered_set>
-#include <experimental/erase_if.h>
+#include <experimental/bits/erase_if.h>
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Additional headers under include/experimental/
  2015-10-06 14:12 ` Additional headers under include/experimental/ Jonathan Wakely
@ 2015-10-09 11:20   ` Jonathan Wakely
  0 siblings, 0 replies; 2+ messages in thread
From: Jonathan Wakely @ 2015-10-09 11:20 UTC (permalink / raw)
  To: libstdc++; +Cc: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 2101 bytes --]

On 06/10/15 15:12 +0100, Jonathan Wakely wrote:
>On 03/07/14 11:35 +0100, Jonathan Wakely wrote:
>>I'm working on parts of the Filesystem TS and think it makes sense to
>>split it up into separate headers for path, directory utils and the
>>free functions, then include those from <experimental/filesystem>,
>>otherwise it's going to be a whopper.
>>
>>Currently I've created include/experimental/fs_path.h for the path
>>class, does that seem OK?
>>
>>Would a new include/experimental/bits directory be better, so that
>>only official headers required by a TS are in include/experimental?
>>(That would imply moving string_view.tcc to another directory).
>
>I'm thinking about adding an include/experimental/bits directory
>again, for internal pieces of the Networking TS.
>
>I didn't do it last time because I was too lazy, but as I'm adding
>more non-public headers to include/experimental I think it makes
>sense.

Committed, after testing on powerpc64le-linux.

2015-10-09  Jonathan Wakely  <jwakely@redhat.com>

        * include/experimental/erase_if.h: Move to ...
        * include/experimental/bits/erase_if.h: New.
        * include/experimental/fs_dir.h: Move to ...
        * include/experimental/bits/fs_dir.h: New.
        * include/experimental/fs_fwd.h: Move to ...
        * include/experimental/bits/fs_fwd.h: New.
        * include/experimental/fs_ops.h: Move to ...
        * include/experimental/bits/fs_ops.h: New.
        * include/experimental/fs_path.h: Move to ...
        * include/experimental/bits/fs_path.h: New.
        * include/experimental/string_view.tcc: Move to ...
        * include/experimental/bits/string_view.tcc: New.
        * include/Makefile.am: Add include/experimental/bits sub-directory.
        * include/Makefile.in: Regenerate.
        * include/experimental/filesystem: Adjust includes.
        * include/experimental/map: Likewise.
        * include/experimental/set: Likewise.
        * include/experimental/string_view: Likewise.
        * include/experimental/unordered_map: Likewise.
        * include/experimental/unordered_set: Likewise.



[-- Attachment #2: patch.txt --]
[-- Type: text/x-patch, Size: 144058 bytes --]

commit 9f7271cd101c768a3582f177fdaa1389cefd1e1a
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Tue Oct 6 13:03:31 2015 +0100

    Add include/experimental/bits dir

diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
index 74100f2..2dc0d01 100644
--- a/libstdc++-v3/include/Makefile.am
+++ b/libstdc++-v3/include/Makefile.am
@@ -650,7 +650,6 @@ experimental_headers = \
 	${experimental_srcdir}/array \
 	${experimental_srcdir}/chrono \
 	${experimental_srcdir}/deque \
-	${experimental_srcdir}/erase_if.h \
 	${experimental_srcdir}/forward_list \
 	${experimental_srcdir}/functional \
 	${experimental_srcdir}/iterator \
@@ -664,7 +663,6 @@ experimental_headers = \
 	${experimental_srcdir}/set \
 	${experimental_srcdir}/string \
 	${experimental_srcdir}/string_view \
-	${experimental_srcdir}/string_view.tcc \
 	${experimental_srcdir}/system_error \
 	${experimental_srcdir}/tuple \
 	${experimental_srcdir}/type_traits \
@@ -673,15 +671,24 @@ experimental_headers = \
 	${experimental_srcdir}/vector \
 	${experimental_filesystem_headers}
 
+experimental_bits_srcdir = ${glibcxx_srcdir}/include/experimental/bits
+experimental_bits_builddir = ./experimental/bits
+experimental_bits_headers = \
+	${experimental_bits_srcdir}/erase_if.h \
+	${experimental_bits_srcdir}/string_view.tcc \
+	${experimental_bits_filesystem_headers}
+
 if ENABLE_FILESYSTEM_TS
 experimental_filesystem_headers = \
-	${experimental_srcdir}/filesystem \
-	${experimental_srcdir}/fs_dir.h \
-	${experimental_srcdir}/fs_fwd.h \
-	${experimental_srcdir}/fs_ops.h \
-	${experimental_srcdir}/fs_path.h
+	${experimental_srcdir}/filesystem
+experimental_bits_filesystem_headers = \
+	${experimental_bits_srcdir}/fs_dir.h \
+	${experimental_bits_srcdir}/fs_fwd.h \
+	${experimental_bits_srcdir}/fs_ops.h \
+	${experimental_bits_srcdir}/fs_path.h
 else
 experimental_filesystem_headers =
+experimental_bits_filesystem_headers =
 endif
 
 # This is the common subset of C++ files that all three "C" header models use.
@@ -968,8 +975,8 @@ endif
 allstamped = \
 	stamp-std stamp-bits stamp-bits-sup stamp-c_base stamp-c_compatibility \
 	stamp-backward stamp-ext stamp-pb stamp-tr1 stamp-tr2 stamp-decimal \
-	stamp-experimental stamp-debug stamp-parallel stamp-profile \
-	stamp-profile-impl stamp-host
+	stamp-experimental stamp-experimental-bits stamp-debug stamp-parallel \
+	stamp-profile stamp-profile-impl stamp-host
 
 # List of all files that are created by explicit building, editing, or
 # catenation.
@@ -1097,6 +1104,11 @@ stamp-experimental: ${experimental_headers}
 	@-cd ${experimental_builddir} && $(LN_S) $? . 2>/dev/null
 	@$(STAMP) stamp-experimental
 
+stamp-experimental-bits: ${experimental_bits_headers}
+	@-mkdir -p ${experimental_bits_builddir}
+	@-cd ${experimental_bits_builddir} && $(LN_S) $? . 2>/dev/null
+	@$(STAMP) stamp-experimental-bits
+
 stamp-debug: ${debug_headers}
 	@-mkdir -p ${debug_builddir}
 	@-cd ${debug_builddir} && $(LN_S) $? . 2>/dev/null
@@ -1369,6 +1381,9 @@ install-headers:
 	$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${experimental_builddir}
 	for file in ${experimental_headers}; do \
 	  $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${experimental_builddir}; done
+	$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${experimental_bits_builddir}
+	for file in ${experimental_bits_headers}; do \
+	  $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${experimental_bits_builddir}; done
 	$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${c_base_builddir}
 	for file in ${c_base_headers}; do \
 	  $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${c_base_builddir}; done
@@ -1415,9 +1430,11 @@ clean-local:
 # be made.)
 .PRECIOUS: $(std_headers) $(c_base_headers) $(tr1_headers) $(tr2_headers)
 	   $(decimal_headers) $(ext_headers) $(experimental_headers)
+	   $(experimental_bits_headers)
 $(std_headers): ; @:
 $(c_base_headers): ; @:
 $(tr1_headers): ; @:
 $(decimal_headers): ; @:
 $(ext_headers): ; @:
 $(experimental_headers): ; @:
+$(experimental_bits_headers): ; @:
diff --git a/libstdc++-v3/include/experimental/bits/erase_if.h b/libstdc++-v3/include/experimental/bits/erase_if.h
new file mode 100644
index 0000000..e8bd728
--- /dev/null
+++ b/libstdc++-v3/include/experimental/bits/erase_if.h
@@ -0,0 +1,70 @@
+// <experimental/bits/erase_if.h> -*- C++ -*-
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file experimental/bits/erase_if.h
+ *  This is an internal header file, included by other library headers.
+ *  Do not attempt to use it directly.
+ */
+
+#ifndef _GLIBCXX_EXPERIMENTAL_ERASE_IF_H
+#define _GLIBCXX_EXPERIMENTAL_ERASE_IF_H 1
+
+#pragma GCC system_header
+
+#if __cplusplus <= 201103L
+# include <bits/c++14_warning.h>
+#else
+
+namespace std
+{
+namespace experimental
+{
+inline namespace fundamentals_v2
+{
+
+  namespace __detail
+  {
+    template<typename _Container, typename _Predicate>
+      void
+      __erase_nodes_if(_Container& __cont, _Predicate __pred)
+      {
+	for (auto __iter = __cont.begin(), __last = __cont.end();
+	     __iter != __last;)
+	{
+	  if (__pred(*__iter))
+	    __iter = __cont.erase(__iter);
+	  else
+	    ++__iter;
+	}
+      }
+  }
+
+
+} // inline namespace fundamentals_v2
+} // namespace experimental
+} // namespace std
+
+#endif // C++14
+
+#endif // _GLIBCXX_EXPERIMENTAL_ERASE_IF_H
diff --git a/libstdc++-v3/include/experimental/bits/fs_dir.h b/libstdc++-v3/include/experimental/bits/fs_dir.h
new file mode 100644
index 0000000..0c5253f
--- /dev/null
+++ b/libstdc++-v3/include/experimental/bits/fs_dir.h
@@ -0,0 +1,338 @@
+// Filesystem directory utilities -*- C++ -*-
+
+// Copyright (C) 2014-2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file experimental/fs_dir.h
+ *  This is an internal header file, included by other library headers.
+ *  Do not attempt to use it directly. @headername{experimental/filesystem}
+ */
+
+#ifndef _GLIBCXX_EXPERIMENTAL_FS_DIR_H
+#define _GLIBCXX_EXPERIMENTAL_FS_DIR_H 1
+
+#if __cplusplus < 201103L
+# include <bits/c++0x_warning.h>
+#else
+# include <typeinfo>
+# include <ext/concurrence.h>
+# include <bits/unique_ptr.h>
+# include <bits/shared_ptr.h>
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+namespace experimental
+{
+namespace filesystem
+{
+inline namespace v1
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  /**
+   * @ingroup filesystem
+   * @{
+   */
+
+  class file_status
+  {
+  public:
+    // constructors
+    explicit
+    file_status(file_type __ft = file_type::none,
+	        perms __prms = perms::unknown) noexcept
+    : _M_type(__ft), _M_perms(__prms) { }
+
+    file_status(const file_status&) noexcept = default;
+    file_status(file_status&&) noexcept = default;
+    ~file_status() = default;
+
+    file_status& operator=(const file_status&) noexcept = default;
+    file_status& operator=(file_status&&) noexcept = default;
+
+    // observers
+    file_type  type() const noexcept { return _M_type; }
+    perms      permissions() const noexcept { return _M_perms; }
+
+    // modifiers
+    void       type(file_type __ft) noexcept { _M_type = __ft; }
+    void       permissions(perms __prms) noexcept { _M_perms = __prms; }
+
+  private:
+    file_type	_M_type;
+    perms	_M_perms;
+  };
+
+_GLIBCXX_BEGIN_NAMESPACE_CXX11
+
+  class directory_entry
+  {
+  public:
+    // constructors and destructor
+    directory_entry() noexcept = default;
+    directory_entry(const directory_entry&) = default;
+    directory_entry(directory_entry&&) noexcept = default;
+    explicit directory_entry(const filesystem::path& __p) : _M_path(__p) { }
+    ~directory_entry() = default;
+
+    // modifiers
+    directory_entry& operator=(const directory_entry&) = default;
+    directory_entry& operator=(directory_entry&&) noexcept = default;
+
+    void assign(const filesystem::path& __p) { _M_path = __p; }
+
+    void
+    replace_filename(const filesystem::path& __p)
+    { _M_path = _M_path.parent_path() / __p; }
+
+    // observers
+    const filesystem::path&  path() const noexcept { return _M_path; }
+    operator const filesystem::path&() const noexcept { return _M_path; }
+
+    file_status
+    status() const
+    { return filesystem::status(_M_path); }
+
+    file_status
+    status(error_code& __ec) const noexcept
+    { return filesystem::status(_M_path, __ec); }
+
+    file_status
+    symlink_status() const
+    { return filesystem::symlink_status(_M_path); }
+
+    file_status
+    symlink_status(error_code& __ec) const noexcept
+    { return filesystem::symlink_status(_M_path, __ec); }
+
+    bool
+    operator< (const directory_entry& __rhs) const noexcept
+    { return _M_path < __rhs._M_path; }
+
+    bool
+    operator==(const directory_entry& __rhs) const noexcept
+    { return _M_path == __rhs._M_path; }
+
+    bool
+    operator!=(const directory_entry& __rhs) const noexcept
+    { return _M_path != __rhs._M_path; }
+
+    bool
+    operator<=(const directory_entry& __rhs) const noexcept
+    { return _M_path <= __rhs._M_path; }
+
+    bool
+    operator> (const directory_entry& __rhs) const noexcept
+    { return _M_path > __rhs._M_path; }
+
+    bool
+    operator>=(const directory_entry& __rhs) const noexcept
+    { return _M_path >= __rhs._M_path; }
+
+  private:
+    filesystem::path    _M_path;
+  };
+
+  struct _Dir;
+  class recursive_directory_iterator;
+
+  class directory_iterator
+  {
+  public:
+    typedef directory_entry        value_type;
+    typedef ptrdiff_t              difference_type;
+    typedef const directory_entry* pointer;
+    typedef const directory_entry& reference;
+    typedef input_iterator_tag     iterator_category;
+
+    directory_iterator() noexcept = default;
+
+    explicit
+    directory_iterator(const path& __p)
+    : directory_iterator(__p, directory_options::none, nullptr) { }
+
+    directory_iterator(const path& __p, directory_options __options)
+    : directory_iterator(__p, __options, nullptr) { }
+
+    directory_iterator(const path& __p, error_code& __ec) noexcept
+    : directory_iterator(__p, directory_options::none, __ec) { }
+
+    directory_iterator(const path& __p,
+      directory_options __options, error_code& __ec) noexcept
+    : directory_iterator(__p, __options, &__ec) { }
+
+    directory_iterator(const directory_iterator& __rhs) = default;
+
+    directory_iterator(directory_iterator&& __rhs) noexcept = default;
+
+    ~directory_iterator() = default;
+
+    directory_iterator& operator=(const directory_iterator& __rhs) = default;
+    directory_iterator& operator=(directory_iterator&& __rhs) noexcept = default;
+
+    const directory_entry& operator*() const;
+    const directory_entry* operator->() const { return &**this; }
+    directory_iterator&    operator++();
+    directory_iterator&    increment(error_code& __ec) noexcept;
+
+    directory_iterator operator++(int)
+    {
+      auto __tmp = *this;
+      ++*this;
+      return __tmp;
+    }
+
+  private:
+    directory_iterator(const path&, directory_options, error_code*);
+
+    friend bool
+    operator==(const directory_iterator& __lhs,
+               const directory_iterator& __rhs);
+
+    friend class recursive_directory_iterator;
+
+    std::shared_ptr<_Dir> _M_dir;
+  };
+
+  inline directory_iterator
+  begin(directory_iterator __iter) { return __iter; }
+
+  inline directory_iterator
+  end(directory_iterator) { return directory_iterator(); }
+
+  inline bool
+  operator==(const directory_iterator& __lhs, const directory_iterator& __rhs)
+  {
+    return !__rhs._M_dir.owner_before(__lhs._M_dir)
+      && !__lhs._M_dir.owner_before(__rhs._M_dir);
+  }
+
+  inline bool
+  operator!=(const directory_iterator& __lhs, const directory_iterator& __rhs)
+  { return !(__lhs == __rhs); }
+
+  class recursive_directory_iterator
+  {
+  public:
+    typedef directory_entry        value_type;
+    typedef ptrdiff_t              difference_type;
+    typedef const directory_entry* pointer;
+    typedef const directory_entry& reference;
+    typedef input_iterator_tag     iterator_category;
+
+    recursive_directory_iterator() noexcept = default;
+
+    explicit
+    recursive_directory_iterator(const path& __p)
+    : recursive_directory_iterator(__p, directory_options::none, nullptr) { }
+
+    recursive_directory_iterator(const path& __p, directory_options __options)
+    : recursive_directory_iterator(__p, __options, nullptr) { }
+
+    recursive_directory_iterator(const path& __p,
+                                 directory_options __options,
+                                 error_code& __ec) noexcept
+    : recursive_directory_iterator(__p, __options, &__ec) { }
+
+    recursive_directory_iterator(const path& __p, error_code& __ec) noexcept
+    : recursive_directory_iterator(__p, directory_options::none, &__ec) { }
+
+    recursive_directory_iterator(
+        const recursive_directory_iterator&) = default;
+
+    recursive_directory_iterator(
+        recursive_directory_iterator&&) noexcept = default;
+
+    ~recursive_directory_iterator();
+
+    // observers
+    directory_options  options() const { return _M_options; }
+    int                depth() const;
+    bool               recursion_pending() const { return _M_pending; }
+
+    const directory_entry& operator*() const;
+    const directory_entry* operator->() const { return &**this; }
+
+    // modifiers
+    recursive_directory_iterator&
+      operator=(const recursive_directory_iterator& __rhs) noexcept;
+    recursive_directory_iterator&
+      operator=(recursive_directory_iterator&& __rhs) noexcept;
+
+    recursive_directory_iterator& operator++();
+    recursive_directory_iterator& increment(error_code& __ec) noexcept;
+
+    recursive_directory_iterator operator++(int)
+    {
+      auto __tmp = *this;
+      ++*this;
+      return __tmp;
+    }
+
+    void pop();
+
+    void disable_recursion_pending() { _M_pending = false; }
+
+  private:
+    recursive_directory_iterator(const path&, directory_options, error_code*);
+
+    friend bool
+    operator==(const recursive_directory_iterator& __lhs,
+               const recursive_directory_iterator& __rhs);
+
+    struct _Dir_stack;
+    std::shared_ptr<_Dir_stack> _M_dirs;
+    directory_options _M_options;
+    bool _M_pending;
+  };
+
+  inline recursive_directory_iterator
+  begin(recursive_directory_iterator __iter) { return __iter; }
+
+  inline recursive_directory_iterator
+  end(recursive_directory_iterator) { return recursive_directory_iterator(); }
+
+  inline bool
+  operator==(const recursive_directory_iterator& __lhs,
+             const recursive_directory_iterator& __rhs)
+  {
+    return !__rhs._M_dirs.owner_before(__lhs._M_dirs)
+      && !__lhs._M_dirs.owner_before(__rhs._M_dirs);
+  }
+
+  inline bool
+  operator!=(const recursive_directory_iterator& __lhs,
+             const recursive_directory_iterator& __rhs)
+  { return !(__lhs == __rhs); }
+
+_GLIBCXX_END_NAMESPACE_CXX11
+
+  // @} group filesystem
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace v1
+} // namespace filesystem
+} // namespace experimental
+} // namespace std
+
+#endif // C++11
+
+#endif // _GLIBCXX_EXPERIMENTAL_FS_DIR_H
diff --git a/libstdc++-v3/include/experimental/bits/fs_fwd.h b/libstdc++-v3/include/experimental/bits/fs_fwd.h
new file mode 100644
index 0000000..a5ed2c5
--- /dev/null
+++ b/libstdc++-v3/include/experimental/bits/fs_fwd.h
@@ -0,0 +1,289 @@
+// Filesystem declarations -*- C++ -*-
+
+// Copyright (C) 2014-2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file experimental/filesystem
+ *  This is a TS C++ Library header.
+ */
+
+#ifndef _GLIBCXX_EXPERIMENTAL_FS_FWD_H
+#define _GLIBCXX_EXPERIMENTAL_FS_FWD_H 1
+
+#if __cplusplus < 201103L
+# include <bits/c++0x_warning.h>
+#else
+
+#include <system_error>
+#include <cstdint>
+#include <chrono>
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+namespace experimental
+{
+namespace filesystem
+{
+inline namespace v1
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+#if _GLIBCXX_USE_CXX11_ABI
+  inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { }
+#endif
+
+  /**
+   * @defgroup filesystem
+   * @ingroup experimental
+   *
+   * Utilities for performing operations on file systems and their components,
+   * such as paths, regular files, and directories.
+   *
+   * @{
+   */
+
+  class file_status;
+_GLIBCXX_BEGIN_NAMESPACE_CXX11
+  class path;
+  class filesystem_error;
+  class directory_entry;
+  class directory_iterator;
+  class recursive_directory_iterator;
+_GLIBCXX_END_NAMESPACE_CXX11
+
+  struct space_info
+  {
+    uintmax_t capacity;
+    uintmax_t free;
+    uintmax_t available;
+  };
+
+  enum class file_type : signed char {
+      none = 0, not_found = -1, regular = 1, directory = 2, symlink = 3,
+      block = 4, character = 5, fifo = 6, socket = 7, unknown = 8
+  };
+
+  /// Bitmask type
+  enum class copy_options : unsigned short {
+      none = 0,
+      skip_existing = 1, overwrite_existing = 2, update_existing = 4,
+      recursive = 8,
+      copy_symlinks = 16, skip_symlinks = 32,
+      directories_only = 64, create_symlinks = 128, create_hard_links = 256
+  };
+
+  constexpr copy_options
+  operator&(copy_options __x, copy_options __y)
+  {
+    using __utype = typename std::underlying_type<copy_options>::type;
+    return static_cast<copy_options>(
+	static_cast<__utype>(__x) & static_cast<__utype>(__y));
+  }
+
+  constexpr copy_options
+  operator|(copy_options __x, copy_options __y)
+  {
+    using __utype = typename std::underlying_type<copy_options>::type;
+    return static_cast<copy_options>(
+	static_cast<__utype>(__x) | static_cast<__utype>(__y));
+  }
+
+  constexpr copy_options
+  operator^(copy_options __x, copy_options __y)
+  {
+    using __utype = typename std::underlying_type<copy_options>::type;
+    return static_cast<copy_options>(
+	static_cast<__utype>(__x) ^ static_cast<__utype>(__y));
+  }
+
+  constexpr copy_options
+  operator~(copy_options __x)
+  {
+    using __utype = typename std::underlying_type<copy_options>::type;
+    return static_cast<copy_options>(~static_cast<__utype>(__x));
+  }
+
+  inline copy_options&
+  operator&=(copy_options& __x, copy_options __y)
+  { return __x = __x & __y; }
+
+  inline copy_options&
+  operator|=(copy_options& __x, copy_options __y)
+  { return __x = __x | __y; }
+
+  inline copy_options&
+  operator^=(copy_options& __x, copy_options __y)
+  { return __x = __x ^ __y; }
+
+
+  /// Bitmask type
+  enum class perms : unsigned {
+      none		=  0,
+      owner_read	=  0400,
+      owner_write	=  0200,
+      owner_exec	=  0100,
+      owner_all		=  0700,
+      group_read	=   040,
+      group_write	=   020,
+      group_exec	=   010,
+      group_all		=   070,
+      others_read	=    04,
+      others_write	=    02,
+      others_exec	=    01,
+      others_all	=    07,
+      all		=  0777,
+      set_uid		= 04000,
+      set_gid		= 02000,
+      sticky_bit	= 01000,
+      mask		= 07777,
+      unknown		=  0xFFFF,
+      add_perms		= 0x10000,
+      remove_perms	= 0x20000,
+      resolve_symlinks	= 0x40000
+  };
+
+  constexpr perms
+  operator&(perms __x, perms __y)
+  {
+    using __utype = typename std::underlying_type<perms>::type;
+    return static_cast<perms>(
+	static_cast<__utype>(__x) & static_cast<__utype>(__y));
+  }
+
+  constexpr perms
+  operator|(perms __x, perms __y)
+  {
+    using __utype = typename std::underlying_type<perms>::type;
+    return static_cast<perms>(
+	static_cast<__utype>(__x) | static_cast<__utype>(__y));
+  }
+
+  constexpr perms
+  operator^(perms __x, perms __y)
+  {
+    using __utype = typename std::underlying_type<perms>::type;
+    return static_cast<perms>(
+	static_cast<__utype>(__x) ^ static_cast<__utype>(__y));
+  }
+
+  constexpr perms
+  operator~(perms __x)
+  {
+    using __utype = typename std::underlying_type<perms>::type;
+    return static_cast<perms>(~static_cast<__utype>(__x));
+  }
+
+  inline perms&
+  operator&=(perms& __x, perms __y)
+  { return __x = __x & __y; }
+
+  inline perms&
+  operator|=(perms& __x, perms __y)
+  { return __x = __x | __y; }
+
+  inline perms&
+  operator^=(perms& __x, perms __y)
+  { return __x = __x ^ __y; }
+
+  // Bitmask type
+  enum class directory_options : unsigned char {
+      none = 0, follow_directory_symlink = 1, skip_permission_denied = 2
+  };
+
+  constexpr directory_options
+  operator&(directory_options __x, directory_options __y)
+  {
+    using __utype = typename std::underlying_type<directory_options>::type;
+    return static_cast<directory_options>(
+	static_cast<__utype>(__x) & static_cast<__utype>(__y));
+  }
+
+  constexpr directory_options
+  operator|(directory_options __x, directory_options __y)
+  {
+    using __utype = typename std::underlying_type<directory_options>::type;
+    return static_cast<directory_options>(
+	static_cast<__utype>(__x) | static_cast<__utype>(__y));
+  }
+
+  constexpr directory_options
+  operator^(directory_options __x, directory_options __y)
+  {
+    using __utype = typename std::underlying_type<directory_options>::type;
+    return static_cast<directory_options>(
+	static_cast<__utype>(__x) ^ static_cast<__utype>(__y));
+  }
+
+  constexpr directory_options
+  operator~(directory_options __x)
+  {
+    using __utype = typename std::underlying_type<directory_options>::type;
+    return static_cast<directory_options>(~static_cast<__utype>(__x));
+  }
+
+  inline directory_options&
+  operator&=(directory_options& __x, directory_options __y)
+  { return __x = __x & __y; }
+
+  inline directory_options&
+  operator|=(directory_options& __x, directory_options __y)
+  { return __x = __x | __y; }
+
+  inline directory_options&
+  operator^=(directory_options& __x, directory_options __y)
+  { return __x = __x ^ __y; }
+
+  typedef chrono::time_point<chrono::system_clock> file_time_type;
+
+  // operational functions
+
+  void copy(const path& __from, const path& __to, copy_options __options);
+  void copy(const path& __from, const path& __to, copy_options __options,
+	    error_code&) noexcept;
+
+  bool copy_file(const path& __from, const path& __to, copy_options __option);
+  bool copy_file(const path& __from, const path& __to, copy_options __option,
+		 error_code&) noexcept;
+
+  path current_path();
+
+  file_status status(const path&);
+  file_status status(const path&, error_code&) noexcept;
+
+  bool status_known(file_status) noexcept;
+
+  file_status symlink_status(const path&);
+  file_status symlink_status(const path&, error_code&) noexcept;
+
+  bool is_regular_file(file_status) noexcept;
+  bool is_symlink(file_status) noexcept;
+
+  // @} group filesystem
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace v1
+} // namespace filesystem
+} // namespace experimental
+} // namespace std
+
+#endif // C++11
+
+#endif // _GLIBCXX_EXPERIMENTAL_FS_FWD_H
diff --git a/libstdc++-v3/include/experimental/bits/fs_ops.h b/libstdc++-v3/include/experimental/bits/fs_ops.h
new file mode 100644
index 0000000..6b7d470
--- /dev/null
+++ b/libstdc++-v3/include/experimental/bits/fs_ops.h
@@ -0,0 +1,291 @@
+// Filesystem operational functions -*- C++ -*-
+
+// Copyright (C) 2014-2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your __option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file experimental/filesystem
+ *  This is a TS C++ Library header.
+ */
+
+#ifndef _GLIBCXX_EXPERIMENTAL_FS_OPS_H
+#define _GLIBCXX_EXPERIMENTAL_FS_OPS_H 1
+
+#if __cplusplus < 201103L
+# include <bits/c++0x_warning.h>
+#else
+
+#include <cstdint>
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+namespace experimental
+{
+namespace filesystem
+{
+inline namespace v1
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  /**
+   * @ingroup filesystem
+   * @{
+   */
+
+  path absolute(const path& __p, const path& __base = current_path());
+
+  path canonical(const path& __p, const path& __base = current_path());
+  path canonical(const path& __p, error_code& __ec);
+  path canonical(const path& __p, const path& __base, error_code& __ec);
+
+  inline void
+  copy(const path& __from, const path& __to)
+  { copy(__from, __to, copy_options::none); }
+
+  inline void
+  copy(const path& __from, const path& __to, error_code& __ec) noexcept
+  { copy(__from, __to, copy_options::none, __ec); }
+
+  void copy(const path& __from, const path& __to, copy_options __options);
+  void copy(const path& __from, const path& __to, copy_options __options,
+	    error_code& __ec) noexcept;
+
+  inline bool
+  copy_file(const path& __from, const path& __to)
+  { return copy_file(__from, __to, copy_options::none); }
+
+  inline bool
+  copy_file(const path& __from, const path& __to, error_code& __ec) noexcept
+  { return copy_file(__from, __to, copy_options::none, __ec); }
+
+  bool copy_file(const path& __from, const path& __to, copy_options __option);
+  bool copy_file(const path& __from, const path& __to, copy_options __option,
+		 error_code& __ec) noexcept;
+
+  void copy_symlink(const path& __existing_symlink, const path& __new_symlink);
+  void copy_symlink(const path& __existing_symlink, const path& __new_symlink,
+		    error_code& __ec) noexcept;
+
+  bool create_directories(const path& __p);
+  bool create_directories(const path& __p, error_code& __ec) noexcept;
+
+  bool create_directory(const path& __p);
+  bool create_directory(const path& __p, error_code& __ec) noexcept;
+
+  bool create_directory(const path& __p, const path& attributes);
+  bool create_directory(const path& __p, const path& attributes,
+			error_code& __ec) noexcept;
+
+  void create_directory_symlink(const path& __to, const path& __new_symlink);
+  void create_directory_symlink(const path& __to, const path& __new_symlink,
+				error_code& __ec) noexcept;
+
+  void create_hard_link(const path& __to, const path& __new_hard_link);
+  void create_hard_link(const path& __to, const path& __new_hard_link,
+			error_code& __ec) noexcept;
+
+  void create_symlink(const path& __to, const path& __new_symlink);
+  void create_symlink(const path& __to, const path& __new_symlink,
+		      error_code& __ec) noexcept;
+
+  path current_path();
+  path current_path(error_code& __ec);
+  void current_path(const path& __p);
+  void current_path(const path& __p, error_code& __ec) noexcept;
+
+  inline bool
+  exists(file_status __s) noexcept
+  { return status_known(__s) && __s.type() != file_type::not_found; }
+
+  inline bool
+  exists(const path& __p)
+  { return exists(status(__p)); }
+
+  inline bool
+  exists(const path& __p, error_code& __ec) noexcept
+  { return exists(status(__p, __ec)); }
+
+  bool
+  equivalent(const path& __p1, const path& __p2);
+
+  bool
+  equivalent(const path& __p1, const path& __p2, error_code& __ec) noexcept;
+
+  uintmax_t file_size(const path& __p);
+  uintmax_t file_size(const path& __p, error_code& __ec) noexcept;
+
+  uintmax_t hard_link_count(const path& __p);
+  uintmax_t hard_link_count(const path& __p, error_code& __ec) noexcept;
+
+  inline bool
+  is_block_file(file_status __s) noexcept
+  { return __s.type() == file_type::block; }
+
+  inline bool
+  is_block_file(const path& __p)
+  { return is_block_file(status(__p)); }
+
+  inline bool
+  is_block_file(const path& __p, error_code& __ec) noexcept
+  { return is_block_file(status(__p, __ec)); }
+
+  inline bool
+  is_character_file(file_status __s) noexcept
+  { return __s.type() == file_type::character; }
+
+  inline bool
+  is_character_file(const path& __p)
+  { return is_character_file(status(__p)); }
+
+  inline bool
+  is_character_file(const path& __p, error_code& __ec) noexcept
+  { return is_character_file(status(__p, __ec)); }
+
+  inline bool
+  is_directory(file_status __s) noexcept
+  { return __s.type() == file_type::directory; }
+
+  inline bool
+  is_directory(const path& __p)
+  { return is_directory(status(__p)); }
+
+  inline bool
+  is_directory(const path& __p, error_code& __ec) noexcept
+  { return is_directory(status(__p, __ec)); }
+
+  bool is_empty(const path& __p);
+  bool is_empty(const path& __p, error_code& __ec) noexcept;
+
+  inline bool
+  is_fifo(file_status __s) noexcept
+  { return __s.type() == file_type::fifo; }
+
+  inline bool
+  is_fifo(const path& __p)
+  { return is_fifo(status(__p)); }
+
+  inline bool
+  is_fifo(const path& __p, error_code& __ec) noexcept
+  { return is_fifo(status(__p, __ec)); }
+
+  inline bool
+  is_other(file_status __s) noexcept
+  {
+    return exists(__s) && !is_regular_file(__s) && !is_directory(__s)
+      && !is_symlink(__s);
+  }
+
+  inline bool
+  is_other(const path& __p)
+  { return is_other(status(__p)); }
+
+  inline bool
+  is_other(const path& __p, error_code& __ec) noexcept
+  { return is_other(status(__p, __ec)); }
+
+  inline bool
+  is_regular_file(file_status __s) noexcept
+  { return __s.type() == file_type::regular; }
+
+  inline bool
+  is_regular_file(const path& __p)
+  { return is_regular_file(status(__p)); }
+
+  inline bool
+  is_regular_file(const path& __p, error_code& __ec) noexcept
+  { return is_regular_file(status(__p, __ec)); }
+
+  inline bool
+  is_socket(file_status __s) noexcept
+  { return __s.type() == file_type::socket; }
+
+  inline bool
+  is_socket(const path& __p)
+  { return is_socket(status(__p)); }
+
+  inline bool
+  is_socket(const path& __p, error_code& __ec) noexcept
+  { return is_socket(status(__p, __ec)); }
+
+  inline bool
+  is_symlink(file_status __s) noexcept
+  { return __s.type() == file_type::symlink; }
+
+  inline bool
+  is_symlink(const path& __p)
+  { return is_symlink(symlink_status(__p)); }
+
+  inline bool
+  is_symlink(const path& __p, error_code& __ec) noexcept
+  { return is_symlink(symlink_status(__p, __ec)); }
+
+  file_time_type  last_write_time(const path& __p);
+  file_time_type  last_write_time(const path& __p, error_code& __ec) noexcept;
+  void last_write_time(const path& __p, file_time_type __new_time);
+  void last_write_time(const path& __p, file_time_type __new_time,
+		       error_code& __ec) noexcept;
+
+  void permissions(const path& __p, perms __prms);
+  void permissions(const path& __p, perms __prms, error_code& __ec) noexcept;
+
+  path read_symlink(const path& __p);
+  path read_symlink(const path& __p, error_code& __ec);
+
+  bool remove(const path& __p);
+  bool remove(const path& __p, error_code& __ec) noexcept;
+
+  uintmax_t remove_all(const path& __p);
+  uintmax_t remove_all(const path& __p, error_code& __ec) noexcept;
+
+  void rename(const path& __from, const path& __to);
+  void rename(const path& __from, const path& __to, error_code& __ec) noexcept;
+
+  void resize_file(const path& __p, uintmax_t __size);
+  void resize_file(const path& __p, uintmax_t __size, error_code& __ec) noexcept;
+
+  space_info space(const path& __p);
+  space_info space(const path& __p, error_code& __ec) noexcept;
+
+  file_status status(const path& __p);
+  file_status status(const path& __p, error_code& __ec) noexcept;
+
+  inline bool status_known(file_status __s) noexcept
+  { return __s.type() != file_type::none; }
+
+  file_status symlink_status(const path& __p);
+  file_status symlink_status(const path& __p, error_code& __ec) noexcept;
+
+  path system_complete(const path& __p);
+  path system_complete(const path& __p, error_code& __ec);
+
+  path temp_directory_path();
+  path temp_directory_path(error_code& __ec);
+
+  // @} group filesystem
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace v1
+} // namespace filesystem
+} // namespace experimental
+} // namespace std
+
+#endif // C++11
+
+#endif // _GLIBCXX_EXPERIMENTAL_FS_OPS_H
diff --git a/libstdc++-v3/include/experimental/bits/fs_path.h b/libstdc++-v3/include/experimental/bits/fs_path.h
new file mode 100644
index 0000000..40462a6
--- /dev/null
+++ b/libstdc++-v3/include/experimental/bits/fs_path.h
@@ -0,0 +1,1024 @@
+// Class filesystem::path -*- C++ -*-
+
+// Copyright (C) 2014-2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file experimental/fs_path.h
+ *  This is an internal header file, included by other library headers.
+ *  Do not attempt to use it directly. @headername{experimental/filesystem}
+ */
+
+#ifndef _GLIBCXX_EXPERIMENTAL_FS_PATH_H
+#define _GLIBCXX_EXPERIMENTAL_FS_PATH_H 1
+
+#if __cplusplus < 201103L
+# include <bits/c++0x_warning.h>
+#else
+
+#include <utility>
+#include <type_traits>
+#include <vector>
+#include <locale>
+#include <iosfwd>
+#include <codecvt>
+#include <system_error>
+#include <bits/stl_algobase.h>
+#include <bits/quoted_string.h>
+#include <bits/locale_conv.h>
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+# define _GLIBCXX_FILESYSTEM_IS_WINDOWS 1
+# include <algorithm>
+#endif
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+namespace experimental
+{
+namespace filesystem
+{
+inline namespace v1
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+_GLIBCXX_BEGIN_NAMESPACE_CXX11
+
+  /**
+   * @ingroup filesystem
+   * @{
+   */
+
+  /// A filesystem path.
+  class path
+  {
+    template<typename _CharT>
+      struct __is_encoded_char : std::false_type { };
+
+    template<typename _Iter,
+	     typename _Iter_traits = std::iterator_traits<_Iter>>
+      using __is_path_iter_src
+	= __and_<__is_encoded_char<typename _Iter_traits::value_type>,
+		 std::is_base_of<std::input_iterator_tag,
+				 typename _Iter_traits::iterator_category>>;
+
+    template<typename _Iter>
+      static __is_path_iter_src<_Iter>
+      __is_path_src(_Iter, int);
+
+    template<typename _CharT, typename _Traits, typename _Alloc>
+      static __is_encoded_char<_CharT>
+      __is_path_src(const basic_string<_CharT, _Traits, _Alloc>&, int);
+
+    template<typename _Unknown>
+      static std::false_type
+      __is_path_src(const _Unknown&, ...);
+
+    template<typename _Tp1, typename _Tp2>
+      struct __constructible_from;
+
+    template<typename _Iter>
+      struct __constructible_from<_Iter, _Iter>
+      : __is_path_iter_src<_Iter>
+      { };
+
+    template<typename _Source>
+      struct __constructible_from<_Source, void>
+      : decltype(__is_path_src(std::declval<_Source>(), 0))
+      { };
+
+    template<typename _Tp1, typename _Tp2 = void>
+      using _Path = typename
+	std::enable_if<__and_<__not_<is_same<_Tp1, path>>,
+			      __constructible_from<_Tp1, _Tp2>>::value,
+		       path>::type;
+
+    template<typename _Source>
+      static _Source
+      _S_range_begin(_Source __begin) { return __begin; }
+
+    struct __null_terminated { };
+
+    template<typename _Source>
+      static __null_terminated
+      _S_range_end(_Source) { return {}; }
+
+    template<typename _CharT, typename _Traits, typename _Alloc>
+      static const _CharT*
+      _S_range_begin(const basic_string<_CharT, _Traits, _Alloc>& __str)
+      { return __str.data(); }
+
+    template<typename _CharT, typename _Traits, typename _Alloc>
+      static const _CharT*
+      _S_range_end(const basic_string<_CharT, _Traits, _Alloc>& __str)
+      { return __str.data() + __str.size(); }
+
+    template<typename _Tp,
+	     typename _Iter = decltype(_S_range_begin(std::declval<_Tp>())),
+	     typename _Val = typename std::iterator_traits<_Iter>::value_type>
+      using __value_type_is_char
+	= typename std::enable_if<std::is_same<_Val, char>::value>::type;
+
+  public:
+#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+    typedef wchar_t				value_type;
+    static constexpr value_type			preferred_separator = L'\\';
+#else
+    typedef char				value_type;
+    static constexpr value_type			preferred_separator = '/';
+#endif
+    typedef std::basic_string<value_type>	string_type;
+
+    // constructors and destructor
+
+    path() noexcept { }
+
+    path(const path& __p) = default;
+
+    path(path&& __p) noexcept
+    : _M_pathname(std::move(__p._M_pathname)), _M_type(__p._M_type)
+    {
+      _M_split_cmpts();
+      __p.clear();
+    }
+
+    template<typename _Source,
+	     typename _Require = _Path<_Source>>
+      path(_Source const& __source)
+      : _M_pathname(_S_convert(_S_range_begin(__source),
+			       _S_range_end(__source)))
+      { _M_split_cmpts(); }
+
+    template<typename _InputIterator,
+	     typename _Require = _Path<_InputIterator, _InputIterator>>
+      path(_InputIterator __first, _InputIterator __last)
+      : _M_pathname(_S_convert(__first, __last))
+      { _M_split_cmpts(); }
+
+    template<typename _Source,
+	     typename _Require = _Path<_Source>,
+	     typename _Require2 = __value_type_is_char<_Source>>
+      path(_Source const& __source, const locale& __loc)
+      : _M_pathname(_S_convert_loc(_S_range_begin(__source),
+				   _S_range_end(__source), __loc))
+      { _M_split_cmpts(); }
+
+    template<typename _InputIterator,
+	     typename _Require = _Path<_InputIterator, _InputIterator>,
+	     typename _Require2 = __value_type_is_char<_InputIterator>>
+      path(_InputIterator __first, _InputIterator __last, const locale& __loc)
+      : _M_pathname(_S_convert_loc(__first, __last, __loc))
+      { _M_split_cmpts(); }
+
+    ~path() = default;
+
+    // assignments
+
+    path& operator=(const path& __p) = default;
+    path& operator=(path&& __p) noexcept;
+
+    template<typename _Source>
+      _Path<_Source>&
+      operator=(_Source const& __source)
+      { return *this = path(__source); }
+
+    template<typename _Source>
+      _Path<_Source>&
+      assign(_Source const& __source)
+      { return *this = path(__source); }
+
+    template<typename _InputIterator>
+      _Path<_InputIterator, _InputIterator>&
+      assign(_InputIterator __first, _InputIterator __last)
+      { return *this = path(__first, __last); }
+
+    // appends
+
+    path& operator/=(const path& __p) { return _M_append(__p._M_pathname); }
+
+    template <class _Source>
+      _Path<_Source>&
+      operator/=(_Source const& __source)
+      { return append(__source); }
+
+    template<typename _Source>
+      _Path<_Source>&
+      append(_Source const& __source)
+      {
+	return _M_append(_S_convert(_S_range_begin(__source),
+				    _S_range_end(__source)));
+      }
+
+    template<typename _InputIterator>
+      _Path<_InputIterator, _InputIterator>&
+      append(_InputIterator __first, _InputIterator __last)
+      { return _M_append(_S_convert(__first, __last)); }
+
+    // concatenation
+
+    path& operator+=(const path& __x);
+    path& operator+=(const string_type& __x);
+    path& operator+=(const value_type* __x);
+    path& operator+=(value_type __x);
+
+    template<typename _Source>
+      _Path<_Source>&
+      operator+=(_Source const& __x) { return concat(__x); }
+
+    template<typename _CharT>
+      _Path<_CharT*, _CharT*>&
+      operator+=(_CharT __x);
+
+    template<typename _Source>
+      _Path<_Source>&
+      concat(_Source const& __x)
+      { return *this += _S_convert(_S_range_begin(__x), _S_range_end(__x)); }
+
+    template<typename _InputIterator>
+      _Path<_InputIterator, _InputIterator>&
+      concat(_InputIterator __first, _InputIterator __last)
+      { return *this += _S_convert(__first, __last); }
+
+    // modifiers
+
+    void clear() noexcept { _M_pathname.clear(); _M_split_cmpts(); }
+
+    path& make_preferred();
+    path& remove_filename();
+    path& replace_filename(const path& __replacement);
+    path& replace_extension(const path& __replacement = path());
+
+    void swap(path& __rhs) noexcept;
+
+    // native format observers
+
+    const string_type&  native() const noexcept { return _M_pathname; }
+    const value_type*   c_str() const noexcept { return _M_pathname.c_str(); }
+    operator string_type() const { return _M_pathname; }
+
+    template<typename _CharT, typename _Traits = std::char_traits<_CharT>,
+	     typename _Allocator = std::allocator<_CharT>>
+      std::basic_string<_CharT, _Traits, _Allocator>
+      string(const _Allocator& __a = _Allocator()) const;
+
+    std::string    string() const;
+#if _GLIBCXX_USE_WCHAR_T
+    std::wstring   wstring() const;
+#endif
+    std::string    u8string() const;
+    std::u16string u16string() const;
+    std::u32string u32string() const;
+
+    // generic format observers
+    template<typename _CharT, typename _Traits = std::char_traits<_CharT>,
+	     typename _Allocator = std::allocator<_CharT>>
+      std::basic_string<_CharT, _Traits, _Allocator>
+      generic_string(const _Allocator& __a = _Allocator()) const;
+
+    std::string    generic_string() const;
+#if _GLIBCXX_USE_WCHAR_T
+    std::wstring   generic_wstring() const;
+#endif
+    std::string    generic_u8string() const;
+    std::u16string generic_u16string() const;
+    std::u32string generic_u32string() const;
+
+    // compare
+
+    int compare(const path& __p) const noexcept;
+    int compare(const string_type& __s) const;
+    int compare(const value_type* __s) const;
+
+    // decomposition
+
+    path root_name() const;
+    path root_directory() const;
+    path root_path() const;
+    path relative_path() const;
+    path parent_path() const;
+    path filename() const;
+    path stem() const;
+    path extension() const;
+
+    // query
+
+    bool empty() const noexcept { return _M_pathname.empty(); }
+    bool has_root_name() const;
+    bool has_root_directory() const;
+    bool has_root_path() const;
+    bool has_relative_path() const;
+    bool has_parent_path() const;
+    bool has_filename() const;
+    bool has_stem() const;
+    bool has_extension() const;
+    bool is_absolute() const;
+    bool is_relative() const { return !is_absolute(); }
+
+    // iterators
+    class iterator;
+    typedef iterator const_iterator;
+
+    iterator begin() const;
+    iterator end() const;
+
+  private:
+    enum class _Type : unsigned char {
+	_Multi, _Root_name, _Root_dir, _Filename
+    };
+
+    path(string_type __str, _Type __type) : _M_pathname(__str), _M_type(__type)
+    {
+      __glibcxx_assert(!empty());
+      __glibcxx_assert(_M_type != _Type::_Multi);
+    }
+
+    enum class _Split { _Stem, _Extension };
+
+    path& _M_append(const string_type& __str)
+    {
+      if (!_M_pathname.empty() && !_S_is_dir_sep(_M_pathname.back())
+	  && !__str.empty() && !_S_is_dir_sep(__str.front()))
+	_M_pathname += preferred_separator;
+      _M_pathname += __str;
+      _M_split_cmpts();
+      return *this;
+    }
+
+    pair<const string_type*, size_t> _M_find_extension() const;
+
+    template<typename _CharT>
+      struct _Cvt;
+
+    static string_type
+    _S_convert(value_type* __src, __null_terminated)
+    { return string_type(__src); }
+
+    static string_type
+    _S_convert(const value_type* __src, __null_terminated)
+    { return string_type(__src); }
+
+    template<typename _Iter>
+      static string_type
+      _S_convert(_Iter __first, _Iter __last)
+      {
+	using __value_type = typename std::iterator_traits<_Iter>::value_type;
+	return _Cvt<__value_type>::_S_convert(__first, __last);
+      }
+
+    template<typename _InputIterator>
+      static string_type
+      _S_convert(_InputIterator __src, __null_terminated)
+      {
+	using _Tp = typename std::iterator_traits<_InputIterator>::value_type;
+	std::basic_string<_Tp> __tmp;
+	while (*__src != _Tp{})
+	  __tmp.push_back(*__src++);
+	return _S_convert(__tmp.data(), __tmp.data() + __tmp.size());
+      }
+
+    static string_type
+    _S_convert_loc(const char* __first, const char* __last,
+		   const std::locale& __loc);
+
+    template<typename _Iter>
+      static string_type
+      _S_convert_loc(_Iter __first, _Iter __last, const std::locale& __loc)
+      {
+	const std::string __str(__first, __last);
+	return _S_convert_loc(__str.data(), __str.data()+__str.size(), __loc);
+      }
+
+    template<typename _InputIterator>
+      static string_type
+      _S_convert_loc(_InputIterator __src, __null_terminated,
+		     const std::locale& __loc)
+      {
+	std::string __tmp;
+	while (*__src != '\0')
+	  __tmp.push_back(*__src++);
+	return _S_convert_loc(__tmp.data(), __tmp.data()+__tmp.size(), __loc);
+      }
+
+    bool _S_is_dir_sep(value_type __ch)
+    {
+#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+      return __ch == L'/' || __ch == preferred_separator;
+#else
+      return __ch == '/';
+#endif
+    }
+
+    void _M_split_cmpts();
+    void _M_trim();
+    void _M_add_root_name(size_t __n);
+    void _M_add_root_dir(size_t __pos);
+    void _M_add_filename(size_t __pos, size_t __n);
+
+    string_type _M_pathname;
+
+    struct _Cmpt;
+    using _List = _GLIBCXX_STD_C::vector<_Cmpt>;
+    _List _M_cmpts; // empty unless _M_type == _Type::_Multi
+    _Type _M_type = _Type::_Multi;
+  };
+
+  inline void swap(path& __lhs, path& __rhs) noexcept { __lhs.swap(__rhs); }
+
+  size_t hash_value(const path& __p) noexcept;
+
+  /// Compare paths
+  inline bool operator<(const path& __lhs, const path& __rhs) noexcept
+  { return __lhs.compare(__rhs) < 0; }
+
+  /// Compare paths
+  inline bool operator<=(const path& __lhs, const path& __rhs) noexcept
+  { return !(__rhs < __lhs); }
+
+  /// Compare paths
+  inline bool operator>(const path& __lhs, const path& __rhs) noexcept
+  { return __rhs < __lhs; }
+
+  /// Compare paths
+  inline bool operator>=(const path& __lhs, const path& __rhs) noexcept
+  { return !(__lhs < __rhs); }
+
+  /// Compare paths
+  inline bool operator==(const path& __lhs, const path& __rhs) noexcept
+  { return __lhs.compare(__rhs) == 0; }
+
+  /// Compare paths
+  inline bool operator!=(const path& __lhs, const path& __rhs) noexcept
+  { return !(__lhs == __rhs); }
+
+  /// Append one path to another
+  inline path operator/(const path& __lhs, const path& __rhs)
+  { return path(__lhs) /= __rhs; }
+
+  /// Write a path to a stream
+  template<typename _CharT, typename _Traits>
+    basic_ostream<_CharT, _Traits>&
+    operator<<(basic_ostream<_CharT, _Traits>& __os, const path& __p)
+    {
+      auto __tmp = __p.string<_CharT, _Traits>();
+      using __quoted_string
+	= std::__detail::_Quoted_string<decltype(__tmp)&, _CharT>;
+      __os << __quoted_string{__tmp, '"', '\\'};
+      return __os;
+    }
+
+  /// Read a path from a stream
+  template<typename _CharT, typename _Traits>
+    basic_istream<_CharT, _Traits>&
+    operator>>(basic_istream<_CharT, _Traits>& __is, path& __p)
+    {
+      basic_string<_CharT, _Traits> __tmp;
+      using __quoted_string
+	= std::__detail::_Quoted_string<decltype(__tmp)&, _CharT>;
+      if (__is >> __quoted_string{ __tmp, '"', '\\' })
+	__p = std::move(__tmp);
+      return __is;
+    }
+
+  // TODO constrain with _Path<Source> and __value_type_is_char
+  template<typename _Source>
+    inline path
+    u8path(const _Source& __source)
+    {
+#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+      return path{ path::string_type{__source} };
+#else
+      return path{ __source };
+#endif
+    }
+
+  // TODO constrain with _Path<InputIterator, InputIterator> and __value_type_is_char
+  template<typename _InputIterator>
+    inline path
+    u8path(_InputIterator __first, _InputIterator __last)
+    {
+#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+      return path{ path::string_type{__first, __last} };
+#else
+      return path{ __first, __last };
+#endif
+    }
+
+  class filesystem_error : public std::system_error
+  {
+  public:
+    filesystem_error(const string& __what_arg, error_code __ec)
+    : system_error(__ec, __what_arg) { }
+
+    filesystem_error(const string& __what_arg, const path& __p1,
+		     error_code __ec)
+    : system_error(__ec, __what_arg), _M_path1(__p1) { }
+
+    filesystem_error(const string& __what_arg, const path& __p1,
+		     const path& __p2, error_code __ec)
+    : system_error(__ec, __what_arg), _M_path1(__p1), _M_path2(__p2)
+    { }
+
+    ~filesystem_error();
+
+    const path& path1() const noexcept { return _M_path1; }
+    const path& path2() const noexcept { return _M_path2; }
+    const char* what() const noexcept { return _M_what.c_str(); }
+
+  private:
+    std::string _M_gen_what();
+
+    path _M_path1;
+    path _M_path2;
+    std::string _M_what = _M_gen_what();
+  };
+
+  struct path::_Cmpt : path
+  {
+    _Cmpt(string_type __s, _Type __t, size_t __pos)
+      : path(std::move(__s), __t), _M_pos(__pos) { }
+
+    _Cmpt() : _M_pos(-1) { }
+
+    size_t _M_pos;
+  };
+
+  template<>
+    struct path::__is_encoded_char<char> : std::true_type
+    { using value_type = char; };
+
+  template<>
+    struct path::__is_encoded_char<wchar_t> : std::true_type
+    { using value_type = wchar_t; };
+
+  template<>
+    struct path::__is_encoded_char<char16_t> : std::true_type
+    { using value_type = char16_t; };
+
+  template<>
+    struct path::__is_encoded_char<char32_t> : std::true_type
+    { using value_type = char32_t; };
+
+  // specialize _Cvt for degenerate 'noconv' case
+  template<>
+    struct path::_Cvt<path::value_type>
+    {
+      template<typename _Iter>
+	static string_type
+	_S_convert(_Iter __first, _Iter __last)
+	{ return string_type{__first, __last}; }
+    };
+
+  template<typename _CharT>
+    struct path::_Cvt
+    {
+#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+      static string_type
+      _S_wconvert(const char* __f, const char* __l, true_type)
+      {
+	using _Cvt = std::codecvt<wchar_t, char, mbstate_t>;
+	const auto& __cvt = std::use_facet<_Cvt>(std::locale{});
+	std::wstring __wstr;
+	if (__str_codecvt_in(__f, __l, __wstr, __cvt))
+	    return __wstr;
+	_GLIBCXX_THROW_OR_ABORT(filesystem_error(
+	      "Cannot convert character sequence",
+	      std::make_error_code(errc::illegal_byte_sequence)));
+      }
+
+      static string_type
+      _S_wconvert(const _CharT* __f, const _CharT* __l, false_type)
+      {
+	std::codecvt_utf8<_CharT> __cvt;
+	std::string __str;
+	if (__str_codecvt_out(__f, __l, __str, __cvt))
+	  {
+	    const char* __f2 = __str.data();
+	    const char* __l2 = __f2 + __str.size();
+	    std::codecvt_utf8<wchar_t> __wcvt;
+	    std::wstring __wstr;
+	    if (__str_codecvt_in(__f2, __l2, __wstr, __wcvt))
+	      return __wstr;
+	  }
+	_GLIBCXX_THROW_OR_ABORT(filesystem_error(
+	      "Cannot convert character sequence",
+	      std::make_error_code(errc::illegal_byte_sequence)));
+      }
+
+      static string_type
+      _S_convert(const _CharT* __f, const _CharT* __l)
+      {
+	return _S_wconvert(__f, __l, is_same<_CharT, char>{});
+      }
+#else
+      static string_type
+      _S_convert(const _CharT* __f, const _CharT* __l)
+      {
+	std::codecvt_utf8<_CharT> __cvt;
+	std::string __str;
+	if (__str_codecvt_out(__f, __l, __str, __cvt))
+	  return __str;
+	_GLIBCXX_THROW_OR_ABORT(filesystem_error(
+	      "Cannot convert character sequence",
+	      std::make_error_code(errc::illegal_byte_sequence)));
+      }
+#endif
+
+      static string_type
+      _S_convert(_CharT* __f, _CharT* __l)
+      {
+	return _S_convert(const_cast<const _CharT*>(__f),
+			  const_cast<const _CharT*>(__l));
+      }
+
+      template<typename _Iter>
+	static string_type
+	_S_convert(_Iter __first, _Iter __last)
+	{
+	  const std::basic_string<_CharT> __str(__first, __last);
+	  return _S_convert(__str.data(), __str.data() + __str.size());
+	}
+
+      template<typename _Iter, typename _Cont>
+	static string_type
+	_S_convert(__gnu_cxx::__normal_iterator<_Iter, _Cont> __first,
+		  __gnu_cxx::__normal_iterator<_Iter, _Cont> __last)
+	{ return _S_convert(__first.base(), __last.base()); }
+    };
+
+  /// An iterator for the components of a path
+  class path::iterator
+  {
+  public:
+    using difference_type	= std::ptrdiff_t;
+    using value_type		= path;
+    using reference		= const path&;
+    using pointer		= const path*;
+    using iterator_category	= std::bidirectional_iterator_tag;
+
+    iterator() : _M_path(nullptr), _M_cur(), _M_at_end() { }
+
+    iterator(const iterator&) = default;
+    iterator& operator=(const iterator&) = default;
+
+    reference operator*() const;
+    pointer   operator->() const { return std::__addressof(**this); }
+
+    iterator& operator++();
+    iterator  operator++(int) { auto __tmp = *this; ++_M_cur; return __tmp; }
+
+    iterator& operator--();
+    iterator  operator--(int) { auto __tmp = *this; --_M_cur; return __tmp; }
+
+    friend bool operator==(const iterator& __lhs, const iterator& __rhs)
+    { return __lhs._M_equals(__rhs); }
+
+    friend bool operator!=(const iterator& __lhs, const iterator& __rhs)
+    { return !__lhs._M_equals(__rhs); }
+
+  private:
+    friend class path;
+
+    iterator(const path* __path, path::_List::const_iterator __iter)
+    : _M_path(__path), _M_cur(__iter), _M_at_end()
+    { }
+
+    iterator(const path* __path, bool __at_end)
+    : _M_path(__path), _M_cur(), _M_at_end(__at_end)
+    { }
+
+    bool _M_equals(iterator) const;
+
+    const path* 		_M_path;
+    path::_List::const_iterator _M_cur;
+    bool			_M_at_end;  // only used when type != _Multi
+  };
+
+
+  inline path&
+  path::operator=(path&& __p) noexcept
+  {
+    _M_pathname = std::move(__p._M_pathname);
+    _M_cmpts = std::move(__p._M_cmpts);
+    _M_type = __p._M_type;
+    __p.clear();
+    return *this;
+  }
+
+  inline path&
+  path::operator+=(const path& __p)
+  {
+    return operator+=(__p.native());
+  }
+
+  inline path&
+  path::operator+=(const string_type& __x)
+  {
+    _M_pathname += __x;
+    _M_split_cmpts();
+    return *this;
+  }
+
+  inline path&
+  path::operator+=(const value_type* __x)
+  {
+    _M_pathname += __x;
+    _M_split_cmpts();
+    return *this;
+  }
+
+  inline path&
+  path::operator+=(value_type __x)
+  {
+    _M_pathname += __x;
+    _M_split_cmpts();
+    return *this;
+  }
+
+  template<typename _CharT>
+    inline path::_Path<_CharT*, _CharT*>&
+    path::operator+=(_CharT __x)
+    {
+      auto* __addr = std::__addressof(__x);
+      return concat(__addr, __addr + 1);
+    }
+
+  inline path&
+  path::make_preferred()
+  {
+#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+    std::replace(_M_pathname.begin(), _M_pathname.end(), L'/',
+		 preferred_separator);
+#endif
+    return *this;
+  }
+
+  inline void path::swap(path& __rhs) noexcept
+  {
+    _M_pathname.swap(__rhs._M_pathname);
+    _M_cmpts.swap(__rhs._M_cmpts);
+    std::swap(_M_type, __rhs._M_type);
+  }
+
+  template<typename _CharT, typename _Traits, typename _Allocator>
+    inline std::basic_string<_CharT, _Traits, _Allocator>
+    path::string(const _Allocator& __a) const
+    {
+      if (is_same<_CharT, value_type>::value)
+	return { _M_pathname.begin(), _M_pathname.end(), __a };
+
+      const value_type* __first = _M_pathname.data();
+      const value_type* __last = __first + _M_pathname.size();
+
+#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+      using _CharAlloc = __alloc_rebind<_Allocator, char>;
+      using _String = basic_string<char, char_traits<char>, _CharAlloc>;
+      using _WString = basic_string<_CharT, _Traits, _Allocator>;
+
+      // use codecvt_utf8<wchar_t> to convert native string to UTF-8
+      codecvt_utf8<value_type> __cvt;
+      _String __u8str{_CharAlloc{__a}};
+      if (__str_codecvt_out(__first, __last, __u8str, __cvt))
+	{
+	  struct
+	  {
+	    const _String*
+	    operator()(const _String& __from, _String&, true_type)
+	    { return std::__addressof(__from); }
+
+	    _WString*
+	    operator()(const _String& __from, _WString& __to, false_type)
+	    {
+	      // use codecvt_utf8<_CharT> to convert UTF-8 to wide string
+	      codecvt_utf8<_CharT> __cvt;
+	      const char* __f = __from.data();
+	      const char* __l = __f + __from.size();
+	      if (__str_codecvt_in(__f, __l, __to, __cvt))
+		return std::__addressof(__to);
+	      return nullptr;
+	    }
+	  } __dispatch;
+	  _WString __wstr;
+	  if (auto* __p = __dispatch(__u8str, __wstr, is_same<_CharT, char>{}))
+	    return *__p;
+	}
+#else
+      codecvt_utf8<_CharT> __cvt;
+      basic_string<_CharT, _Traits, _Allocator> __wstr{__a};
+      if (__str_codecvt_in(__first, __last, __wstr, __cvt))
+	return __wstr;
+#endif
+      _GLIBCXX_THROW_OR_ABORT(filesystem_error(
+	    "Cannot convert character sequence",
+	    std::make_error_code(errc::illegal_byte_sequence)));
+    }
+
+  inline std::string
+  path::string() const { return string<char>(); }
+
+#if _GLIBCXX_USE_WCHAR_T
+  inline std::wstring
+  path::wstring() const { return string<wchar_t>(); }
+#endif
+
+  inline std::string
+  path::u8string() const
+  {
+#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+    std::string __str;
+    // convert from native encoding to UTF-8
+    codecvt_utf8<value_type> __cvt;
+    const value_type* __first = _M_pathname.data();
+    const value_type* __last = __first + _M_pathname.size();
+    if (__str_codecvt_out(__first, __last, __str, __cvt))
+      return __str;
+    _GLIBCXX_THROW_OR_ABORT(filesystem_error(
+	  "Cannot convert character sequence",
+	  std::make_error_code(errc::illegal_byte_sequence)));
+#else
+    return _M_pathname;
+#endif
+  }
+
+  inline std::u16string
+  path::u16string() const { return string<char16_t>(); }
+
+  inline std::u32string
+  path::u32string() const { return string<char32_t>(); }
+
+#ifndef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+  template<typename _CharT, typename _Traits, typename _Allocator>
+    inline std::basic_string<_CharT, _Traits, _Allocator>
+    path::generic_string(const _Allocator& __a) const
+    { return string<_CharT, _Traits, _Allocator>(__a); }
+
+  inline std::string
+  path::generic_string() const { return string(); }
+
+#if _GLIBCXX_USE_WCHAR_T
+  inline std::wstring
+  path::generic_wstring() const { return wstring(); }
+#endif
+
+  inline std::string
+  path::generic_u8string() const { return u8string(); }
+
+  inline std::u16string
+  path::generic_u16string() const { return u16string(); }
+
+  inline std::u32string
+  path::generic_u32string() const { return u32string(); }
+#endif
+
+  inline int
+  path::compare(const string_type& __s) const { return compare(path(__s)); }
+
+  inline int
+  path::compare(const value_type* __s) const { return compare(path(__s)); }
+
+  inline path
+  path::filename() const { return empty() ? path() : *--end(); }
+
+  inline path
+  path::stem() const
+  {
+    auto ext = _M_find_extension();
+    if (ext.first && ext.second != 0)
+      return path{ext.first->substr(0, ext.second)};
+    return {};
+  }
+
+  inline path
+  path::extension() const
+  {
+    auto ext = _M_find_extension();
+    if (ext.first && ext.second != string_type::npos)
+      return path{ext.first->substr(ext.second)};
+    return {};
+  }
+
+  inline bool
+  path::has_stem() const
+  {
+    auto ext = _M_find_extension();
+    return ext.first && ext.second != 0;
+  }
+
+  inline bool
+  path::has_extension() const
+  {
+    auto ext = _M_find_extension();
+    return ext.first && ext.second != string_type::npos;
+  }
+
+  inline bool
+  path::is_absolute() const
+  {
+#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+    return has_root_name();
+#else
+    return has_root_directory();
+#endif
+  }
+
+  inline path::iterator
+  path::begin() const
+  {
+    if (_M_type == _Type::_Multi)
+      return iterator(this, _M_cmpts.begin());
+    return iterator(this, false);
+  }
+
+  inline path::iterator
+  path::end() const
+  {
+    if (_M_type == _Type::_Multi)
+      return iterator(this, _M_cmpts.end());
+    return iterator(this, true);
+  }
+
+  inline path::iterator&
+  path::iterator::operator++()
+  {
+    __glibcxx_assert(_M_path != nullptr);
+    if (_M_path->_M_type == _Type::_Multi)
+      {
+	__glibcxx_assert(_M_cur != _M_path->_M_cmpts.end());
+	++_M_cur;
+      }
+    else
+      {
+	__glibcxx_assert(!_M_at_end);
+	_M_at_end = true;
+      }
+    return *this;
+  }
+
+  inline path::iterator&
+  path::iterator::operator--()
+  {
+    __glibcxx_assert(_M_path != nullptr);
+    if (_M_path->_M_type == _Type::_Multi)
+      {
+	__glibcxx_assert(_M_cur != _M_path->_M_cmpts.begin());
+	--_M_cur;
+      }
+    else
+      {
+	__glibcxx_assert(_M_at_end);
+	_M_at_end = false;
+      }
+    return *this;
+  }
+
+  inline path::iterator::reference
+  path::iterator::operator*() const
+  {
+    __glibcxx_assert(_M_path != nullptr);
+    if (_M_path->_M_type == _Type::_Multi)
+      {
+	__glibcxx_assert(_M_cur != _M_path->_M_cmpts.end());
+	return *_M_cur;
+      }
+    return *_M_path;
+  }
+
+  inline bool
+  path::iterator::_M_equals(iterator __rhs) const
+  {
+    if (_M_path != __rhs._M_path)
+      return false;
+    if (_M_path == nullptr)
+      return true;
+    if (_M_path->_M_type == path::_Type::_Multi)
+      return _M_cur == __rhs._M_cur;
+    return _M_at_end == __rhs._M_at_end;
+  }
+
+  // @} group filesystem
+_GLIBCXX_END_NAMESPACE_CXX11
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace v1
+} // namespace filesystem
+} // namespace experimental
+} // namespace std
+
+#endif // C++11
+
+#endif // _GLIBCXX_EXPERIMENTAL_FS_PATH_H
diff --git a/libstdc++-v3/include/experimental/bits/string_view.tcc b/libstdc++-v3/include/experimental/bits/string_view.tcc
new file mode 100644
index 0000000..75a34f9
--- /dev/null
+++ b/libstdc++-v3/include/experimental/bits/string_view.tcc
@@ -0,0 +1,230 @@
+// Components for manipulating non-owning sequences of characters -*- C++ -*-
+
+// Copyright (C) 2013-2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file experimental/string_view.tcc
+ *  This is an internal header file, included by other library headers.
+ *  Do not attempt to use it directly. @headername{string_view}
+ */
+
+//
+// N3762 basic_string_view library
+//
+
+#ifndef _GLIBCXX_EXPERIMENTAL_STRING_VIEW_TCC
+#define _GLIBCXX_EXPERIMENTAL_STRING_VIEW_TCC 1
+
+#pragma GCC system_header
+
+#if __cplusplus <= 201103L
+# include <bits/c++14_warning.h>
+#else
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+namespace experimental
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  template<typename _CharT, typename _Traits>
+    typename basic_string_view<_CharT, _Traits>::size_type
+    basic_string_view<_CharT, _Traits>::
+    find(const _CharT* __str, size_type __pos, size_type __n) const noexcept
+    {
+      __glibcxx_requires_string_len(__str, __n);
+
+      if (__n == 0)
+	return __pos <= this->_M_len ? __pos : npos;
+
+      if (__n <= this->_M_len)
+	{
+	  for (; __pos <= this->_M_len - __n; ++__pos)
+	    if (traits_type::eq(this->_M_str[__pos], __str[0])
+		&& traits_type::compare(this->_M_str + __pos + 1,
+					__str + 1, __n - 1) == 0)
+	      return __pos;
+	}
+      return npos;
+    }
+
+  template<typename _CharT, typename _Traits>
+    typename basic_string_view<_CharT, _Traits>::size_type
+    basic_string_view<_CharT, _Traits>::
+    find(_CharT __c, size_type __pos) const noexcept
+    {
+      size_type __ret = npos;
+      if (__pos < this->_M_len)
+	{
+	  const size_type __n = this->_M_len - __pos;
+	  const _CharT* __p = traits_type::find(this->_M_str + __pos, __n, __c);
+	  if (__p)
+	    __ret = __p - this->_M_str;
+	}
+      return __ret;
+    }
+
+  template<typename _CharT, typename _Traits>
+    typename basic_string_view<_CharT, _Traits>::size_type
+    basic_string_view<_CharT, _Traits>::
+    rfind(const _CharT* __str, size_type __pos, size_type __n) const noexcept
+    {
+      __glibcxx_requires_string_len(__str, __n);
+
+      if (__n <= this->_M_len)
+	{
+	  __pos = std::min(size_type(this->_M_len - __n), __pos);
+	  do
+	    {
+	      if (traits_type::compare(this->_M_str + __pos, __str, __n) == 0)
+		return __pos;
+	    }
+	  while (__pos-- > 0);
+	}
+      return npos;
+    }
+
+  template<typename _CharT, typename _Traits>
+    typename basic_string_view<_CharT, _Traits>::size_type
+    basic_string_view<_CharT, _Traits>::
+    rfind(_CharT __c, size_type __pos) const noexcept
+    {
+      size_type __size = this->_M_len;
+      if (__size > 0)
+	{
+	  if (--__size > __pos)
+	    __size = __pos;
+	  for (++__size; __size-- > 0; )
+	    if (traits_type::eq(this->_M_str[__size], __c))
+	      return __size;
+	}
+      return npos;
+    }
+
+  template<typename _CharT, typename _Traits>
+    typename basic_string_view<_CharT, _Traits>::size_type
+    basic_string_view<_CharT, _Traits>::
+    find_first_of(const _CharT* __str, size_type __pos, size_type __n) const
+    {
+      __glibcxx_requires_string_len(__str, __n);
+      for (; __n && __pos < this->_M_len; ++__pos)
+	{
+	  const _CharT* __p = traits_type::find(__str, __n,
+						this->_M_str[__pos]);
+	  if (__p)
+	    return __pos;
+	}
+      return npos;
+    }
+
+  template<typename _CharT, typename _Traits>
+    typename basic_string_view<_CharT, _Traits>::size_type
+    basic_string_view<_CharT, _Traits>::
+    find_last_of(const _CharT* __str, size_type __pos, size_type __n) const
+    {
+      __glibcxx_requires_string_len(__str, __n);
+      size_type __size = this->size();
+      if (__size && __n)
+	{
+	  if (--__size > __pos)
+	    __size = __pos;
+	  do
+	    {
+	      if (traits_type::find(__str, __n, this->_M_str[__size]))
+		return __size;
+	    }
+	  while (__size-- != 0);
+	}
+      return npos;
+    }
+
+  template<typename _CharT, typename _Traits>
+    typename basic_string_view<_CharT, _Traits>::size_type
+    basic_string_view<_CharT, _Traits>::
+    find_first_not_of(const _CharT* __str, size_type __pos, size_type __n) const
+    {
+      __glibcxx_requires_string_len(__str, __n);
+      for (; __pos < this->_M_len; ++__pos)
+	if (!traits_type::find(__str, __n, this->_M_str[__pos]))
+	  return __pos;
+      return npos;
+    }
+
+  template<typename _CharT, typename _Traits>
+    typename basic_string_view<_CharT, _Traits>::size_type
+    basic_string_view<_CharT, _Traits>::
+    find_first_not_of(_CharT __c, size_type __pos) const noexcept
+    {
+      for (; __pos < this->_M_len; ++__pos)
+	if (!traits_type::eq(this->_M_str[__pos], __c))
+	  return __pos;
+      return npos;
+    }
+
+  template<typename _CharT, typename _Traits>
+    typename basic_string_view<_CharT, _Traits>::size_type
+    basic_string_view<_CharT, _Traits>::
+    find_last_not_of(const _CharT* __str, size_type __pos, size_type __n) const
+    {
+      __glibcxx_requires_string_len(__str, __n);
+      size_type __size = this->_M_len;
+      if (__size)
+	{
+	  if (--__size > __pos)
+	    __size = __pos;
+	  do
+	    {
+	      if (!traits_type::find(__str, __n, this->_M_str[__size]))
+		return __size;
+	    }
+	  while (__size--);
+	}
+      return npos;
+    }
+
+  template<typename _CharT, typename _Traits>
+    typename basic_string_view<_CharT, _Traits>::size_type
+    basic_string_view<_CharT, _Traits>::
+    find_last_not_of(_CharT __c, size_type __pos) const noexcept
+    {
+      size_type __size = this->_M_len;
+      if (__size)
+	{
+	  if (--__size > __pos)
+	    __size = __pos;
+	  do
+	    {
+	      if (!traits_type::eq(this->_M_str[__size], __c))
+		return __size;
+	    }
+	  while (__size--);
+	}
+      return npos;
+    }
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace experimental
+} // namespace std
+
+#endif // __cplusplus <= 201103L
+
+#endif // _GLIBCXX_EXPERIMENTAL_STRING_VIEW_TCC
diff --git a/libstdc++-v3/include/experimental/erase_if.h b/libstdc++-v3/include/experimental/erase_if.h
deleted file mode 100644
index 35b5b37..0000000
--- a/libstdc++-v3/include/experimental/erase_if.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// <experimental/erase_if.h> -*- C++ -*-
-
-// Copyright (C) 2015 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library.  This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 3, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-
-// Under Section 7 of GPL version 3, you are granted additional
-// permissions described in the GCC Runtime Library Exception, version
-// 3.1, as published by the Free Software Foundation.
-
-// You should have received a copy of the GNU General Public License and
-// a copy of the GCC Runtime Library Exception along with this program;
-// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-// <http://www.gnu.org/licenses/>.
-
-/** @file experimental/erase_if.h
- *  This is an internal header file, included by other library headers.
- *  Do not attempt to use it directly.
- */
-
-#ifndef _GLIBCXX_EXPERIMENTAL_ERASE_IF_H
-#define _GLIBCXX_EXPERIMENTAL_ERASE_IF_H 1
-
-#pragma GCC system_header
-
-#if __cplusplus <= 201103L
-# include <bits/c++14_warning.h>
-#else
-
-namespace std
-{
-namespace experimental
-{
-inline namespace fundamentals_v2
-{
-
-  namespace __detail
-  {
-    template<typename _Container, typename _Predicate>
-      void
-      __erase_nodes_if(_Container& __cont, _Predicate __pred)
-      {
-	for (auto __iter = __cont.begin(), __last = __cont.end();
-	     __iter != __last;)
-	{
-	  if (__pred(*__iter))
-	    __iter = __cont.erase(__iter);
-	  else
-	    ++__iter;
-	}
-      }
-  }
-
-
-} // inline namespace fundamentals_v2
-} // namespace experimental
-} // namespace std
-
-#endif // C++14
-
-#endif // _GLIBCXX_EXPERIMENTAL_ERASE_IF_H
diff --git a/libstdc++-v3/include/experimental/filesystem b/libstdc++-v3/include/experimental/filesystem
index db7ab11..6713463 100644
--- a/libstdc++-v3/include/experimental/filesystem
+++ b/libstdc++-v3/include/experimental/filesystem
@@ -35,10 +35,10 @@
 # include <bits/c++0x_warning.h>
 #else
 
-#include <experimental/fs_fwd.h>
-#include <experimental/fs_path.h>
-#include <experimental/fs_dir.h>
-#include <experimental/fs_ops.h>
+#include <experimental/bits/fs_fwd.h>
+#include <experimental/bits/fs_path.h>
+#include <experimental/bits/fs_dir.h>
+#include <experimental/bits/fs_ops.h>
 
 #define __cpp_lib_experimental_filesystem 201406
 
diff --git a/libstdc++-v3/include/experimental/fs_dir.h b/libstdc++-v3/include/experimental/fs_dir.h
deleted file mode 100644
index 0c5253f..0000000
--- a/libstdc++-v3/include/experimental/fs_dir.h
+++ /dev/null
@@ -1,338 +0,0 @@
-// Filesystem directory utilities -*- C++ -*-
-
-// Copyright (C) 2014-2015 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library.  This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 3, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-
-// Under Section 7 of GPL version 3, you are granted additional
-// permissions described in the GCC Runtime Library Exception, version
-// 3.1, as published by the Free Software Foundation.
-
-// You should have received a copy of the GNU General Public License and
-// a copy of the GCC Runtime Library Exception along with this program;
-// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-// <http://www.gnu.org/licenses/>.
-
-/** @file experimental/fs_dir.h
- *  This is an internal header file, included by other library headers.
- *  Do not attempt to use it directly. @headername{experimental/filesystem}
- */
-
-#ifndef _GLIBCXX_EXPERIMENTAL_FS_DIR_H
-#define _GLIBCXX_EXPERIMENTAL_FS_DIR_H 1
-
-#if __cplusplus < 201103L
-# include <bits/c++0x_warning.h>
-#else
-# include <typeinfo>
-# include <ext/concurrence.h>
-# include <bits/unique_ptr.h>
-# include <bits/shared_ptr.h>
-
-namespace std _GLIBCXX_VISIBILITY(default)
-{
-namespace experimental
-{
-namespace filesystem
-{
-inline namespace v1
-{
-_GLIBCXX_BEGIN_NAMESPACE_VERSION
-
-  /**
-   * @ingroup filesystem
-   * @{
-   */
-
-  class file_status
-  {
-  public:
-    // constructors
-    explicit
-    file_status(file_type __ft = file_type::none,
-	        perms __prms = perms::unknown) noexcept
-    : _M_type(__ft), _M_perms(__prms) { }
-
-    file_status(const file_status&) noexcept = default;
-    file_status(file_status&&) noexcept = default;
-    ~file_status() = default;
-
-    file_status& operator=(const file_status&) noexcept = default;
-    file_status& operator=(file_status&&) noexcept = default;
-
-    // observers
-    file_type  type() const noexcept { return _M_type; }
-    perms      permissions() const noexcept { return _M_perms; }
-
-    // modifiers
-    void       type(file_type __ft) noexcept { _M_type = __ft; }
-    void       permissions(perms __prms) noexcept { _M_perms = __prms; }
-
-  private:
-    file_type	_M_type;
-    perms	_M_perms;
-  };
-
-_GLIBCXX_BEGIN_NAMESPACE_CXX11
-
-  class directory_entry
-  {
-  public:
-    // constructors and destructor
-    directory_entry() noexcept = default;
-    directory_entry(const directory_entry&) = default;
-    directory_entry(directory_entry&&) noexcept = default;
-    explicit directory_entry(const filesystem::path& __p) : _M_path(__p) { }
-    ~directory_entry() = default;
-
-    // modifiers
-    directory_entry& operator=(const directory_entry&) = default;
-    directory_entry& operator=(directory_entry&&) noexcept = default;
-
-    void assign(const filesystem::path& __p) { _M_path = __p; }
-
-    void
-    replace_filename(const filesystem::path& __p)
-    { _M_path = _M_path.parent_path() / __p; }
-
-    // observers
-    const filesystem::path&  path() const noexcept { return _M_path; }
-    operator const filesystem::path&() const noexcept { return _M_path; }
-
-    file_status
-    status() const
-    { return filesystem::status(_M_path); }
-
-    file_status
-    status(error_code& __ec) const noexcept
-    { return filesystem::status(_M_path, __ec); }
-
-    file_status
-    symlink_status() const
-    { return filesystem::symlink_status(_M_path); }
-
-    file_status
-    symlink_status(error_code& __ec) const noexcept
-    { return filesystem::symlink_status(_M_path, __ec); }
-
-    bool
-    operator< (const directory_entry& __rhs) const noexcept
-    { return _M_path < __rhs._M_path; }
-
-    bool
-    operator==(const directory_entry& __rhs) const noexcept
-    { return _M_path == __rhs._M_path; }
-
-    bool
-    operator!=(const directory_entry& __rhs) const noexcept
-    { return _M_path != __rhs._M_path; }
-
-    bool
-    operator<=(const directory_entry& __rhs) const noexcept
-    { return _M_path <= __rhs._M_path; }
-
-    bool
-    operator> (const directory_entry& __rhs) const noexcept
-    { return _M_path > __rhs._M_path; }
-
-    bool
-    operator>=(const directory_entry& __rhs) const noexcept
-    { return _M_path >= __rhs._M_path; }
-
-  private:
-    filesystem::path    _M_path;
-  };
-
-  struct _Dir;
-  class recursive_directory_iterator;
-
-  class directory_iterator
-  {
-  public:
-    typedef directory_entry        value_type;
-    typedef ptrdiff_t              difference_type;
-    typedef const directory_entry* pointer;
-    typedef const directory_entry& reference;
-    typedef input_iterator_tag     iterator_category;
-
-    directory_iterator() noexcept = default;
-
-    explicit
-    directory_iterator(const path& __p)
-    : directory_iterator(__p, directory_options::none, nullptr) { }
-
-    directory_iterator(const path& __p, directory_options __options)
-    : directory_iterator(__p, __options, nullptr) { }
-
-    directory_iterator(const path& __p, error_code& __ec) noexcept
-    : directory_iterator(__p, directory_options::none, __ec) { }
-
-    directory_iterator(const path& __p,
-      directory_options __options, error_code& __ec) noexcept
-    : directory_iterator(__p, __options, &__ec) { }
-
-    directory_iterator(const directory_iterator& __rhs) = default;
-
-    directory_iterator(directory_iterator&& __rhs) noexcept = default;
-
-    ~directory_iterator() = default;
-
-    directory_iterator& operator=(const directory_iterator& __rhs) = default;
-    directory_iterator& operator=(directory_iterator&& __rhs) noexcept = default;
-
-    const directory_entry& operator*() const;
-    const directory_entry* operator->() const { return &**this; }
-    directory_iterator&    operator++();
-    directory_iterator&    increment(error_code& __ec) noexcept;
-
-    directory_iterator operator++(int)
-    {
-      auto __tmp = *this;
-      ++*this;
-      return __tmp;
-    }
-
-  private:
-    directory_iterator(const path&, directory_options, error_code*);
-
-    friend bool
-    operator==(const directory_iterator& __lhs,
-               const directory_iterator& __rhs);
-
-    friend class recursive_directory_iterator;
-
-    std::shared_ptr<_Dir> _M_dir;
-  };
-
-  inline directory_iterator
-  begin(directory_iterator __iter) { return __iter; }
-
-  inline directory_iterator
-  end(directory_iterator) { return directory_iterator(); }
-
-  inline bool
-  operator==(const directory_iterator& __lhs, const directory_iterator& __rhs)
-  {
-    return !__rhs._M_dir.owner_before(__lhs._M_dir)
-      && !__lhs._M_dir.owner_before(__rhs._M_dir);
-  }
-
-  inline bool
-  operator!=(const directory_iterator& __lhs, const directory_iterator& __rhs)
-  { return !(__lhs == __rhs); }
-
-  class recursive_directory_iterator
-  {
-  public:
-    typedef directory_entry        value_type;
-    typedef ptrdiff_t              difference_type;
-    typedef const directory_entry* pointer;
-    typedef const directory_entry& reference;
-    typedef input_iterator_tag     iterator_category;
-
-    recursive_directory_iterator() noexcept = default;
-
-    explicit
-    recursive_directory_iterator(const path& __p)
-    : recursive_directory_iterator(__p, directory_options::none, nullptr) { }
-
-    recursive_directory_iterator(const path& __p, directory_options __options)
-    : recursive_directory_iterator(__p, __options, nullptr) { }
-
-    recursive_directory_iterator(const path& __p,
-                                 directory_options __options,
-                                 error_code& __ec) noexcept
-    : recursive_directory_iterator(__p, __options, &__ec) { }
-
-    recursive_directory_iterator(const path& __p, error_code& __ec) noexcept
-    : recursive_directory_iterator(__p, directory_options::none, &__ec) { }
-
-    recursive_directory_iterator(
-        const recursive_directory_iterator&) = default;
-
-    recursive_directory_iterator(
-        recursive_directory_iterator&&) noexcept = default;
-
-    ~recursive_directory_iterator();
-
-    // observers
-    directory_options  options() const { return _M_options; }
-    int                depth() const;
-    bool               recursion_pending() const { return _M_pending; }
-
-    const directory_entry& operator*() const;
-    const directory_entry* operator->() const { return &**this; }
-
-    // modifiers
-    recursive_directory_iterator&
-      operator=(const recursive_directory_iterator& __rhs) noexcept;
-    recursive_directory_iterator&
-      operator=(recursive_directory_iterator&& __rhs) noexcept;
-
-    recursive_directory_iterator& operator++();
-    recursive_directory_iterator& increment(error_code& __ec) noexcept;
-
-    recursive_directory_iterator operator++(int)
-    {
-      auto __tmp = *this;
-      ++*this;
-      return __tmp;
-    }
-
-    void pop();
-
-    void disable_recursion_pending() { _M_pending = false; }
-
-  private:
-    recursive_directory_iterator(const path&, directory_options, error_code*);
-
-    friend bool
-    operator==(const recursive_directory_iterator& __lhs,
-               const recursive_directory_iterator& __rhs);
-
-    struct _Dir_stack;
-    std::shared_ptr<_Dir_stack> _M_dirs;
-    directory_options _M_options;
-    bool _M_pending;
-  };
-
-  inline recursive_directory_iterator
-  begin(recursive_directory_iterator __iter) { return __iter; }
-
-  inline recursive_directory_iterator
-  end(recursive_directory_iterator) { return recursive_directory_iterator(); }
-
-  inline bool
-  operator==(const recursive_directory_iterator& __lhs,
-             const recursive_directory_iterator& __rhs)
-  {
-    return !__rhs._M_dirs.owner_before(__lhs._M_dirs)
-      && !__lhs._M_dirs.owner_before(__rhs._M_dirs);
-  }
-
-  inline bool
-  operator!=(const recursive_directory_iterator& __lhs,
-             const recursive_directory_iterator& __rhs)
-  { return !(__lhs == __rhs); }
-
-_GLIBCXX_END_NAMESPACE_CXX11
-
-  // @} group filesystem
-_GLIBCXX_END_NAMESPACE_VERSION
-} // namespace v1
-} // namespace filesystem
-} // namespace experimental
-} // namespace std
-
-#endif // C++11
-
-#endif // _GLIBCXX_EXPERIMENTAL_FS_DIR_H
diff --git a/libstdc++-v3/include/experimental/fs_fwd.h b/libstdc++-v3/include/experimental/fs_fwd.h
deleted file mode 100644
index a5ed2c5..0000000
--- a/libstdc++-v3/include/experimental/fs_fwd.h
+++ /dev/null
@@ -1,289 +0,0 @@
-// Filesystem declarations -*- C++ -*-
-
-// Copyright (C) 2014-2015 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library.  This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 3, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-
-// Under Section 7 of GPL version 3, you are granted additional
-// permissions described in the GCC Runtime Library Exception, version
-// 3.1, as published by the Free Software Foundation.
-
-// You should have received a copy of the GNU General Public License and
-// a copy of the GCC Runtime Library Exception along with this program;
-// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-// <http://www.gnu.org/licenses/>.
-
-/** @file experimental/filesystem
- *  This is a TS C++ Library header.
- */
-
-#ifndef _GLIBCXX_EXPERIMENTAL_FS_FWD_H
-#define _GLIBCXX_EXPERIMENTAL_FS_FWD_H 1
-
-#if __cplusplus < 201103L
-# include <bits/c++0x_warning.h>
-#else
-
-#include <system_error>
-#include <cstdint>
-#include <chrono>
-
-namespace std _GLIBCXX_VISIBILITY(default)
-{
-namespace experimental
-{
-namespace filesystem
-{
-inline namespace v1
-{
-_GLIBCXX_BEGIN_NAMESPACE_VERSION
-
-#if _GLIBCXX_USE_CXX11_ABI
-  inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { }
-#endif
-
-  /**
-   * @defgroup filesystem
-   * @ingroup experimental
-   *
-   * Utilities for performing operations on file systems and their components,
-   * such as paths, regular files, and directories.
-   *
-   * @{
-   */
-
-  class file_status;
-_GLIBCXX_BEGIN_NAMESPACE_CXX11
-  class path;
-  class filesystem_error;
-  class directory_entry;
-  class directory_iterator;
-  class recursive_directory_iterator;
-_GLIBCXX_END_NAMESPACE_CXX11
-
-  struct space_info
-  {
-    uintmax_t capacity;
-    uintmax_t free;
-    uintmax_t available;
-  };
-
-  enum class file_type : signed char {
-      none = 0, not_found = -1, regular = 1, directory = 2, symlink = 3,
-      block = 4, character = 5, fifo = 6, socket = 7, unknown = 8
-  };
-
-  /// Bitmask type
-  enum class copy_options : unsigned short {
-      none = 0,
-      skip_existing = 1, overwrite_existing = 2, update_existing = 4,
-      recursive = 8,
-      copy_symlinks = 16, skip_symlinks = 32,
-      directories_only = 64, create_symlinks = 128, create_hard_links = 256
-  };
-
-  constexpr copy_options
-  operator&(copy_options __x, copy_options __y)
-  {
-    using __utype = typename std::underlying_type<copy_options>::type;
-    return static_cast<copy_options>(
-	static_cast<__utype>(__x) & static_cast<__utype>(__y));
-  }
-
-  constexpr copy_options
-  operator|(copy_options __x, copy_options __y)
-  {
-    using __utype = typename std::underlying_type<copy_options>::type;
-    return static_cast<copy_options>(
-	static_cast<__utype>(__x) | static_cast<__utype>(__y));
-  }
-
-  constexpr copy_options
-  operator^(copy_options __x, copy_options __y)
-  {
-    using __utype = typename std::underlying_type<copy_options>::type;
-    return static_cast<copy_options>(
-	static_cast<__utype>(__x) ^ static_cast<__utype>(__y));
-  }
-
-  constexpr copy_options
-  operator~(copy_options __x)
-  {
-    using __utype = typename std::underlying_type<copy_options>::type;
-    return static_cast<copy_options>(~static_cast<__utype>(__x));
-  }
-
-  inline copy_options&
-  operator&=(copy_options& __x, copy_options __y)
-  { return __x = __x & __y; }
-
-  inline copy_options&
-  operator|=(copy_options& __x, copy_options __y)
-  { return __x = __x | __y; }
-
-  inline copy_options&
-  operator^=(copy_options& __x, copy_options __y)
-  { return __x = __x ^ __y; }
-
-
-  /// Bitmask type
-  enum class perms : unsigned {
-      none		=  0,
-      owner_read	=  0400,
-      owner_write	=  0200,
-      owner_exec	=  0100,
-      owner_all		=  0700,
-      group_read	=   040,
-      group_write	=   020,
-      group_exec	=   010,
-      group_all		=   070,
-      others_read	=    04,
-      others_write	=    02,
-      others_exec	=    01,
-      others_all	=    07,
-      all		=  0777,
-      set_uid		= 04000,
-      set_gid		= 02000,
-      sticky_bit	= 01000,
-      mask		= 07777,
-      unknown		=  0xFFFF,
-      add_perms		= 0x10000,
-      remove_perms	= 0x20000,
-      resolve_symlinks	= 0x40000
-  };
-
-  constexpr perms
-  operator&(perms __x, perms __y)
-  {
-    using __utype = typename std::underlying_type<perms>::type;
-    return static_cast<perms>(
-	static_cast<__utype>(__x) & static_cast<__utype>(__y));
-  }
-
-  constexpr perms
-  operator|(perms __x, perms __y)
-  {
-    using __utype = typename std::underlying_type<perms>::type;
-    return static_cast<perms>(
-	static_cast<__utype>(__x) | static_cast<__utype>(__y));
-  }
-
-  constexpr perms
-  operator^(perms __x, perms __y)
-  {
-    using __utype = typename std::underlying_type<perms>::type;
-    return static_cast<perms>(
-	static_cast<__utype>(__x) ^ static_cast<__utype>(__y));
-  }
-
-  constexpr perms
-  operator~(perms __x)
-  {
-    using __utype = typename std::underlying_type<perms>::type;
-    return static_cast<perms>(~static_cast<__utype>(__x));
-  }
-
-  inline perms&
-  operator&=(perms& __x, perms __y)
-  { return __x = __x & __y; }
-
-  inline perms&
-  operator|=(perms& __x, perms __y)
-  { return __x = __x | __y; }
-
-  inline perms&
-  operator^=(perms& __x, perms __y)
-  { return __x = __x ^ __y; }
-
-  // Bitmask type
-  enum class directory_options : unsigned char {
-      none = 0, follow_directory_symlink = 1, skip_permission_denied = 2
-  };
-
-  constexpr directory_options
-  operator&(directory_options __x, directory_options __y)
-  {
-    using __utype = typename std::underlying_type<directory_options>::type;
-    return static_cast<directory_options>(
-	static_cast<__utype>(__x) & static_cast<__utype>(__y));
-  }
-
-  constexpr directory_options
-  operator|(directory_options __x, directory_options __y)
-  {
-    using __utype = typename std::underlying_type<directory_options>::type;
-    return static_cast<directory_options>(
-	static_cast<__utype>(__x) | static_cast<__utype>(__y));
-  }
-
-  constexpr directory_options
-  operator^(directory_options __x, directory_options __y)
-  {
-    using __utype = typename std::underlying_type<directory_options>::type;
-    return static_cast<directory_options>(
-	static_cast<__utype>(__x) ^ static_cast<__utype>(__y));
-  }
-
-  constexpr directory_options
-  operator~(directory_options __x)
-  {
-    using __utype = typename std::underlying_type<directory_options>::type;
-    return static_cast<directory_options>(~static_cast<__utype>(__x));
-  }
-
-  inline directory_options&
-  operator&=(directory_options& __x, directory_options __y)
-  { return __x = __x & __y; }
-
-  inline directory_options&
-  operator|=(directory_options& __x, directory_options __y)
-  { return __x = __x | __y; }
-
-  inline directory_options&
-  operator^=(directory_options& __x, directory_options __y)
-  { return __x = __x ^ __y; }
-
-  typedef chrono::time_point<chrono::system_clock> file_time_type;
-
-  // operational functions
-
-  void copy(const path& __from, const path& __to, copy_options __options);
-  void copy(const path& __from, const path& __to, copy_options __options,
-	    error_code&) noexcept;
-
-  bool copy_file(const path& __from, const path& __to, copy_options __option);
-  bool copy_file(const path& __from, const path& __to, copy_options __option,
-		 error_code&) noexcept;
-
-  path current_path();
-
-  file_status status(const path&);
-  file_status status(const path&, error_code&) noexcept;
-
-  bool status_known(file_status) noexcept;
-
-  file_status symlink_status(const path&);
-  file_status symlink_status(const path&, error_code&) noexcept;
-
-  bool is_regular_file(file_status) noexcept;
-  bool is_symlink(file_status) noexcept;
-
-  // @} group filesystem
-_GLIBCXX_END_NAMESPACE_VERSION
-} // namespace v1
-} // namespace filesystem
-} // namespace experimental
-} // namespace std
-
-#endif // C++11
-
-#endif // _GLIBCXX_EXPERIMENTAL_FS_FWD_H
diff --git a/libstdc++-v3/include/experimental/fs_ops.h b/libstdc++-v3/include/experimental/fs_ops.h
deleted file mode 100644
index 6b7d470..0000000
--- a/libstdc++-v3/include/experimental/fs_ops.h
+++ /dev/null
@@ -1,291 +0,0 @@
-// Filesystem operational functions -*- C++ -*-
-
-// Copyright (C) 2014-2015 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library.  This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 3, or (at your __option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-
-// Under Section 7 of GPL version 3, you are granted additional
-// permissions described in the GCC Runtime Library Exception, version
-// 3.1, as published by the Free Software Foundation.
-
-// You should have received a copy of the GNU General Public License and
-// a copy of the GCC Runtime Library Exception along with this program;
-// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-// <http://www.gnu.org/licenses/>.
-
-/** @file experimental/filesystem
- *  This is a TS C++ Library header.
- */
-
-#ifndef _GLIBCXX_EXPERIMENTAL_FS_OPS_H
-#define _GLIBCXX_EXPERIMENTAL_FS_OPS_H 1
-
-#if __cplusplus < 201103L
-# include <bits/c++0x_warning.h>
-#else
-
-#include <cstdint>
-
-namespace std _GLIBCXX_VISIBILITY(default)
-{
-namespace experimental
-{
-namespace filesystem
-{
-inline namespace v1
-{
-_GLIBCXX_BEGIN_NAMESPACE_VERSION
-
-  /**
-   * @ingroup filesystem
-   * @{
-   */
-
-  path absolute(const path& __p, const path& __base = current_path());
-
-  path canonical(const path& __p, const path& __base = current_path());
-  path canonical(const path& __p, error_code& __ec);
-  path canonical(const path& __p, const path& __base, error_code& __ec);
-
-  inline void
-  copy(const path& __from, const path& __to)
-  { copy(__from, __to, copy_options::none); }
-
-  inline void
-  copy(const path& __from, const path& __to, error_code& __ec) noexcept
-  { copy(__from, __to, copy_options::none, __ec); }
-
-  void copy(const path& __from, const path& __to, copy_options __options);
-  void copy(const path& __from, const path& __to, copy_options __options,
-	    error_code& __ec) noexcept;
-
-  inline bool
-  copy_file(const path& __from, const path& __to)
-  { return copy_file(__from, __to, copy_options::none); }
-
-  inline bool
-  copy_file(const path& __from, const path& __to, error_code& __ec) noexcept
-  { return copy_file(__from, __to, copy_options::none, __ec); }
-
-  bool copy_file(const path& __from, const path& __to, copy_options __option);
-  bool copy_file(const path& __from, const path& __to, copy_options __option,
-		 error_code& __ec) noexcept;
-
-  void copy_symlink(const path& __existing_symlink, const path& __new_symlink);
-  void copy_symlink(const path& __existing_symlink, const path& __new_symlink,
-		    error_code& __ec) noexcept;
-
-  bool create_directories(const path& __p);
-  bool create_directories(const path& __p, error_code& __ec) noexcept;
-
-  bool create_directory(const path& __p);
-  bool create_directory(const path& __p, error_code& __ec) noexcept;
-
-  bool create_directory(const path& __p, const path& attributes);
-  bool create_directory(const path& __p, const path& attributes,
-			error_code& __ec) noexcept;
-
-  void create_directory_symlink(const path& __to, const path& __new_symlink);
-  void create_directory_symlink(const path& __to, const path& __new_symlink,
-				error_code& __ec) noexcept;
-
-  void create_hard_link(const path& __to, const path& __new_hard_link);
-  void create_hard_link(const path& __to, const path& __new_hard_link,
-			error_code& __ec) noexcept;
-
-  void create_symlink(const path& __to, const path& __new_symlink);
-  void create_symlink(const path& __to, const path& __new_symlink,
-		      error_code& __ec) noexcept;
-
-  path current_path();
-  path current_path(error_code& __ec);
-  void current_path(const path& __p);
-  void current_path(const path& __p, error_code& __ec) noexcept;
-
-  inline bool
-  exists(file_status __s) noexcept
-  { return status_known(__s) && __s.type() != file_type::not_found; }
-
-  inline bool
-  exists(const path& __p)
-  { return exists(status(__p)); }
-
-  inline bool
-  exists(const path& __p, error_code& __ec) noexcept
-  { return exists(status(__p, __ec)); }
-
-  bool
-  equivalent(const path& __p1, const path& __p2);
-
-  bool
-  equivalent(const path& __p1, const path& __p2, error_code& __ec) noexcept;
-
-  uintmax_t file_size(const path& __p);
-  uintmax_t file_size(const path& __p, error_code& __ec) noexcept;
-
-  uintmax_t hard_link_count(const path& __p);
-  uintmax_t hard_link_count(const path& __p, error_code& __ec) noexcept;
-
-  inline bool
-  is_block_file(file_status __s) noexcept
-  { return __s.type() == file_type::block; }
-
-  inline bool
-  is_block_file(const path& __p)
-  { return is_block_file(status(__p)); }
-
-  inline bool
-  is_block_file(const path& __p, error_code& __ec) noexcept
-  { return is_block_file(status(__p, __ec)); }
-
-  inline bool
-  is_character_file(file_status __s) noexcept
-  { return __s.type() == file_type::character; }
-
-  inline bool
-  is_character_file(const path& __p)
-  { return is_character_file(status(__p)); }
-
-  inline bool
-  is_character_file(const path& __p, error_code& __ec) noexcept
-  { return is_character_file(status(__p, __ec)); }
-
-  inline bool
-  is_directory(file_status __s) noexcept
-  { return __s.type() == file_type::directory; }
-
-  inline bool
-  is_directory(const path& __p)
-  { return is_directory(status(__p)); }
-
-  inline bool
-  is_directory(const path& __p, error_code& __ec) noexcept
-  { return is_directory(status(__p, __ec)); }
-
-  bool is_empty(const path& __p);
-  bool is_empty(const path& __p, error_code& __ec) noexcept;
-
-  inline bool
-  is_fifo(file_status __s) noexcept
-  { return __s.type() == file_type::fifo; }
-
-  inline bool
-  is_fifo(const path& __p)
-  { return is_fifo(status(__p)); }
-
-  inline bool
-  is_fifo(const path& __p, error_code& __ec) noexcept
-  { return is_fifo(status(__p, __ec)); }
-
-  inline bool
-  is_other(file_status __s) noexcept
-  {
-    return exists(__s) && !is_regular_file(__s) && !is_directory(__s)
-      && !is_symlink(__s);
-  }
-
-  inline bool
-  is_other(const path& __p)
-  { return is_other(status(__p)); }
-
-  inline bool
-  is_other(const path& __p, error_code& __ec) noexcept
-  { return is_other(status(__p, __ec)); }
-
-  inline bool
-  is_regular_file(file_status __s) noexcept
-  { return __s.type() == file_type::regular; }
-
-  inline bool
-  is_regular_file(const path& __p)
-  { return is_regular_file(status(__p)); }
-
-  inline bool
-  is_regular_file(const path& __p, error_code& __ec) noexcept
-  { return is_regular_file(status(__p, __ec)); }
-
-  inline bool
-  is_socket(file_status __s) noexcept
-  { return __s.type() == file_type::socket; }
-
-  inline bool
-  is_socket(const path& __p)
-  { return is_socket(status(__p)); }
-
-  inline bool
-  is_socket(const path& __p, error_code& __ec) noexcept
-  { return is_socket(status(__p, __ec)); }
-
-  inline bool
-  is_symlink(file_status __s) noexcept
-  { return __s.type() == file_type::symlink; }
-
-  inline bool
-  is_symlink(const path& __p)
-  { return is_symlink(symlink_status(__p)); }
-
-  inline bool
-  is_symlink(const path& __p, error_code& __ec) noexcept
-  { return is_symlink(symlink_status(__p, __ec)); }
-
-  file_time_type  last_write_time(const path& __p);
-  file_time_type  last_write_time(const path& __p, error_code& __ec) noexcept;
-  void last_write_time(const path& __p, file_time_type __new_time);
-  void last_write_time(const path& __p, file_time_type __new_time,
-		       error_code& __ec) noexcept;
-
-  void permissions(const path& __p, perms __prms);
-  void permissions(const path& __p, perms __prms, error_code& __ec) noexcept;
-
-  path read_symlink(const path& __p);
-  path read_symlink(const path& __p, error_code& __ec);
-
-  bool remove(const path& __p);
-  bool remove(const path& __p, error_code& __ec) noexcept;
-
-  uintmax_t remove_all(const path& __p);
-  uintmax_t remove_all(const path& __p, error_code& __ec) noexcept;
-
-  void rename(const path& __from, const path& __to);
-  void rename(const path& __from, const path& __to, error_code& __ec) noexcept;
-
-  void resize_file(const path& __p, uintmax_t __size);
-  void resize_file(const path& __p, uintmax_t __size, error_code& __ec) noexcept;
-
-  space_info space(const path& __p);
-  space_info space(const path& __p, error_code& __ec) noexcept;
-
-  file_status status(const path& __p);
-  file_status status(const path& __p, error_code& __ec) noexcept;
-
-  inline bool status_known(file_status __s) noexcept
-  { return __s.type() != file_type::none; }
-
-  file_status symlink_status(const path& __p);
-  file_status symlink_status(const path& __p, error_code& __ec) noexcept;
-
-  path system_complete(const path& __p);
-  path system_complete(const path& __p, error_code& __ec);
-
-  path temp_directory_path();
-  path temp_directory_path(error_code& __ec);
-
-  // @} group filesystem
-_GLIBCXX_END_NAMESPACE_VERSION
-} // namespace v1
-} // namespace filesystem
-} // namespace experimental
-} // namespace std
-
-#endif // C++11
-
-#endif // _GLIBCXX_EXPERIMENTAL_FS_OPS_H
diff --git a/libstdc++-v3/include/experimental/fs_path.h b/libstdc++-v3/include/experimental/fs_path.h
deleted file mode 100644
index 40462a6..0000000
--- a/libstdc++-v3/include/experimental/fs_path.h
+++ /dev/null
@@ -1,1024 +0,0 @@
-// Class filesystem::path -*- C++ -*-
-
-// Copyright (C) 2014-2015 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library.  This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 3, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-
-// Under Section 7 of GPL version 3, you are granted additional
-// permissions described in the GCC Runtime Library Exception, version
-// 3.1, as published by the Free Software Foundation.
-
-// You should have received a copy of the GNU General Public License and
-// a copy of the GCC Runtime Library Exception along with this program;
-// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-// <http://www.gnu.org/licenses/>.
-
-/** @file experimental/fs_path.h
- *  This is an internal header file, included by other library headers.
- *  Do not attempt to use it directly. @headername{experimental/filesystem}
- */
-
-#ifndef _GLIBCXX_EXPERIMENTAL_FS_PATH_H
-#define _GLIBCXX_EXPERIMENTAL_FS_PATH_H 1
-
-#if __cplusplus < 201103L
-# include <bits/c++0x_warning.h>
-#else
-
-#include <utility>
-#include <type_traits>
-#include <vector>
-#include <locale>
-#include <iosfwd>
-#include <codecvt>
-#include <system_error>
-#include <bits/stl_algobase.h>
-#include <bits/quoted_string.h>
-#include <bits/locale_conv.h>
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
-# define _GLIBCXX_FILESYSTEM_IS_WINDOWS 1
-# include <algorithm>
-#endif
-
-namespace std _GLIBCXX_VISIBILITY(default)
-{
-namespace experimental
-{
-namespace filesystem
-{
-inline namespace v1
-{
-_GLIBCXX_BEGIN_NAMESPACE_VERSION
-_GLIBCXX_BEGIN_NAMESPACE_CXX11
-
-  /**
-   * @ingroup filesystem
-   * @{
-   */
-
-  /// A filesystem path.
-  class path
-  {
-    template<typename _CharT>
-      struct __is_encoded_char : std::false_type { };
-
-    template<typename _Iter,
-	     typename _Iter_traits = std::iterator_traits<_Iter>>
-      using __is_path_iter_src
-	= __and_<__is_encoded_char<typename _Iter_traits::value_type>,
-		 std::is_base_of<std::input_iterator_tag,
-				 typename _Iter_traits::iterator_category>>;
-
-    template<typename _Iter>
-      static __is_path_iter_src<_Iter>
-      __is_path_src(_Iter, int);
-
-    template<typename _CharT, typename _Traits, typename _Alloc>
-      static __is_encoded_char<_CharT>
-      __is_path_src(const basic_string<_CharT, _Traits, _Alloc>&, int);
-
-    template<typename _Unknown>
-      static std::false_type
-      __is_path_src(const _Unknown&, ...);
-
-    template<typename _Tp1, typename _Tp2>
-      struct __constructible_from;
-
-    template<typename _Iter>
-      struct __constructible_from<_Iter, _Iter>
-      : __is_path_iter_src<_Iter>
-      { };
-
-    template<typename _Source>
-      struct __constructible_from<_Source, void>
-      : decltype(__is_path_src(std::declval<_Source>(), 0))
-      { };
-
-    template<typename _Tp1, typename _Tp2 = void>
-      using _Path = typename
-	std::enable_if<__and_<__not_<is_same<_Tp1, path>>,
-			      __constructible_from<_Tp1, _Tp2>>::value,
-		       path>::type;
-
-    template<typename _Source>
-      static _Source
-      _S_range_begin(_Source __begin) { return __begin; }
-
-    struct __null_terminated { };
-
-    template<typename _Source>
-      static __null_terminated
-      _S_range_end(_Source) { return {}; }
-
-    template<typename _CharT, typename _Traits, typename _Alloc>
-      static const _CharT*
-      _S_range_begin(const basic_string<_CharT, _Traits, _Alloc>& __str)
-      { return __str.data(); }
-
-    template<typename _CharT, typename _Traits, typename _Alloc>
-      static const _CharT*
-      _S_range_end(const basic_string<_CharT, _Traits, _Alloc>& __str)
-      { return __str.data() + __str.size(); }
-
-    template<typename _Tp,
-	     typename _Iter = decltype(_S_range_begin(std::declval<_Tp>())),
-	     typename _Val = typename std::iterator_traits<_Iter>::value_type>
-      using __value_type_is_char
-	= typename std::enable_if<std::is_same<_Val, char>::value>::type;
-
-  public:
-#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
-    typedef wchar_t				value_type;
-    static constexpr value_type			preferred_separator = L'\\';
-#else
-    typedef char				value_type;
-    static constexpr value_type			preferred_separator = '/';
-#endif
-    typedef std::basic_string<value_type>	string_type;
-
-    // constructors and destructor
-
-    path() noexcept { }
-
-    path(const path& __p) = default;
-
-    path(path&& __p) noexcept
-    : _M_pathname(std::move(__p._M_pathname)), _M_type(__p._M_type)
-    {
-      _M_split_cmpts();
-      __p.clear();
-    }
-
-    template<typename _Source,
-	     typename _Require = _Path<_Source>>
-      path(_Source const& __source)
-      : _M_pathname(_S_convert(_S_range_begin(__source),
-			       _S_range_end(__source)))
-      { _M_split_cmpts(); }
-
-    template<typename _InputIterator,
-	     typename _Require = _Path<_InputIterator, _InputIterator>>
-      path(_InputIterator __first, _InputIterator __last)
-      : _M_pathname(_S_convert(__first, __last))
-      { _M_split_cmpts(); }
-
-    template<typename _Source,
-	     typename _Require = _Path<_Source>,
-	     typename _Require2 = __value_type_is_char<_Source>>
-      path(_Source const& __source, const locale& __loc)
-      : _M_pathname(_S_convert_loc(_S_range_begin(__source),
-				   _S_range_end(__source), __loc))
-      { _M_split_cmpts(); }
-
-    template<typename _InputIterator,
-	     typename _Require = _Path<_InputIterator, _InputIterator>,
-	     typename _Require2 = __value_type_is_char<_InputIterator>>
-      path(_InputIterator __first, _InputIterator __last, const locale& __loc)
-      : _M_pathname(_S_convert_loc(__first, __last, __loc))
-      { _M_split_cmpts(); }
-
-    ~path() = default;
-
-    // assignments
-
-    path& operator=(const path& __p) = default;
-    path& operator=(path&& __p) noexcept;
-
-    template<typename _Source>
-      _Path<_Source>&
-      operator=(_Source const& __source)
-      { return *this = path(__source); }
-
-    template<typename _Source>
-      _Path<_Source>&
-      assign(_Source const& __source)
-      { return *this = path(__source); }
-
-    template<typename _InputIterator>
-      _Path<_InputIterator, _InputIterator>&
-      assign(_InputIterator __first, _InputIterator __last)
-      { return *this = path(__first, __last); }
-
-    // appends
-
-    path& operator/=(const path& __p) { return _M_append(__p._M_pathname); }
-
-    template <class _Source>
-      _Path<_Source>&
-      operator/=(_Source const& __source)
-      { return append(__source); }
-
-    template<typename _Source>
-      _Path<_Source>&
-      append(_Source const& __source)
-      {
-	return _M_append(_S_convert(_S_range_begin(__source),
-				    _S_range_end(__source)));
-      }
-
-    template<typename _InputIterator>
-      _Path<_InputIterator, _InputIterator>&
-      append(_InputIterator __first, _InputIterator __last)
-      { return _M_append(_S_convert(__first, __last)); }
-
-    // concatenation
-
-    path& operator+=(const path& __x);
-    path& operator+=(const string_type& __x);
-    path& operator+=(const value_type* __x);
-    path& operator+=(value_type __x);
-
-    template<typename _Source>
-      _Path<_Source>&
-      operator+=(_Source const& __x) { return concat(__x); }
-
-    template<typename _CharT>
-      _Path<_CharT*, _CharT*>&
-      operator+=(_CharT __x);
-
-    template<typename _Source>
-      _Path<_Source>&
-      concat(_Source const& __x)
-      { return *this += _S_convert(_S_range_begin(__x), _S_range_end(__x)); }
-
-    template<typename _InputIterator>
-      _Path<_InputIterator, _InputIterator>&
-      concat(_InputIterator __first, _InputIterator __last)
-      { return *this += _S_convert(__first, __last); }
-
-    // modifiers
-
-    void clear() noexcept { _M_pathname.clear(); _M_split_cmpts(); }
-
-    path& make_preferred();
-    path& remove_filename();
-    path& replace_filename(const path& __replacement);
-    path& replace_extension(const path& __replacement = path());
-
-    void swap(path& __rhs) noexcept;
-
-    // native format observers
-
-    const string_type&  native() const noexcept { return _M_pathname; }
-    const value_type*   c_str() const noexcept { return _M_pathname.c_str(); }
-    operator string_type() const { return _M_pathname; }
-
-    template<typename _CharT, typename _Traits = std::char_traits<_CharT>,
-	     typename _Allocator = std::allocator<_CharT>>
-      std::basic_string<_CharT, _Traits, _Allocator>
-      string(const _Allocator& __a = _Allocator()) const;
-
-    std::string    string() const;
-#if _GLIBCXX_USE_WCHAR_T
-    std::wstring   wstring() const;
-#endif
-    std::string    u8string() const;
-    std::u16string u16string() const;
-    std::u32string u32string() const;
-
-    // generic format observers
-    template<typename _CharT, typename _Traits = std::char_traits<_CharT>,
-	     typename _Allocator = std::allocator<_CharT>>
-      std::basic_string<_CharT, _Traits, _Allocator>
-      generic_string(const _Allocator& __a = _Allocator()) const;
-
-    std::string    generic_string() const;
-#if _GLIBCXX_USE_WCHAR_T
-    std::wstring   generic_wstring() const;
-#endif
-    std::string    generic_u8string() const;
-    std::u16string generic_u16string() const;
-    std::u32string generic_u32string() const;
-
-    // compare
-
-    int compare(const path& __p) const noexcept;
-    int compare(const string_type& __s) const;
-    int compare(const value_type* __s) const;
-
-    // decomposition
-
-    path root_name() const;
-    path root_directory() const;
-    path root_path() const;
-    path relative_path() const;
-    path parent_path() const;
-    path filename() const;
-    path stem() const;
-    path extension() const;
-
-    // query
-
-    bool empty() const noexcept { return _M_pathname.empty(); }
-    bool has_root_name() const;
-    bool has_root_directory() const;
-    bool has_root_path() const;
-    bool has_relative_path() const;
-    bool has_parent_path() const;
-    bool has_filename() const;
-    bool has_stem() const;
-    bool has_extension() const;
-    bool is_absolute() const;
-    bool is_relative() const { return !is_absolute(); }
-
-    // iterators
-    class iterator;
-    typedef iterator const_iterator;
-
-    iterator begin() const;
-    iterator end() const;
-
-  private:
-    enum class _Type : unsigned char {
-	_Multi, _Root_name, _Root_dir, _Filename
-    };
-
-    path(string_type __str, _Type __type) : _M_pathname(__str), _M_type(__type)
-    {
-      __glibcxx_assert(!empty());
-      __glibcxx_assert(_M_type != _Type::_Multi);
-    }
-
-    enum class _Split { _Stem, _Extension };
-
-    path& _M_append(const string_type& __str)
-    {
-      if (!_M_pathname.empty() && !_S_is_dir_sep(_M_pathname.back())
-	  && !__str.empty() && !_S_is_dir_sep(__str.front()))
-	_M_pathname += preferred_separator;
-      _M_pathname += __str;
-      _M_split_cmpts();
-      return *this;
-    }
-
-    pair<const string_type*, size_t> _M_find_extension() const;
-
-    template<typename _CharT>
-      struct _Cvt;
-
-    static string_type
-    _S_convert(value_type* __src, __null_terminated)
-    { return string_type(__src); }
-
-    static string_type
-    _S_convert(const value_type* __src, __null_terminated)
-    { return string_type(__src); }
-
-    template<typename _Iter>
-      static string_type
-      _S_convert(_Iter __first, _Iter __last)
-      {
-	using __value_type = typename std::iterator_traits<_Iter>::value_type;
-	return _Cvt<__value_type>::_S_convert(__first, __last);
-      }
-
-    template<typename _InputIterator>
-      static string_type
-      _S_convert(_InputIterator __src, __null_terminated)
-      {
-	using _Tp = typename std::iterator_traits<_InputIterator>::value_type;
-	std::basic_string<_Tp> __tmp;
-	while (*__src != _Tp{})
-	  __tmp.push_back(*__src++);
-	return _S_convert(__tmp.data(), __tmp.data() + __tmp.size());
-      }
-
-    static string_type
-    _S_convert_loc(const char* __first, const char* __last,
-		   const std::locale& __loc);
-
-    template<typename _Iter>
-      static string_type
-      _S_convert_loc(_Iter __first, _Iter __last, const std::locale& __loc)
-      {
-	const std::string __str(__first, __last);
-	return _S_convert_loc(__str.data(), __str.data()+__str.size(), __loc);
-      }
-
-    template<typename _InputIterator>
-      static string_type
-      _S_convert_loc(_InputIterator __src, __null_terminated,
-		     const std::locale& __loc)
-      {
-	std::string __tmp;
-	while (*__src != '\0')
-	  __tmp.push_back(*__src++);
-	return _S_convert_loc(__tmp.data(), __tmp.data()+__tmp.size(), __loc);
-      }
-
-    bool _S_is_dir_sep(value_type __ch)
-    {
-#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
-      return __ch == L'/' || __ch == preferred_separator;
-#else
-      return __ch == '/';
-#endif
-    }
-
-    void _M_split_cmpts();
-    void _M_trim();
-    void _M_add_root_name(size_t __n);
-    void _M_add_root_dir(size_t __pos);
-    void _M_add_filename(size_t __pos, size_t __n);
-
-    string_type _M_pathname;
-
-    struct _Cmpt;
-    using _List = _GLIBCXX_STD_C::vector<_Cmpt>;
-    _List _M_cmpts; // empty unless _M_type == _Type::_Multi
-    _Type _M_type = _Type::_Multi;
-  };
-
-  inline void swap(path& __lhs, path& __rhs) noexcept { __lhs.swap(__rhs); }
-
-  size_t hash_value(const path& __p) noexcept;
-
-  /// Compare paths
-  inline bool operator<(const path& __lhs, const path& __rhs) noexcept
-  { return __lhs.compare(__rhs) < 0; }
-
-  /// Compare paths
-  inline bool operator<=(const path& __lhs, const path& __rhs) noexcept
-  { return !(__rhs < __lhs); }
-
-  /// Compare paths
-  inline bool operator>(const path& __lhs, const path& __rhs) noexcept
-  { return __rhs < __lhs; }
-
-  /// Compare paths
-  inline bool operator>=(const path& __lhs, const path& __rhs) noexcept
-  { return !(__lhs < __rhs); }
-
-  /// Compare paths
-  inline bool operator==(const path& __lhs, const path& __rhs) noexcept
-  { return __lhs.compare(__rhs) == 0; }
-
-  /// Compare paths
-  inline bool operator!=(const path& __lhs, const path& __rhs) noexcept
-  { return !(__lhs == __rhs); }
-
-  /// Append one path to another
-  inline path operator/(const path& __lhs, const path& __rhs)
-  { return path(__lhs) /= __rhs; }
-
-  /// Write a path to a stream
-  template<typename _CharT, typename _Traits>
-    basic_ostream<_CharT, _Traits>&
-    operator<<(basic_ostream<_CharT, _Traits>& __os, const path& __p)
-    {
-      auto __tmp = __p.string<_CharT, _Traits>();
-      using __quoted_string
-	= std::__detail::_Quoted_string<decltype(__tmp)&, _CharT>;
-      __os << __quoted_string{__tmp, '"', '\\'};
-      return __os;
-    }
-
-  /// Read a path from a stream
-  template<typename _CharT, typename _Traits>
-    basic_istream<_CharT, _Traits>&
-    operator>>(basic_istream<_CharT, _Traits>& __is, path& __p)
-    {
-      basic_string<_CharT, _Traits> __tmp;
-      using __quoted_string
-	= std::__detail::_Quoted_string<decltype(__tmp)&, _CharT>;
-      if (__is >> __quoted_string{ __tmp, '"', '\\' })
-	__p = std::move(__tmp);
-      return __is;
-    }
-
-  // TODO constrain with _Path<Source> and __value_type_is_char
-  template<typename _Source>
-    inline path
-    u8path(const _Source& __source)
-    {
-#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
-      return path{ path::string_type{__source} };
-#else
-      return path{ __source };
-#endif
-    }
-
-  // TODO constrain with _Path<InputIterator, InputIterator> and __value_type_is_char
-  template<typename _InputIterator>
-    inline path
-    u8path(_InputIterator __first, _InputIterator __last)
-    {
-#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
-      return path{ path::string_type{__first, __last} };
-#else
-      return path{ __first, __last };
-#endif
-    }
-
-  class filesystem_error : public std::system_error
-  {
-  public:
-    filesystem_error(const string& __what_arg, error_code __ec)
-    : system_error(__ec, __what_arg) { }
-
-    filesystem_error(const string& __what_arg, const path& __p1,
-		     error_code __ec)
-    : system_error(__ec, __what_arg), _M_path1(__p1) { }
-
-    filesystem_error(const string& __what_arg, const path& __p1,
-		     const path& __p2, error_code __ec)
-    : system_error(__ec, __what_arg), _M_path1(__p1), _M_path2(__p2)
-    { }
-
-    ~filesystem_error();
-
-    const path& path1() const noexcept { return _M_path1; }
-    const path& path2() const noexcept { return _M_path2; }
-    const char* what() const noexcept { return _M_what.c_str(); }
-
-  private:
-    std::string _M_gen_what();
-
-    path _M_path1;
-    path _M_path2;
-    std::string _M_what = _M_gen_what();
-  };
-
-  struct path::_Cmpt : path
-  {
-    _Cmpt(string_type __s, _Type __t, size_t __pos)
-      : path(std::move(__s), __t), _M_pos(__pos) { }
-
-    _Cmpt() : _M_pos(-1) { }
-
-    size_t _M_pos;
-  };
-
-  template<>
-    struct path::__is_encoded_char<char> : std::true_type
-    { using value_type = char; };
-
-  template<>
-    struct path::__is_encoded_char<wchar_t> : std::true_type
-    { using value_type = wchar_t; };
-
-  template<>
-    struct path::__is_encoded_char<char16_t> : std::true_type
-    { using value_type = char16_t; };
-
-  template<>
-    struct path::__is_encoded_char<char32_t> : std::true_type
-    { using value_type = char32_t; };
-
-  // specialize _Cvt for degenerate 'noconv' case
-  template<>
-    struct path::_Cvt<path::value_type>
-    {
-      template<typename _Iter>
-	static string_type
-	_S_convert(_Iter __first, _Iter __last)
-	{ return string_type{__first, __last}; }
-    };
-
-  template<typename _CharT>
-    struct path::_Cvt
-    {
-#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
-      static string_type
-      _S_wconvert(const char* __f, const char* __l, true_type)
-      {
-	using _Cvt = std::codecvt<wchar_t, char, mbstate_t>;
-	const auto& __cvt = std::use_facet<_Cvt>(std::locale{});
-	std::wstring __wstr;
-	if (__str_codecvt_in(__f, __l, __wstr, __cvt))
-	    return __wstr;
-	_GLIBCXX_THROW_OR_ABORT(filesystem_error(
-	      "Cannot convert character sequence",
-	      std::make_error_code(errc::illegal_byte_sequence)));
-      }
-
-      static string_type
-      _S_wconvert(const _CharT* __f, const _CharT* __l, false_type)
-      {
-	std::codecvt_utf8<_CharT> __cvt;
-	std::string __str;
-	if (__str_codecvt_out(__f, __l, __str, __cvt))
-	  {
-	    const char* __f2 = __str.data();
-	    const char* __l2 = __f2 + __str.size();
-	    std::codecvt_utf8<wchar_t> __wcvt;
-	    std::wstring __wstr;
-	    if (__str_codecvt_in(__f2, __l2, __wstr, __wcvt))
-	      return __wstr;
-	  }
-	_GLIBCXX_THROW_OR_ABORT(filesystem_error(
-	      "Cannot convert character sequence",
-	      std::make_error_code(errc::illegal_byte_sequence)));
-      }
-
-      static string_type
-      _S_convert(const _CharT* __f, const _CharT* __l)
-      {
-	return _S_wconvert(__f, __l, is_same<_CharT, char>{});
-      }
-#else
-      static string_type
-      _S_convert(const _CharT* __f, const _CharT* __l)
-      {
-	std::codecvt_utf8<_CharT> __cvt;
-	std::string __str;
-	if (__str_codecvt_out(__f, __l, __str, __cvt))
-	  return __str;
-	_GLIBCXX_THROW_OR_ABORT(filesystem_error(
-	      "Cannot convert character sequence",
-	      std::make_error_code(errc::illegal_byte_sequence)));
-      }
-#endif
-
-      static string_type
-      _S_convert(_CharT* __f, _CharT* __l)
-      {
-	return _S_convert(const_cast<const _CharT*>(__f),
-			  const_cast<const _CharT*>(__l));
-      }
-
-      template<typename _Iter>
-	static string_type
-	_S_convert(_Iter __first, _Iter __last)
-	{
-	  const std::basic_string<_CharT> __str(__first, __last);
-	  return _S_convert(__str.data(), __str.data() + __str.size());
-	}
-
-      template<typename _Iter, typename _Cont>
-	static string_type
-	_S_convert(__gnu_cxx::__normal_iterator<_Iter, _Cont> __first,
-		  __gnu_cxx::__normal_iterator<_Iter, _Cont> __last)
-	{ return _S_convert(__first.base(), __last.base()); }
-    };
-
-  /// An iterator for the components of a path
-  class path::iterator
-  {
-  public:
-    using difference_type	= std::ptrdiff_t;
-    using value_type		= path;
-    using reference		= const path&;
-    using pointer		= const path*;
-    using iterator_category	= std::bidirectional_iterator_tag;
-
-    iterator() : _M_path(nullptr), _M_cur(), _M_at_end() { }
-
-    iterator(const iterator&) = default;
-    iterator& operator=(const iterator&) = default;
-
-    reference operator*() const;
-    pointer   operator->() const { return std::__addressof(**this); }
-
-    iterator& operator++();
-    iterator  operator++(int) { auto __tmp = *this; ++_M_cur; return __tmp; }
-
-    iterator& operator--();
-    iterator  operator--(int) { auto __tmp = *this; --_M_cur; return __tmp; }
-
-    friend bool operator==(const iterator& __lhs, const iterator& __rhs)
-    { return __lhs._M_equals(__rhs); }
-
-    friend bool operator!=(const iterator& __lhs, const iterator& __rhs)
-    { return !__lhs._M_equals(__rhs); }
-
-  private:
-    friend class path;
-
-    iterator(const path* __path, path::_List::const_iterator __iter)
-    : _M_path(__path), _M_cur(__iter), _M_at_end()
-    { }
-
-    iterator(const path* __path, bool __at_end)
-    : _M_path(__path), _M_cur(), _M_at_end(__at_end)
-    { }
-
-    bool _M_equals(iterator) const;
-
-    const path* 		_M_path;
-    path::_List::const_iterator _M_cur;
-    bool			_M_at_end;  // only used when type != _Multi
-  };
-
-
-  inline path&
-  path::operator=(path&& __p) noexcept
-  {
-    _M_pathname = std::move(__p._M_pathname);
-    _M_cmpts = std::move(__p._M_cmpts);
-    _M_type = __p._M_type;
-    __p.clear();
-    return *this;
-  }
-
-  inline path&
-  path::operator+=(const path& __p)
-  {
-    return operator+=(__p.native());
-  }
-
-  inline path&
-  path::operator+=(const string_type& __x)
-  {
-    _M_pathname += __x;
-    _M_split_cmpts();
-    return *this;
-  }
-
-  inline path&
-  path::operator+=(const value_type* __x)
-  {
-    _M_pathname += __x;
-    _M_split_cmpts();
-    return *this;
-  }
-
-  inline path&
-  path::operator+=(value_type __x)
-  {
-    _M_pathname += __x;
-    _M_split_cmpts();
-    return *this;
-  }
-
-  template<typename _CharT>
-    inline path::_Path<_CharT*, _CharT*>&
-    path::operator+=(_CharT __x)
-    {
-      auto* __addr = std::__addressof(__x);
-      return concat(__addr, __addr + 1);
-    }
-
-  inline path&
-  path::make_preferred()
-  {
-#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
-    std::replace(_M_pathname.begin(), _M_pathname.end(), L'/',
-		 preferred_separator);
-#endif
-    return *this;
-  }
-
-  inline void path::swap(path& __rhs) noexcept
-  {
-    _M_pathname.swap(__rhs._M_pathname);
-    _M_cmpts.swap(__rhs._M_cmpts);
-    std::swap(_M_type, __rhs._M_type);
-  }
-
-  template<typename _CharT, typename _Traits, typename _Allocator>
-    inline std::basic_string<_CharT, _Traits, _Allocator>
-    path::string(const _Allocator& __a) const
-    {
-      if (is_same<_CharT, value_type>::value)
-	return { _M_pathname.begin(), _M_pathname.end(), __a };
-
-      const value_type* __first = _M_pathname.data();
-      const value_type* __last = __first + _M_pathname.size();
-
-#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
-      using _CharAlloc = __alloc_rebind<_Allocator, char>;
-      using _String = basic_string<char, char_traits<char>, _CharAlloc>;
-      using _WString = basic_string<_CharT, _Traits, _Allocator>;
-
-      // use codecvt_utf8<wchar_t> to convert native string to UTF-8
-      codecvt_utf8<value_type> __cvt;
-      _String __u8str{_CharAlloc{__a}};
-      if (__str_codecvt_out(__first, __last, __u8str, __cvt))
-	{
-	  struct
-	  {
-	    const _String*
-	    operator()(const _String& __from, _String&, true_type)
-	    { return std::__addressof(__from); }
-
-	    _WString*
-	    operator()(const _String& __from, _WString& __to, false_type)
-	    {
-	      // use codecvt_utf8<_CharT> to convert UTF-8 to wide string
-	      codecvt_utf8<_CharT> __cvt;
-	      const char* __f = __from.data();
-	      const char* __l = __f + __from.size();
-	      if (__str_codecvt_in(__f, __l, __to, __cvt))
-		return std::__addressof(__to);
-	      return nullptr;
-	    }
-	  } __dispatch;
-	  _WString __wstr;
-	  if (auto* __p = __dispatch(__u8str, __wstr, is_same<_CharT, char>{}))
-	    return *__p;
-	}
-#else
-      codecvt_utf8<_CharT> __cvt;
-      basic_string<_CharT, _Traits, _Allocator> __wstr{__a};
-      if (__str_codecvt_in(__first, __last, __wstr, __cvt))
-	return __wstr;
-#endif
-      _GLIBCXX_THROW_OR_ABORT(filesystem_error(
-	    "Cannot convert character sequence",
-	    std::make_error_code(errc::illegal_byte_sequence)));
-    }
-
-  inline std::string
-  path::string() const { return string<char>(); }
-
-#if _GLIBCXX_USE_WCHAR_T
-  inline std::wstring
-  path::wstring() const { return string<wchar_t>(); }
-#endif
-
-  inline std::string
-  path::u8string() const
-  {
-#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
-    std::string __str;
-    // convert from native encoding to UTF-8
-    codecvt_utf8<value_type> __cvt;
-    const value_type* __first = _M_pathname.data();
-    const value_type* __last = __first + _M_pathname.size();
-    if (__str_codecvt_out(__first, __last, __str, __cvt))
-      return __str;
-    _GLIBCXX_THROW_OR_ABORT(filesystem_error(
-	  "Cannot convert character sequence",
-	  std::make_error_code(errc::illegal_byte_sequence)));
-#else
-    return _M_pathname;
-#endif
-  }
-
-  inline std::u16string
-  path::u16string() const { return string<char16_t>(); }
-
-  inline std::u32string
-  path::u32string() const { return string<char32_t>(); }
-
-#ifndef _GLIBCXX_FILESYSTEM_IS_WINDOWS
-  template<typename _CharT, typename _Traits, typename _Allocator>
-    inline std::basic_string<_CharT, _Traits, _Allocator>
-    path::generic_string(const _Allocator& __a) const
-    { return string<_CharT, _Traits, _Allocator>(__a); }
-
-  inline std::string
-  path::generic_string() const { return string(); }
-
-#if _GLIBCXX_USE_WCHAR_T
-  inline std::wstring
-  path::generic_wstring() const { return wstring(); }
-#endif
-
-  inline std::string
-  path::generic_u8string() const { return u8string(); }
-
-  inline std::u16string
-  path::generic_u16string() const { return u16string(); }
-
-  inline std::u32string
-  path::generic_u32string() const { return u32string(); }
-#endif
-
-  inline int
-  path::compare(const string_type& __s) const { return compare(path(__s)); }
-
-  inline int
-  path::compare(const value_type* __s) const { return compare(path(__s)); }
-
-  inline path
-  path::filename() const { return empty() ? path() : *--end(); }
-
-  inline path
-  path::stem() const
-  {
-    auto ext = _M_find_extension();
-    if (ext.first && ext.second != 0)
-      return path{ext.first->substr(0, ext.second)};
-    return {};
-  }
-
-  inline path
-  path::extension() const
-  {
-    auto ext = _M_find_extension();
-    if (ext.first && ext.second != string_type::npos)
-      return path{ext.first->substr(ext.second)};
-    return {};
-  }
-
-  inline bool
-  path::has_stem() const
-  {
-    auto ext = _M_find_extension();
-    return ext.first && ext.second != 0;
-  }
-
-  inline bool
-  path::has_extension() const
-  {
-    auto ext = _M_find_extension();
-    return ext.first && ext.second != string_type::npos;
-  }
-
-  inline bool
-  path::is_absolute() const
-  {
-#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
-    return has_root_name();
-#else
-    return has_root_directory();
-#endif
-  }
-
-  inline path::iterator
-  path::begin() const
-  {
-    if (_M_type == _Type::_Multi)
-      return iterator(this, _M_cmpts.begin());
-    return iterator(this, false);
-  }
-
-  inline path::iterator
-  path::end() const
-  {
-    if (_M_type == _Type::_Multi)
-      return iterator(this, _M_cmpts.end());
-    return iterator(this, true);
-  }
-
-  inline path::iterator&
-  path::iterator::operator++()
-  {
-    __glibcxx_assert(_M_path != nullptr);
-    if (_M_path->_M_type == _Type::_Multi)
-      {
-	__glibcxx_assert(_M_cur != _M_path->_M_cmpts.end());
-	++_M_cur;
-      }
-    else
-      {
-	__glibcxx_assert(!_M_at_end);
-	_M_at_end = true;
-      }
-    return *this;
-  }
-
-  inline path::iterator&
-  path::iterator::operator--()
-  {
-    __glibcxx_assert(_M_path != nullptr);
-    if (_M_path->_M_type == _Type::_Multi)
-      {
-	__glibcxx_assert(_M_cur != _M_path->_M_cmpts.begin());
-	--_M_cur;
-      }
-    else
-      {
-	__glibcxx_assert(_M_at_end);
-	_M_at_end = false;
-      }
-    return *this;
-  }
-
-  inline path::iterator::reference
-  path::iterator::operator*() const
-  {
-    __glibcxx_assert(_M_path != nullptr);
-    if (_M_path->_M_type == _Type::_Multi)
-      {
-	__glibcxx_assert(_M_cur != _M_path->_M_cmpts.end());
-	return *_M_cur;
-      }
-    return *_M_path;
-  }
-
-  inline bool
-  path::iterator::_M_equals(iterator __rhs) const
-  {
-    if (_M_path != __rhs._M_path)
-      return false;
-    if (_M_path == nullptr)
-      return true;
-    if (_M_path->_M_type == path::_Type::_Multi)
-      return _M_cur == __rhs._M_cur;
-    return _M_at_end == __rhs._M_at_end;
-  }
-
-  // @} group filesystem
-_GLIBCXX_END_NAMESPACE_CXX11
-_GLIBCXX_END_NAMESPACE_VERSION
-} // namespace v1
-} // namespace filesystem
-} // namespace experimental
-} // namespace std
-
-#endif // C++11
-
-#endif // _GLIBCXX_EXPERIMENTAL_FS_PATH_H
diff --git a/libstdc++-v3/include/experimental/map b/libstdc++-v3/include/experimental/map
index e4b3620..89bf260 100644
--- a/libstdc++-v3/include/experimental/map
+++ b/libstdc++-v3/include/experimental/map
@@ -36,7 +36,7 @@
 #else
 
 #include <map>
-#include <experimental/erase_if.h>
+#include <experimental/bits/erase_if.h>
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
diff --git a/libstdc++-v3/include/experimental/set b/libstdc++-v3/include/experimental/set
index c742d91..709fe32 100644
--- a/libstdc++-v3/include/experimental/set
+++ b/libstdc++-v3/include/experimental/set
@@ -36,7 +36,7 @@
 #else
 
 #include <set>
-#include <experimental/erase_if.h>
+#include <experimental/bits/erase_if.h>
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
diff --git a/libstdc++-v3/include/experimental/string_view b/libstdc++-v3/include/experimental/string_view
index 9dca400..9931ad0 100644
--- a/libstdc++-v3/include/experimental/string_view
+++ b/libstdc++-v3/include/experimental/string_view
@@ -686,7 +686,7 @@ _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace experimental
 } // namespace std
 
-#include <experimental/string_view.tcc>
+#include <experimental/bits/string_view.tcc>
 
 #endif // __cplusplus <= 201103L
 
diff --git a/libstdc++-v3/include/experimental/string_view.tcc b/libstdc++-v3/include/experimental/string_view.tcc
deleted file mode 100644
index 75a34f9..0000000
--- a/libstdc++-v3/include/experimental/string_view.tcc
+++ /dev/null
@@ -1,230 +0,0 @@
-// Components for manipulating non-owning sequences of characters -*- C++ -*-
-
-// Copyright (C) 2013-2015 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library.  This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 3, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-
-// Under Section 7 of GPL version 3, you are granted additional
-// permissions described in the GCC Runtime Library Exception, version
-// 3.1, as published by the Free Software Foundation.
-
-// You should have received a copy of the GNU General Public License and
-// a copy of the GCC Runtime Library Exception along with this program;
-// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-// <http://www.gnu.org/licenses/>.
-
-/** @file experimental/string_view.tcc
- *  This is an internal header file, included by other library headers.
- *  Do not attempt to use it directly. @headername{string_view}
- */
-
-//
-// N3762 basic_string_view library
-//
-
-#ifndef _GLIBCXX_EXPERIMENTAL_STRING_VIEW_TCC
-#define _GLIBCXX_EXPERIMENTAL_STRING_VIEW_TCC 1
-
-#pragma GCC system_header
-
-#if __cplusplus <= 201103L
-# include <bits/c++14_warning.h>
-#else
-
-namespace std _GLIBCXX_VISIBILITY(default)
-{
-namespace experimental
-{
-_GLIBCXX_BEGIN_NAMESPACE_VERSION
-
-  template<typename _CharT, typename _Traits>
-    typename basic_string_view<_CharT, _Traits>::size_type
-    basic_string_view<_CharT, _Traits>::
-    find(const _CharT* __str, size_type __pos, size_type __n) const noexcept
-    {
-      __glibcxx_requires_string_len(__str, __n);
-
-      if (__n == 0)
-	return __pos <= this->_M_len ? __pos : npos;
-
-      if (__n <= this->_M_len)
-	{
-	  for (; __pos <= this->_M_len - __n; ++__pos)
-	    if (traits_type::eq(this->_M_str[__pos], __str[0])
-		&& traits_type::compare(this->_M_str + __pos + 1,
-					__str + 1, __n - 1) == 0)
-	      return __pos;
-	}
-      return npos;
-    }
-
-  template<typename _CharT, typename _Traits>
-    typename basic_string_view<_CharT, _Traits>::size_type
-    basic_string_view<_CharT, _Traits>::
-    find(_CharT __c, size_type __pos) const noexcept
-    {
-      size_type __ret = npos;
-      if (__pos < this->_M_len)
-	{
-	  const size_type __n = this->_M_len - __pos;
-	  const _CharT* __p = traits_type::find(this->_M_str + __pos, __n, __c);
-	  if (__p)
-	    __ret = __p - this->_M_str;
-	}
-      return __ret;
-    }
-
-  template<typename _CharT, typename _Traits>
-    typename basic_string_view<_CharT, _Traits>::size_type
-    basic_string_view<_CharT, _Traits>::
-    rfind(const _CharT* __str, size_type __pos, size_type __n) const noexcept
-    {
-      __glibcxx_requires_string_len(__str, __n);
-
-      if (__n <= this->_M_len)
-	{
-	  __pos = std::min(size_type(this->_M_len - __n), __pos);
-	  do
-	    {
-	      if (traits_type::compare(this->_M_str + __pos, __str, __n) == 0)
-		return __pos;
-	    }
-	  while (__pos-- > 0);
-	}
-      return npos;
-    }
-
-  template<typename _CharT, typename _Traits>
-    typename basic_string_view<_CharT, _Traits>::size_type
-    basic_string_view<_CharT, _Traits>::
-    rfind(_CharT __c, size_type __pos) const noexcept
-    {
-      size_type __size = this->_M_len;
-      if (__size > 0)
-	{
-	  if (--__size > __pos)
-	    __size = __pos;
-	  for (++__size; __size-- > 0; )
-	    if (traits_type::eq(this->_M_str[__size], __c))
-	      return __size;
-	}
-      return npos;
-    }
-
-  template<typename _CharT, typename _Traits>
-    typename basic_string_view<_CharT, _Traits>::size_type
-    basic_string_view<_CharT, _Traits>::
-    find_first_of(const _CharT* __str, size_type __pos, size_type __n) const
-    {
-      __glibcxx_requires_string_len(__str, __n);
-      for (; __n && __pos < this->_M_len; ++__pos)
-	{
-	  const _CharT* __p = traits_type::find(__str, __n,
-						this->_M_str[__pos]);
-	  if (__p)
-	    return __pos;
-	}
-      return npos;
-    }
-
-  template<typename _CharT, typename _Traits>
-    typename basic_string_view<_CharT, _Traits>::size_type
-    basic_string_view<_CharT, _Traits>::
-    find_last_of(const _CharT* __str, size_type __pos, size_type __n) const
-    {
-      __glibcxx_requires_string_len(__str, __n);
-      size_type __size = this->size();
-      if (__size && __n)
-	{
-	  if (--__size > __pos)
-	    __size = __pos;
-	  do
-	    {
-	      if (traits_type::find(__str, __n, this->_M_str[__size]))
-		return __size;
-	    }
-	  while (__size-- != 0);
-	}
-      return npos;
-    }
-
-  template<typename _CharT, typename _Traits>
-    typename basic_string_view<_CharT, _Traits>::size_type
-    basic_string_view<_CharT, _Traits>::
-    find_first_not_of(const _CharT* __str, size_type __pos, size_type __n) const
-    {
-      __glibcxx_requires_string_len(__str, __n);
-      for (; __pos < this->_M_len; ++__pos)
-	if (!traits_type::find(__str, __n, this->_M_str[__pos]))
-	  return __pos;
-      return npos;
-    }
-
-  template<typename _CharT, typename _Traits>
-    typename basic_string_view<_CharT, _Traits>::size_type
-    basic_string_view<_CharT, _Traits>::
-    find_first_not_of(_CharT __c, size_type __pos) const noexcept
-    {
-      for (; __pos < this->_M_len; ++__pos)
-	if (!traits_type::eq(this->_M_str[__pos], __c))
-	  return __pos;
-      return npos;
-    }
-
-  template<typename _CharT, typename _Traits>
-    typename basic_string_view<_CharT, _Traits>::size_type
-    basic_string_view<_CharT, _Traits>::
-    find_last_not_of(const _CharT* __str, size_type __pos, size_type __n) const
-    {
-      __glibcxx_requires_string_len(__str, __n);
-      size_type __size = this->_M_len;
-      if (__size)
-	{
-	  if (--__size > __pos)
-	    __size = __pos;
-	  do
-	    {
-	      if (!traits_type::find(__str, __n, this->_M_str[__size]))
-		return __size;
-	    }
-	  while (__size--);
-	}
-      return npos;
-    }
-
-  template<typename _CharT, typename _Traits>
-    typename basic_string_view<_CharT, _Traits>::size_type
-    basic_string_view<_CharT, _Traits>::
-    find_last_not_of(_CharT __c, size_type __pos) const noexcept
-    {
-      size_type __size = this->_M_len;
-      if (__size)
-	{
-	  if (--__size > __pos)
-	    __size = __pos;
-	  do
-	    {
-	      if (!traits_type::eq(this->_M_str[__size], __c))
-		return __size;
-	    }
-	  while (__size--);
-	}
-      return npos;
-    }
-
-_GLIBCXX_END_NAMESPACE_VERSION
-} // namespace experimental
-} // namespace std
-
-#endif // __cplusplus <= 201103L
-
-#endif // _GLIBCXX_EXPERIMENTAL_STRING_VIEW_TCC
diff --git a/libstdc++-v3/include/experimental/unordered_map b/libstdc++-v3/include/experimental/unordered_map
index d3a578e..c80c382 100644
--- a/libstdc++-v3/include/experimental/unordered_map
+++ b/libstdc++-v3/include/experimental/unordered_map
@@ -36,7 +36,7 @@
 #else
 
 #include <unordered_map>
-#include <experimental/erase_if.h>
+#include <experimental/bits/erase_if.h>
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
diff --git a/libstdc++-v3/include/experimental/unordered_set b/libstdc++-v3/include/experimental/unordered_set
index 2e5e08a..8461f9c 100644
--- a/libstdc++-v3/include/experimental/unordered_set
+++ b/libstdc++-v3/include/experimental/unordered_set
@@ -36,7 +36,7 @@
 #else
 
 #include <unordered_set>
-#include <experimental/erase_if.h>
+#include <experimental/bits/erase_if.h>
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-10-09 11:20 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20140703103529.GI4871@redhat.com>
2015-10-06 14:12 ` Additional headers under include/experimental/ Jonathan Wakely
2015-10-09 11:20   ` Jonathan Wakely

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).