diff options
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.cpp | 24 |
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 |