| // PR c++/101460 |
| // { dg-do compile { target c++11 } } |
| |
| template<bool> struct enable_if { }; |
| template<> struct enable_if<true> { using type = void; }; |
| |
| template<bool B> |
| using enable_if_t = typename enable_if<B>::type; |
| |
| struct tuple { }; |
| struct pair { }; |
| |
| template<unsigned N> enable_if_t<N == 1> get(tuple&) { } // { dg-bogus "candidate" } |
| template<unsigned N> enable_if_t<N == 1> get(const tuple&) { } // { dg-bogus "candidate" } |
| template<unsigned N> enable_if_t<N == 1> get(pair&) { } // { dg-bogus "candidate" } |
| template<unsigned N> enable_if_t<N == 1> get(const pair&) { } // { dg-bogus "candidate" } |
| |
| template<int N> |
| constexpr unsigned |
| frob() |
| { |
| static_assert(N == 1, "user-friendly diagnostic"); // { dg-error "user-friendly" } |
| // narrowing check, reject negative values |
| return unsigned{N}; // { dg-prune-output "narrowing" } |
| } // { dg-prune-output "flows off the end" } |
| // { dg-prune-output "not a return-statement" } |
| |
| template<int N> void get_n(tuple& t) { get<frob<N>()>(t); } // { dg-error "" } |
| |
| int main() |
| { |
| tuple t; |
| get_n<-1>(t); |
| } |