60 lines
1.4 KiB
C++
60 lines
1.4 KiB
C++
|
// RUN: %clang_cc1 -std=c++2a -x c++ -verify %s
|
||
|
|
||
|
namespace nodiag {
|
||
|
|
||
|
template <typename T> requires (bool(T()))
|
||
|
int A();
|
||
|
template <typename U> requires (bool(U()))
|
||
|
int A();
|
||
|
|
||
|
} // end namespace nodiag
|
||
|
|
||
|
namespace diag {
|
||
|
|
||
|
namespace orig {
|
||
|
template <typename T> requires true
|
||
|
int A();
|
||
|
template <typename T>
|
||
|
int B();
|
||
|
template <typename T> requires true
|
||
|
int C();
|
||
|
}
|
||
|
|
||
|
template <typename T>
|
||
|
int orig::A();
|
||
|
// expected-error@-1{{out-of-line declaration of 'A' does not match any declaration in namespace 'diag::orig'}}
|
||
|
template <typename T> requires true
|
||
|
int orig::B();
|
||
|
// expected-error@-1{{out-of-line declaration of 'B' does not match any declaration in namespace 'diag::orig'}}
|
||
|
template <typename T> requires (!0)
|
||
|
int orig::C();
|
||
|
// expected-error@-1{{out-of-line declaration of 'C' does not match any declaration in namespace 'diag::orig'}}
|
||
|
|
||
|
} // end namespace diag
|
||
|
|
||
|
namespace nodiag {
|
||
|
|
||
|
struct AA {
|
||
|
template <typename T> requires (someFunc(T()))
|
||
|
int A();
|
||
|
};
|
||
|
|
||
|
template <typename T> requires (someFunc(T()))
|
||
|
int AA::A() { return sizeof(T); }
|
||
|
|
||
|
} // end namespace nodiag
|
||
|
|
||
|
namespace diag {
|
||
|
|
||
|
template <unsigned N>
|
||
|
struct TA {
|
||
|
template <template <unsigned> class TT> requires TT<N>::happy
|
||
|
int A();
|
||
|
};
|
||
|
|
||
|
template <unsigned N>
|
||
|
template <template <unsigned> class TT> int TA<N>::A() { return sizeof(TT<N>); }
|
||
|
// expected-error@-1{{out-of-line definition of 'A' does not match any declaration in 'TA<N>'}}
|
||
|
|
||
|
} // end namespace diag
|