13573b2c84372d9484296fa658f5276f6c09acb92Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
2050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregorstruct X0 { // expected-note{{candidate}}
3050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor  X0(int); // expected-note{{candidate}}
48b29f57d867495ace41cda6a06013f05961c68caJohn McCall  template<typename T> X0(T); // expected-note {{candidate}}
58b29f57d867495ace41cda6a06013f05961c68caJohn McCall  template<typename T, typename U> X0(T*, U*); // expected-note {{candidate}}
684164f0720f3c0a529f38f89663eda97e49fcdfdDouglas Gregor
784164f0720f3c0a529f38f89663eda97e49fcdfdDouglas Gregor  // PR4761
88b29f57d867495ace41cda6a06013f05961c68caJohn McCall  template<typename T> X0() : f0(T::foo) {} // expected-note {{candidate}}
984164f0720f3c0a529f38f89663eda97e49fcdfdDouglas Gregor  int f0;
10050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor};
11050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor
12050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregorvoid accept_X0(X0);
13050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor
14050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregorvoid test_X0(int i, float f) {
15050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor  X0 x0a(i);
16050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor  X0 x0b(f);
17050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor  X0 x0c = i;
18050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor  X0 x0d = f;
19050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor  accept_X0(i);
20050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor  accept_X0(&i);
21050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor  accept_X0(f);
22050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor  accept_X0(&f);
23050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor  X0 x0e(&i, &f);
24050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor  X0 x0f(&f, &i);
25050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor
26050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor  X0 x0g(f, &i); // expected-error{{no matching constructor}}
27050cabf8b5ba0448c07fca099f3bcfceb1ad77a1Douglas Gregor}
28088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregor
29088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregortemplate<typename T>
30088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregorstruct X1 {
31088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregor  X1(const X1&);
32088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregor  template<typename U> X1(const X1<U>&);
33088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregor};
34088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregor
35088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregortemplate<typename T>
36088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregorstruct Outer {
37088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregor  typedef X1<T> A;
38088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregor
39088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregor  A alloc;
40088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregor
41088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregor  explicit Outer(const A& a) : alloc(a) { }
42088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregor};
43088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregor
44088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregorvoid test_X1(X1<int> xi) {
45088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregor  Outer<int> oi(xi);
46088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregor  Outer<float> of(xi);
47088fc2495ca5387e2288db3aae812e4ba13ae371Douglas Gregor}
484ec1acac18e43dd4782f440d59432463e215fcabDouglas Gregor
494ec1acac18e43dd4782f440d59432463e215fcabDouglas Gregor// PR4655
504ec1acac18e43dd4782f440d59432463e215fcabDouglas Gregortemplate<class C> struct A {};
514ec1acac18e43dd4782f440d59432463e215fcabDouglas Gregortemplate <> struct A<int>{A(const A<int>&);};
524ec1acac18e43dd4782f440d59432463e215fcabDouglas Gregorstruct B { A<int> x; B(B& a) : x(a.x) {} };
53d87f5a7a7cb050e9cec8b330f06d1f034eddb417Douglas Gregor
54e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregorstruct X2 {
5584b499ee169a4de028ac44ffd1a360802b40dd89John McCall  X2(); // expected-note{{candidate constructor}}
5684b499ee169a4de028ac44ffd1a360802b40dd89John McCall  X2(X2&);	// expected-note {{candidate constructor}}
57e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor  template<typename T> X2(T);
58e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor};
59e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor
60e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas GregorX2 test(bool Cond, X2 x2) {
61e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor  if (Cond)
62e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor    return x2; // okay, uses copy constructor
63e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor
64ccfe15ea60d055936a15b370765006c10c25d81aDouglas Gregor  return X2(); // expected-error{{no matching constructor}}
65e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor}
66e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor
67e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregorstruct X3 {
68e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor  template<typename T> X3(T);
69e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor};
70e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor
71e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregortemplate<> X3::X3(X3); // expected-error{{must pass its first argument by reference}}
72e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor
73e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregorstruct X4 {
7449faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor  X4();
75e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor  ~X4();
7649faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor  X4(X4&);
77e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor  template<typename T> X4(const T&, int = 17);
78e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor};
79e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor
80e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas GregorX4 test_X4(bool Cond, X4 x4) {
81e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor  X4 a(x4, 17); // okay, constructor template
82e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor  X4 b(x4); // okay, copy constructor
8349faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor  return X4();
84e0eb15e014e6d9d4f819cbfacb26a068d1421ee7Douglas Gregor}
85dcbf08f1765a91c8c902d453cd0850188f2638e1Douglas Gregor
86dcbf08f1765a91c8c902d453cd0850188f2638e1Douglas Gregor// Instantiation of a non-dependent use of a constructor
87dcbf08f1765a91c8c902d453cd0850188f2638e1Douglas Gregorstruct DefaultCtorHasDefaultArg {
88dcbf08f1765a91c8c902d453cd0850188f2638e1Douglas Gregor  explicit DefaultCtorHasDefaultArg(int i = 17);
89dcbf08f1765a91c8c902d453cd0850188f2638e1Douglas Gregor};
90dcbf08f1765a91c8c902d453cd0850188f2638e1Douglas Gregor
91dcbf08f1765a91c8c902d453cd0850188f2638e1Douglas Gregortemplate<typename T>
92dcbf08f1765a91c8c902d453cd0850188f2638e1Douglas Gregorvoid default_ctor_inst() {
93dcbf08f1765a91c8c902d453cd0850188f2638e1Douglas Gregor  DefaultCtorHasDefaultArg def;
94dcbf08f1765a91c8c902d453cd0850188f2638e1Douglas Gregor}
95dcbf08f1765a91c8c902d453cd0850188f2638e1Douglas Gregor
96dcbf08f1765a91c8c902d453cd0850188f2638e1Douglas Gregortemplate void default_ctor_inst<int>();
97317e07ea35a2b1269d0b9095bdde70f2685f7015Douglas Gregor
98317e07ea35a2b1269d0b9095bdde70f2685f7015Douglas Gregortemplate<typename T>
99317e07ea35a2b1269d0b9095bdde70f2685f7015Douglas Gregorstruct X5 {
100317e07ea35a2b1269d0b9095bdde70f2685f7015Douglas Gregor  X5();
101317e07ea35a2b1269d0b9095bdde70f2685f7015Douglas Gregor  X5(const T &);
102317e07ea35a2b1269d0b9095bdde70f2685f7015Douglas Gregor};
103317e07ea35a2b1269d0b9095bdde70f2685f7015Douglas Gregor
104317e07ea35a2b1269d0b9095bdde70f2685f7015Douglas Gregorstruct X6 {
105317e07ea35a2b1269d0b9095bdde70f2685f7015Douglas Gregor  template<typename T> X6(T);
106317e07ea35a2b1269d0b9095bdde70f2685f7015Douglas Gregor};
107317e07ea35a2b1269d0b9095bdde70f2685f7015Douglas Gregor
108317e07ea35a2b1269d0b9095bdde70f2685f7015Douglas Gregorvoid test_X5_X6() {
109317e07ea35a2b1269d0b9095bdde70f2685f7015Douglas Gregor  X5<X6> tf;
110317e07ea35a2b1269d0b9095bdde70f2685f7015Douglas Gregor  X5<X6> tf2(tf);
111317e07ea35a2b1269d0b9095bdde70f2685f7015Douglas Gregor}
11249faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor
11349faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregornamespace PR8182 {
11449faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor  struct foo {
11549faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor    foo();
11649faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor    template<class T> foo(T&);
11749faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor
11849faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor  private:
11949faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor    foo(const foo&);
12049faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor  };
12149faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor
12249faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor  void test_foo() {
12349faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor    foo f1;
12449faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor    foo f2(f1);
12549faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor    foo f3 = f1;
12649faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor  }
12749faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor
12849faccdf4e9532c5c1e80581aab8ee622cf26a07Douglas Gregor}
129