1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 3 enum copy_traits { movable = 1 }; 4 5 template <int> 6 struct optional_ctor_base {}; 7 template <typename T> 8 struct ctor_copy_traits { 9 // this would produce a c++98-compat warning, which would erroneously get the 10 // no-matching-function-call error's notes attached to it (or suppress those 11 // notes if this diagnostic was suppressed, as it is in this case) 12 static constexpr int traits = copy_traits::movable; 13 }; 14 template <typename T> 15 struct optional : optional_ctor_base<ctor_copy_traits<T>::traits> { 16 template <typename U> 17 constexpr optional(U&& v); 18 }; 19 struct A {}; 20 struct XA { 21 XA(const A&); 22 }; 23 struct B {}; 24 struct XB { 25 XB(const B&); 26 XB(const optional<B>&); 27 }; 28 struct YB : XB { 29 using XB::XB; 30 }; 31 void InsertRow(const XA&, const YB&); // expected-note {{candidate function not viable: no known conversion from 'int' to 'const XA' for 1st argument}} ReproducesBugSimply()32void ReproducesBugSimply() { 33 InsertRow(3, B{}); // expected-error {{no matching function for call to 'InsertRow'}} 34 } 35 36