summaryrefslogtreecommitdiff
path: root/test/CXX/over/over.match/over.match.best/p1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/CXX/over/over.match/over.match.best/p1.cpp')
-rw-r--r--test/CXX/over/over.match/over.match.best/p1.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/test/CXX/over/over.match/over.match.best/p1.cpp b/test/CXX/over/over.match/over.match.best/p1.cpp
index 59e3dac74283..fad5bf9a72ee 100644
--- a/test/CXX/over/over.match/over.match.best/p1.cpp
+++ b/test/CXX/over/over.match/over.match.best/p1.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z %s
// expected-no-diagnostics
template<typename T> int &f0(T*, int);
@@ -12,6 +12,28 @@ void test_f0(int* ip, void *vp) {
float &fr = f0(vp, 0);
}
+namespace deduction_guide_example {
+ template<typename T> struct A {
+ A(T, int*);
+ A(A<T>&, int*);
+ enum { value };
+ };
+
+ template<typename T> struct remove_ref_impl;
+ template<typename T> struct remove_ref_impl<T&> { using type = T; };
+ template<typename T> using remove_ref = typename remove_ref_impl<T>::type;
+
+ // FIXME: The standard's example is wrong; we add a remove_ref<...> here to
+ // fix it.
+ template<typename T, int N = remove_ref<T>::value> A(T&&, int*) -> A<T>;
+ A a{1, 0};
+ extern A<int> a;
+ A b{a, 0};
+
+ A<int> *pa = &a;
+ A<A<int>&> *pb = &b;
+}
+
// Partial ordering of function template specializations will be tested
// elsewhere
// FIXME: Initialization by user-defined conversion is tested elsewhere