https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69364
Bug ID: 69364 Summary: [concepts] failure to properly order constraints when using fold expressions Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: ryan.burn at gmail dot com Target Milestone: --- The below code produces an ambiguous overload error. I'm not completely sure if the concept-lite standard dictates that it should compile (see discussion: http://stackoverflow.com/questions/34843745/how-are-fold-expressions-used-in-the-partial-ordering-of-constraints), but it seems like it ought to work. /////////////////////////////////////////////////////////////////////// #include <iostream> #include <type_traits> template <class T> concept bool A = std::is_move_constructible<T>::value; template <class T> concept bool B = std::is_copy_constructible<T>::value; template <class T> concept bool C = A<T> && B<T>; template <class _a, class _b> requires A<_a> && A<_b> void f(_a a, _b b) { std::cout << "a\n"; } template <class _a, class _b> requires C<_a> && C<_b> void f(_a a, _b b) { std::cout << "c\n"; } template <class... _tx> requires (A<_tx> && ...) void g(_tx... tx) { std::cout << "a\n"; } template <class... _tx> requires (C<_tx> && ...) void g(_tx... tx) { std::cout << "c\n"; } int main() { f(3, 7.0); // works with no fold expressions g(3, 7.0); // ambiguous overload error return 0; } ///////////////////////////////////////////////////////////////////////