public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] PR libstdc++/80762 avoid ambiguous __constructible_from<void, void>
@ 2018-12-12 16:13 Jonathan Wakely
  2018-12-13  7:56 ` Christophe Lyon
  0 siblings, 1 reply; 5+ messages in thread
From: Jonathan Wakely @ 2018-12-12 16:13 UTC (permalink / raw)
  To: libstdc++, gcc-patches

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

Ensure we don't try to instantiate __is_constructible_from<void, void>,
because there are two partial specializations that are equally good
matches.

	PR libstdc++/80762
	* include/bits/fs_path.h (path::_Path): Use remove_cv_t and is_void.
	* include/experimental/bits/fs_path.h (path::_Path): Likewise.
	* testsuite/27_io/filesystem/path/construct/80762.cc: New test.
	* testsuite/experimental/filesystem/path/construct/80762.cc: New test.

Tested x86_64-linux (and manually verified it fixes the clang errors).

Committed to trunk. This is worth backporting too, I think.


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

commit 39d7ca64fdd9ad94c80655ac79c84259a33b3306
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Wed Dec 12 14:51:08 2018 +0000

    PR libstdc++/80762 avoid ambiguous __constructible_from<void, void>
    
    Ensure we don't try to instantiate __is_constructible_from<void, void>,
    because there are two partial specializations that are equally good
    matches.
    
            PR libstdc++/80762
            * include/bits/fs_path.h (path::_Path): Use remove_cv_t and is_void.
            * include/experimental/bits/fs_path.h (path::_Path): Likewise.
            * testsuite/27_io/filesystem/path/construct/80762.cc: New test.
            * testsuite/experimental/filesystem/path/construct/80762.cc: New test.

diff --git a/libstdc++-v3/include/bits/fs_path.h b/libstdc++-v3/include/bits/fs_path.h
index 0eee684a2f6..cbaea7343a3 100644
--- a/libstdc++-v3/include/bits/fs_path.h
+++ b/libstdc++-v3/include/bits/fs_path.h
@@ -110,7 +110,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
 
     template<typename _Tp1, typename _Tp2 = void>
       using _Path = typename
-	std::enable_if<__and_<__not_<is_same<_Tp1, path>>,
+	std::enable_if<__and_<__not_<is_same<remove_cv_t<_Tp1>, path>>,
+			      __not_<is_void<_Tp1>>,
 			      __constructible_from<_Tp1, _Tp2>>::value,
 		       path>::type;
 
diff --git a/libstdc++-v3/include/experimental/bits/fs_path.h b/libstdc++-v3/include/experimental/bits/fs_path.h
index 653b4a3fe85..340cc59d541 100644
--- a/libstdc++-v3/include/experimental/bits/fs_path.h
+++ b/libstdc++-v3/include/experimental/bits/fs_path.h
@@ -125,7 +125,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
 
     template<typename _Tp1, typename _Tp2 = void>
       using _Path = typename
-	std::enable_if<__and_<__not_<is_same<_Tp1, path>>,
+	std::enable_if<__and_<__not_<is_same<typename remove_cv<_Tp1>::type,
+					     path>>,
+			      __not_<is_void<_Tp1>>,
 			      __constructible_from<_Tp1, _Tp2>>::value,
 		       path>::type;
 
diff --git a/libstdc++-v3/testsuite/27_io/filesystem/path/construct/80762.cc b/libstdc++-v3/testsuite/27_io/filesystem/path/construct/80762.cc
new file mode 100644
index 00000000000..15a79fd4e12
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/filesystem/path/construct/80762.cc
@@ -0,0 +1,29 @@
+// Copyright (C) 2018 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.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++17" }
+// { dg-do compile { target c++17 } }
+
+#include <filesystem>
+
+using std::filesystem::path;
+
+static_assert( !std::is_constructible_v<path, void> );
+static_assert( !std::is_constructible_v<path, volatile path> );
+static_assert( !std::is_constructible_v<path, volatile path&> );
+static_assert( !std::is_constructible_v<path, const volatile path> );
+static_assert( !std::is_constructible_v<path, const volatile path&> );
diff --git a/libstdc++-v3/testsuite/experimental/filesystem/path/construct/80762.cc b/libstdc++-v3/testsuite/experimental/filesystem/path/construct/80762.cc
new file mode 100644
index 00000000000..fdd9f768f78
--- /dev/null
+++ b/libstdc++-v3/testsuite/experimental/filesystem/path/construct/80762.cc
@@ -0,0 +1,28 @@
+// Copyright (C) 2018 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.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do compile { target c++11 } }
+
+#include <experimental/filesystem>
+
+using std::experimental::filesystem::path;
+
+static_assert( !std::is_constructible<path, void>::value, "" );
+static_assert( !std::is_constructible<path, volatile path>::value, "" );
+static_assert( !std::is_constructible<path, volatile path&>::value, "" );
+static_assert( !std::is_constructible<path, const volatile path>::value, "" );
+static_assert( !std::is_constructible<path, const volatile path&>::value, "" );

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

end of thread, other threads:[~2018-12-13 12:13 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-12 16:13 [PATCH] PR libstdc++/80762 avoid ambiguous __constructible_from<void, void> Jonathan Wakely
2018-12-13  7:56 ` Christophe Lyon
2018-12-13 11:01   ` Jonathan Wakely
2018-12-13 12:11     ` Christophe Lyon
2018-12-13 12:13       ` 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).