summaryrefslogtreecommitdiffstats
path: root/test/SemaCXX/overload-template.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/SemaCXX/overload-template.cpp')
-rw-r--r--test/SemaCXX/overload-template.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/test/SemaCXX/overload-template.cpp b/test/SemaCXX/overload-template.cpp
new file mode 100644
index 0000000000..0a23788ef3
--- /dev/null
+++ b/test/SemaCXX/overload-template.cpp
@@ -0,0 +1,35 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+enum copy_traits { movable = 1 };
+
+template <int>
+struct optional_ctor_base {};
+template <typename T>
+struct ctor_copy_traits {
+ // this would produce a c++98-compat warning, which would erroneously get the
+ // no-matching-function-call error's notes attached to it (or suppress those
+ // notes if this diagnostic was suppressed, as it is in this case)
+ static constexpr int traits = copy_traits::movable;
+};
+template <typename T>
+struct optional : optional_ctor_base<ctor_copy_traits<T>::traits> {
+ template <typename U>
+ constexpr optional(U&& v);
+};
+struct A {};
+struct XA {
+ XA(const A&);
+};
+struct B {};
+struct XB {
+ XB(const B&);
+ XB(const optional<B>&);
+};
+struct YB : XB {
+ using XB::XB;
+};
+void InsertRow(const XA&, const YB&); // expected-note {{candidate function not viable: no known conversion from 'int' to 'const XA' for 1st argument}}
+void ReproducesBugSimply() {
+ InsertRow(3, B{}); // expected-error {{no matching function for call to 'InsertRow'}}
+}
+