Daniel Dunbar | a572887 | 2009-12-15 20:14:24 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -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; }; |
Douglas Gregor | 2dd078a | 2009-09-02 22:59:36 +0000 | [diff] [blame] | 51 | |
Douglas Gregor | 3734c21 | 2009-11-07 17:23:56 +0000 | [diff] [blame] | 52 | // PR5419 |
| 53 | struct Functor { |
| 54 | template <typename T> |
| 55 | bool operator()(const T& v) const { |
| 56 | return true; |
| 57 | } |
| 58 | }; |
| 59 | |
| 60 | void test_Functor(Functor f) { |
| 61 | f(1); |
| 62 | } |
Douglas Gregor | 03c5705 | 2009-11-17 05:17:33 +0000 | [diff] [blame] | 63 | |
| 64 | // Instantiation on -> |
| 65 | template<typename T> |
| 66 | struct X1 { |
| 67 | template<typename U> U& get(); |
| 68 | }; |
| 69 | |
| 70 | template<typename T> struct X2; // expected-note{{here}} |
| 71 | |
| 72 | void test_incomplete_access(X1<int> *x1, X2<int> *x2) { |
| 73 | float &fr = x1->get<float>(); |
| 74 | (void)x2->get<float>(); // expected-error{{implicit instantiation of undefined template}} |
| 75 | } |
Douglas Gregor | 6d3e627 | 2010-02-05 19:54:12 +0000 | [diff] [blame] | 76 | |
| 77 | // Instantiation of template template parameters in a member function |
| 78 | // template. |
| 79 | namespace TTP { |
| 80 | template<int Dim> struct X { |
| 81 | template<template<class> class M, class T> void f(const M<T>&); |
| 82 | }; |
| 83 | |
| 84 | template<typename T> struct Y { }; |
| 85 | |
| 86 | void test_f(X<3> x, Y<int> y) { x.f(y); } |
| 87 | } |