p3.cpp revision 229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfd
13573b2c84372d9484296fa658f5276f6c09acb92Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
2ecd63b87e626bbf6b47d9eb828553d5857fb85eeDouglas Gregor
3011323d90dd2c1ff2db6e1871154831885f2d7cbJohn McCalltemplate<class X, class Y, class Z> X f(Y,Z); // expected-note {{candidate template ignored: couldn't infer template argument 'X'}}
4ecd63b87e626bbf6b47d9eb828553d5857fb85eeDouglas Gregor
5ecd63b87e626bbf6b47d9eb828553d5857fb85eeDouglas Gregorvoid g() {
697d35a2f4f6cb1cc51e48cfd1841c7fd5a5f5377Douglas Gregor  f<int,char*,double>("aa",3.0); // expected-warning{{conversion from string literal to 'char *' is deprecated}}
797d35a2f4f6cb1cc51e48cfd1841c7fd5a5f5377Douglas Gregor  f<int,char*>("aa",3.0); // Z is deduced to be double  \
897d35a2f4f6cb1cc51e48cfd1841c7fd5a5f5377Douglas Gregor                          // expected-warning{{conversion from string literal to 'char *' is deprecated}}
9ecd63b87e626bbf6b47d9eb828553d5857fb85eeDouglas Gregor  f<int>("aa",3.0);       // Y is deduced to be char*, and
10ecd63b87e626bbf6b47d9eb828553d5857fb85eeDouglas Gregor                          // Z is deduced to be double
11ecd63b87e626bbf6b47d9eb828553d5857fb85eeDouglas Gregor  f("aa",3.0); // expected-error{{no matching}}
12b56fd0b9080fae81e36cfd73dd740f0e06a4815dOwen Anderson}
1358253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor
1458253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor// PR5910
1558253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregornamespace PR5910 {
1658253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  template <typename T>
1758253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  void Func() {}
1858253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor
1958253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  template <typename R>
2058253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  void Foo(R (*fp)());
2158253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor
2258253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  void Test() {
2358253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor    Foo(Func<int>);
2458253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  }
2558253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor}
2658253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor
2758253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor// PR5949
2858253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregornamespace PR5949 {
2958253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  struct Bar;
3058253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor
3158253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  template <class Container>
3258253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  void quuz(const Container &cont) {
3358253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  }
3458253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor
3558253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  template<typename T>
3658253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  int Foo(Bar *b, void (*Baz)(const T &t), T * = 0) {
3758253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor    return 0;
3858253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  }
3958253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor
4058253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  template<typename T>
4158253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  int Quux(Bar *b, T * = 0)
4258253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  {
4358253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor    return Foo<T>(b, quuz);
4458253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor  }
4558253a580a747ded47eaf7d89c2b4e8a050a9dddDouglas Gregor}
46229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor
47229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor// PR7641
48229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregornamespace PR7641 {
49229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor  namespace N2
50229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor  {
51229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor    template<class>
52229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor    int f0(int);
53229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor  }
54229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor  namespace N
55229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor  {
56229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor    using N2::f0;
57229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor  }
58229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor
59229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor  template<class R,class B1>
60229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor  int
61229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor  f1(R(a)(B1));
62229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor
63229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor  void f2()
64229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor  { f1(N::f0<int>); }
65229f3b3ebd5cee39a2cc81e2f707de5a7e88ddfdDouglas Gregor}
66