[Bug c++/67545] New: [concepts] Failure to properly substitute template parameters into requires-clause
Casey at Carter dot net
gcc-bugzilla@gcc.gnu.org
Fri Sep 11 02:59:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67545
Bug ID: 67545
Summary: [concepts] Failure to properly substitute template
parameters into requires-clause
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: Casey at Carter dot net
Target Milestone: ---
Created attachment 36323
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36323&action=edit
Preprocessed test case
r227603 fails to compile this correct TU:
#include <stl2/detail/swap.hpp>
struct I {
int operator*() const;
};
template <class R>
using Ref = decltype(*std::declval<R>());
template <class U = I>
requires !__stl2::Swappable<Ref<I>, Ref<I>>()
static constexpr bool bar() { return true; }
template <class U = I>
requires !__stl2::Swappable<Ref<U>, Ref<U>>()
static constexpr bool foo() { return true; }
static_assert(bar()); // Fine
static_assert(foo()); // Error
with error:
~/gcc6/bin/g++ -std=gnu++1z -I ~/cmcstl2/include -I ~/cmcstl2/meta/include
foo.cpp -c
foo.cpp:19:19: error: cannot call function ‘constexpr bool foo() [with U = I]’
static_assert(foo()); // Error
^
foo.cpp:16:23: note: constraints not satisfied
static constexpr bool foo() { return true; }
^
foo.cpp:16:23: note: ‘! Swappable<Ref<U>, Ref<U> >()’ evaluated to false
Despite the fact that the requirements on foo and bar are functionally
equivalent, the call to bar succeeds whilst the call to `bar` fails to compile.
I conjecture that the substitution of template parameters into foo's requires
clause is not working correctly.
More information about the Gcc-bugs
mailing list