104 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s2 3struct X {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 }19};20 21void test_X_f0(X x, int i, float f) {22 int &ir = x.f0(i);23 float &fr = x.f0(f);24}25 26void 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);30}31 32void test_X_f0_address() {33 int& (X::*pm1)(int) = &X::f0;34 float& (X::*pm2)(float) = &X::f0;35}36 37void 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}42 43void test_X_f0_explicit(X x, int i, long l) {44 int &ir1 = x.f0<int>(i);45 int &ir2 = x.f0<>(i);46 long &il1 = x.f0<long>(i);47}48 49// PR460850class A { template <class x> x a(x z) { return z+y; } int y; };51 52// PR541953struct Functor {54 template <typename T>55 bool operator()(const T& v) const {56 return true;57 }58};59 60void test_Functor(Functor f) {61 f(1);62}63 64// Instantiation on ->65template<typename T>66struct X1 {67 template<typename U> U& get();68};69 70template<typename T> struct X2; // expected-note{{here}}71 72void 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}76 77// Instantiation of template template parameters in a member function78// template.79namespace 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}88 89namespace PR7387 {90 template <typename T> struct X {};91 92 template <typename T1> struct S {93 template <template <typename> class TC> void foo(const TC<T1>& arg);94 };95 96 template <typename T1> template <template <typename> class TC>97 void S<T1>::foo(const TC<T1>& arg) {}98 99 void test(const X<int>& x) {100 S<int> s;101 s.foo(x);102 }103}104