Viewing file: fn10.C (1.85 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// { dg-do compile { target c++17_only } } // { dg-options "-fconcepts" }
// Test that constraint satisfaction checks work even when // processing template declarations.
namespace std {
struct ostream { }; ostream cout;
template<typename T> auto begin(T& t) -> decltype(t.begin()) { return t.begin(); }
template<typename T> auto begin(T const& t) -> decltype(t.begin()) { return t.begin(); }
template<typename T> auto end(T& t) -> decltype(t.end()) { return t.end(); }
template<typename T> auto end(T const& t) -> decltype(t.end()) { return t.end(); }
} // namespace std
template <typename T> concept bool Float() { return __is_same_as( T, float ); }
template <typename T> constexpr decltype(auto) project( T t ) { return t; }
template <typename T> concept bool Concept() { return requires( T t ) { // { dg-message "in requirements" } requires Float<decltype( project(t) )>(); }; }
template <Concept E, Concept F> constexpr decltype(auto) operator<<( E&& e, F&& f ) {}
template <Concept T> void foo( T t ) { // Try to resolve operator<< from within a template context but // with non-dependent arguments. We need to ensure that template // processing is turned off whenever checking for satisfaction. std::cout << "OK"; // { dg-error "no match" } }
template <typename R> concept bool Range() { return requires( R r ) { requires __is_same_as( decltype(std::begin(r)), decltype(std::end(r)) ); }; }
struct A { A() = default; A( const A& ) = default;
// Derivation from this class forces the instantiation of // this constructor, which results in the __is_same_as type // trait above to become error_mark_node in this declaration. template <Range R> explicit A( R&& r ) { } };
struct C : A { C() = default; C( const C& ) = default; };
int main() { C c; // OK return 0; }
|