On 17/05/21 15:25 +0100, Jonathan Wakely wrote: >On 17/05/21 15:02 +0100, Jonathan Wakely wrote: >>The constraint check for filesystem::path construction uses >>decltype(__is_path_src(declval())) which mean it considers >>conversion from an rvalue. When Source is a volatile-qualified type >>it cannot use is_path_src(const Unknown&) because a const lvalue >>reference can only bind to a non-volatile rvalue. >> >>Since the relevant path members all have a const Source& parameter, >>the constraint should be defined in terms of declval(), >>not declval(). This avoids the problem of volatile-qualified >>rvalues, because we no longer use an rvalue at all. >> >>libstdc++-v3/ChangeLog: >> >> PR libstdc++/100630 >> * include/bits/fs_path.h (__is_constructible_from): Test >> construction from a const lvalue, not an rvalue. >> * include/experimental/bits/fs_path.h (__is_constructible_from): >> Likewise. >> * testsuite/27_io/filesystem/path/construct/100630.cc: New test. >> * testsuite/experimental/filesystem/path/construct/100630.cc: >> New test. >> >>Tested x86_64-linux, pushed to gcc-10 (this isn't needed for gcc-11 or >>trunk, but I also plan to backport it to gcc-9). > >Oh actually this is needed for experimental::filesystem::path on trun >kand gcc-11 (as I found when I added to the new tests to trunk) so >I'll fix it there too. Here's the patch for trunk and gcc-11.