// RUN: %clang_cc1 -fsyntax-only -std=c++20 -verify %s template class normal_iterator {}; template struct is_convertible {}; template inline constexpr bool is_convertible_v = is_convertible::value; // expected-error {{no member named 'value' in 'is_convertible'}} template concept convertible_to = is_convertible_v; // #1 template requires requires(IteratorL lhs, IteratorR rhs) { // #2 { lhs == rhs } -> convertible_to; // #3 } constexpr bool compare(normal_iterator lhs, normal_iterator rhs) { // #4 return false; } class Object; void function() { normal_iterator begin, end; compare(begin, end); // expected-error {{no matching function for call to 'compare'}} #5 } // expected-note@#1 {{in instantiation of variable template specialization 'is_convertible_v' requested here}} // expected-note@#1 {{substituting template arguments into constraint expression here}} // expected-note@#3 {{checking the satisfaction of concept 'convertible_to'}} // expected-note@#2 {{substituting template arguments into constraint expression here}} // expected-note@#5 {{checking constraint satisfaction for template 'compare'}} // expected-note@#5 {{in instantiation of function template specialization 'compare' requested here}} // expected-note@#4 {{candidate template ignored: constraints not satisfied [with IteratorL = Object *, IteratorR = Object *]}} // We don't know exactly the substituted type for `lhs == rhs`, thus a placeholder 'expr-type' is emitted. // expected-note@#3 {{because 'convertible_to' would be invalid}}