Douglas Gregor | 6b90686 | 2009-08-21 00:16:32 +0000 | [diff] [blame] | 1 | // RUN: clang-cc -fsyntax-only -verify %s |
Douglas Gregor | 37b372b | 2009-08-20 22:52:58 +0000 | [diff] [blame] | 2 | |
| 3 | struct X { |
Douglas Gregor | 6b90686 | 2009-08-21 00:16:32 +0000 | [diff] [blame] | 4 | template<typename T> T& f0(T); |
| 5 | |
| 6 | void g0(int i, double d) { |
| 7 | int &ir = f0(i); |
| 8 | double &dr = f0(d); |
| 9 | } |
| 10 | |
| 11 | template<typename T> T& f1(T); |
| 12 | template<typename T, typename U> U& f1(T, U); |
| 13 | |
| 14 | void g1(int i, double d) { |
| 15 | int &ir1 = f1(i); |
| 16 | int &ir2 = f1(d, i); |
| 17 | int &ir3 = f1(i, i); |
| 18 | } |
Douglas Gregor | 37b372b | 2009-08-20 22:52:58 +0000 | [diff] [blame] | 19 | }; |
Douglas Gregor | 6b90686 | 2009-08-21 00:16:32 +0000 | [diff] [blame] | 20 | |
| 21 | void test_X_f0(X x, int i, float f) { |
| 22 | int &ir = x.f0(i); |
| 23 | float &fr = x.f0(f); |
| 24 | } |
| 25 | |
| 26 | void test_X_f1(X x, int i, float f) { |
| 27 | int &ir1 = x.f1(i); |
| 28 | int &ir2 = x.f1(f, i); |
| 29 | int &ir3 = x.f1(i, i); |
Douglas Gregor | dec0666 | 2009-08-21 18:42:58 +0000 | [diff] [blame] | 30 | } |
Douglas Gregor | 1561248 | 2009-08-21 23:32:45 +0000 | [diff] [blame] | 31 | |
| 32 | void test_X_f0_address() { |
| 33 | int& (X::*pm1)(int) = &X::f0; |
| 34 | float& (X::*pm2)(float) = &X::f0; |
| 35 | } |
| 36 | |
| 37 | void test_X_f1_address() { |
| 38 | int& (X::*pm1)(int) = &X::f1; |
| 39 | float& (X::*pm2)(float) = &X::f1; |
| 40 | int& (X::*pm3)(float, int) = &X::f1; |
| 41 | } |
Douglas Gregor | d83d040 | 2009-08-22 00:34:47 +0000 | [diff] [blame] | 42 | |
Douglas Gregor | f328a28 | 2009-08-31 21:16:32 +0000 | [diff] [blame] | 43 | void test_X_f0_explicit(X x, int i, long l) { |
| 44 | int &ir1 = x.f0<int>(i); |
| 45 | int &ir2 = x.f0<>(i); |
Douglas Gregor | c4bf26f | 2009-09-01 00:37:14 +0000 | [diff] [blame^] | 46 | long &il1 = x.f0<long>(i); |
Douglas Gregor | f328a28 | 2009-08-31 21:16:32 +0000 | [diff] [blame] | 47 | } |
| 48 | |
Douglas Gregor | d83d040 | 2009-08-22 00:34:47 +0000 | [diff] [blame] | 49 | // PR4608 |
| 50 | class A { template <class x> x a(x z) { return z+y; } int y; }; |