| 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 | |