1 | // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s |
2 | // expected-no-diagnostics |
3 | |
4 | // Note: Partial ordering of function templates containing template |
5 | // parameter packs is independent of the number of deduced arguments |
6 | // for those template parameter packs. |
7 | template<class ...> struct Tuple { }; |
8 | template<class ... Types> int &g(Tuple<Types ...>); // #1 |
9 | template<class T1, class ... Types> float &g(Tuple<T1, Types ...>); // #2 |
10 | template<class T1, class ... Types> double &g(Tuple<T1, Types& ...>); // #3 |
11 | |
12 | void test_g() { |
13 | int &ir1 = g(Tuple<>()); |
14 | float &fr1 = g(Tuple<int, float>()); |
15 | double &dr1 = g(Tuple<int, float&>()); |
16 | double &dr2 = g(Tuple<int>()); |
17 | } |
18 | |
19 | template<class ... Types> int &h(int (*)(Types ...)); // #1 |
20 | template<class T1, class ... Types> float &h(int (*)(T1, Types ...)); // #2 |
21 | template<class T1, class ... Types> double &h(int (*)(T1, Types& ...)); // #3 |
22 | |
23 | void test_h() { |
24 | int &ir1 = h((int(*)())0); |
25 | float &fr1 = h((int(*)(int, float))0); |
26 | double &dr1 = h((int(*)(int, float&))0); |
27 | double &dr2 = h((int(*)(int))0); |
28 | } |
29 | |