On Wed, 20 Mar 2019 at 14:31, Florian-Bogdan Tudoran <tfbogdan@xxxxxxxxx> wrote: > > The decision in my company was to hold off until the experimental status is > cleared for C++17. Guess it's time to switch back to C++14 on local > branches then (ugh). That makes me wonder though, is there anything > separating GCC8 from C++17 support which is not experimental? Or is it just > a matter of giving it more time until the doubt is gone? Apart from the features that are missing completely (like <memory_resource> and everything defined in those headers) there have been a number of fixes to C++17 components since GCC 8: 49c83dca49c Rewrite variant, also PR libstdc++/85517 41cda271e87 Remove some more code duplication in std::optional 58e897da03b PR libstdc++/87855 fix optional for types with non-trivial copy/move 8815ac910d1 PR libstdc++/87431 fix regression introduced by r264574 3714571df65 PR libstdc++/83511 add default argument to basic_string_view::substr 0ee35a37cc2 PR libstdc++/87855 c64433506eb PR libstdc++/88084 - Implement LWG 2777 ab5b9ece1ee PR libstdc++/87619 4429133c757 Avoid redundant runtime checks in std::visit bc35ec6d4ca PR libstdc++/87431 optimise valueless_by_exception() a9267d6ad6b Limit workaround for Clang bug to __clang_major__ <= 7 d3a3029ca74 Refactor std::optional SFINAE constraints a4c655fb498 PR libstdc++/86874 fix std::variant::swap regression 6dd9755335f * include/std/variant (__accepted_index): Use void_t. 09e2d757369 Decorate string_view members with nonnull attribute 228cd7c3ad6 Qualify another call in <variant> 581da9d39d0 Qualify std::__invoke in <variant> to prevent ADL 5fef6f2fd86 PR libstdc++/85642 fix is_nothrow_default_constructible<optional<T>> 0c9b443272c PR libstdc++/84769 qualify call to std::get<0> fc557c2bedb Add fixed underlying type to enum path::format 5256b0dd6ec Add noexcept to filesystem::path query functions adc6beeea7c Define new filesystem::__file_clock type 9346fb0e7ea Fix bugs in filesystem::path::lexically_normal() 8f31a5fa227 LWG 3171: restore stream insertion for filesystem::directory_entry b37e7cb040d LWG 2936: update path::compare logic and optimize string comparisons 6bec006a621 PR libstdc++/71044 optimize std::filesystem::path construction 637f32c4215 Overload std::distance and std::advance for path::iterator 59d8a86834d PR libstdc++/80762 avoid ambiguous __constructible_from<void, void> 8092d42a27b PR libstdc++/83306 make filesystem_error no-throw copyable c8fb3443911 PR libstdc++/67843 set shared_ptr lock policy at build-time 779172019b8 PR libstdc++/86597 directory_entry observers should clear error_code 3052e4ec519 PR libstdc++/86595 add missing noexcept 339e22fd827 LWG 2989 hide path iostream operators from normal lookup 2fd48392d0a PR libstdc++/78870 support std::filesystem on Windows 861db1097d3 Refactor path construction from null terminated iterator ranges 048233284d3 Fix handling of an empty filename at end of a path 7330ffed52f PR libstdc++/83891 fix path::is_absolute() for non-POSIX targets e4e90696470 PR libstdc++/84159 fix appending strings to paths e6ac4004fe4 PR libstdc++/85671 allow copy elision in path concatenation I'm not sure how many of those changes were backported to gcc-8-branch and how many are only on trunk. I know for sure that the change for PR 87619 is an ABI change, specifically this prints "2 4 4" with GCC 8 and "2 2 4" with GCC 9: #include <iostream> #include <utility> #include <variant> template<std::size_t N> struct X { enum E : char { }; }; template<std::size_t... N> std::size_t size(std::index_sequence<N...>) { return sizeof(std::variant<typename X<N>::E...>); } int main() { std::cout << size(std::make_index_sequence<254>{}) << ' ' << size(std::make_index_sequence<255>{}) << ' ' << size(std::make_index_sequence<256>{}) << '\n'; } Some of the changes to std::filesystem are ABI changes too, including at least PR 83306. There may be other ABI changes, I haven't really kept track, because the point of it being experimental is that we can make such changes.