11d23c4219527d9a2bc75f5cdb1ffcaefb8bcc61bDavid Blaikie// RUN: %clang_cc1 -fsyntax-only -verify -Wno-bool-conversion %s
21be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
31be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregortypedef __typeof__(((int*)0)-((int*)0)) ptrdiff_t;
41be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
51be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregornamespace DontResolveTooEarly_WaitForOverloadResolution
61be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor{
71be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  template <class T> T* f(int);	// #1
81be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  template <class T, class U> T& f(U); // #2
91be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
101be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  void g() {
111be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor    int *ip = f<int>(1);	// calls #1
121be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  }
131be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
141be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  template <class T>
151be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor    T* f2(int);
161be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  template <class T, class U>
171be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor    T& f2(U);
181be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
191be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  void g2() {
201be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor    int*ip = (f2<int>)(1); // ok
211be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  }
221be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
231be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor} // End namespace
241be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
25353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregornamespace DontAllowUnresolvedOverloadedExpressionInAnUnusedExpression
26353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor{
27353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor  void one() { }
28353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor  template<class T> void oneT() { }
29353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor
306dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  void two() { } // expected-note 2 {{possible target for call}}
316dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  void two(int) { } // expected-note 2 {{possible target for call}}
326dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  template<class T> void twoT() { }  // expected-note 2 {{possible target for call}}
336dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  template<class T> void twoT(T) { }  // expected-note 2 {{possible target for call}}
34353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor
35353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor  void check()
36353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor  {
37353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor    one; // expected-warning {{expression result unused}}
386dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    two; // expected-error{{reference to overloaded function could not be resolved; did you mean to call it with no arguments?}}
39353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor    oneT<int>; // expected-warning {{expression result unused}}
406dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    twoT<int>; // expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}}
41353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor  }
42353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor
43353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor  // check the template function case
44353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor  template<class T> void check()
45353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor  {
46353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor    one; // expected-warning {{expression result unused}}
476dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    two; // expected-error{{reference to overloaded function could not be resolved; did you mean to call it with no arguments?}}
48353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor    oneT<int>; // expected-warning {{expression result unused}}
496dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    twoT<int>; // expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}}
50353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor
51353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor  }
52353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor
53353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor}
54353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor
551be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  template<typename T>
561be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor    void twoT() { }
571be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  template<typename T, typename U>
581be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor    void twoT(T) { }
591be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
601be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
611be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  void two() { }; //expected-note 5{{candidate}}
621be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  void two(int) { }; //expected-note 5{{candidate}}
631be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
641be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
651be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
661be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  void one() { }
671be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  template<class T>
681be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor    void oneT() { }
691be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
701be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  template<class T>
711be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  void cant_resolve() { } //expected-note 3{{candidate}}
721be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
731be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  template<class T> void cant_resolve(T) { }//expected-note 3{{candidate}}
741be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
751be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
761be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregorint main()
771be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor{
78353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor
791be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { static_cast<void>(one); }
801be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { (void)(one); }
811be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { static_cast<void>(oneT<int>); }
821be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { (void)(oneT<int>); }
831be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
84fb8721ce4c6fef3739b1cbd1e38e3f1949462033John McCall  { static_cast<void>(two); } // expected-error {{address of overloaded function 'two' cannot be static_cast to type 'void'}}
85fb8721ce4c6fef3739b1cbd1e38e3f1949462033John McCall  { (void)(two); } // expected-error {{address of overloaded function 'two' cannot be cast to type 'void'}}
861be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { static_cast<void>(twoT<int>); }
871be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { (void)(twoT<int>); }
881be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
891be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
901be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { ptrdiff_t x = reinterpret_cast<ptrdiff_t>(oneT<int>); }
911be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { (void) reinterpret_cast<int (*)(char, double)>(oneT<int>); }
921be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { (void) reinterpret_cast<ptrdiff_t>(one); }
931be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { (void) reinterpret_cast<int (*)(char, double)>(one); }
941be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
951be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { ptrdiff_t x = reinterpret_cast<ptrdiff_t>(twoT<int>); }
961be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { (void) reinterpret_cast<int (*)(char, double)>(twoT<int>); }
971be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { (void) reinterpret_cast<void (*)(int)>(two); } //expected-error {{reinterpret_cast}}
981be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { (void) static_cast<void (*)(int)>(two); } //ok
991be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
1001be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { (void) reinterpret_cast<int>(two); } //expected-error {{reinterpret_cast}}
1011be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { (void) reinterpret_cast<int (*)(char, double)>(two); } //expected-error {{reinterpret_cast}}
1021be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
1032def77399ab3088106a2d61372344f5b7104e1a2David Blaikie  { bool b = (twoT<int>); }
1042def77399ab3088106a2d61372344f5b7104e1a2David Blaikie  { bool b = (twoT<int, int>); }
1051be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
1061be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { bool b = &twoT<int>; //&foo<int>; }
1071be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor    b = &(twoT<int>); }
1081be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
1091be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { ptrdiff_t x = (ptrdiff_t) &twoT<int>;
1101be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor      x = (ptrdiff_t) &twoT<int>; }
1111be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
1121be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { ptrdiff_t x = (ptrdiff_t) twoT<int>;
1131be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor      x = (ptrdiff_t) twoT<int>; }
1141be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
1151be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
1161be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { ptrdiff_t x = (ptrdiff_t) &twoT<int,int>;
1171be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  x = (ptrdiff_t) &twoT<int>; }
1181be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
1192fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu  { oneT<int>;   &oneT<int>; } //expected-warning 2{{expression result unused}}
1201be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { static_cast<void>(cant_resolve<int>); } // expected-error {{address of overload}}
1211be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { bool b = cant_resolve<int>; } // expected-error {{address of overload}}
1221be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor  { (void) cant_resolve<int>; } // expected-error {{address of overload}}
1231be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
1241be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor}
1251be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor
12690434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruthnamespace member_pointers {
12790434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth  struct S {
128c2fe81898b1b3b948791ca4ababd3d495601f22aDavid Blaikie    template <typename T> bool f(T) { return false; } // expected-note 4 {{possible target for call}}
12990434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    template <typename T> static bool g(T) { return false; }
13090434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth
1316dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    template <typename T> bool h(T) { return false; }  // expected-note 3 {{possible target for call}}
1326dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    template <int N> static bool h(int) { return false; } // expected-note 3 {{possible target for call}}
13390434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth  };
13490434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth
13590434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth  void test(S s) {
13690434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    if (S::f<char>) return; // expected-error {{call to non-static member function without an object argument}}
13790434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    if (S::f<int>) return; // expected-error {{call to non-static member function without an object argument}}
13890434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    if (&S::f<char>) return;
13990434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    if (&S::f<int>) return;
1406dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    if (s.f<char>) return; // expected-error {{reference to non-static member function must be called}}
1416dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    if (s.f<int>) return; // expected-error {{reference to non-static member function must be called}}
142864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    if (&s.f<char>) return; // expected-error {{cannot create a non-constant pointer to member function}}
143864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    if (&s.f<int>) return; // expected-error {{cannot create a non-constant pointer to member function}}
14490434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth
1452def77399ab3088106a2d61372344f5b7104e1a2David Blaikie    if (S::g<char>) return;
1462def77399ab3088106a2d61372344f5b7104e1a2David Blaikie    if (S::g<int>) return;
14790434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    if (&S::g<char>) return;
14890434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    if (&S::g<int>) return;
1492def77399ab3088106a2d61372344f5b7104e1a2David Blaikie    if (s.g<char>) return;
1502def77399ab3088106a2d61372344f5b7104e1a2David Blaikie    if (s.g<int>) return;
15190434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    if (&s.g<char>) return;
15290434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    if (&s.g<int>) return;
15390434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth
1542def77399ab3088106a2d61372344f5b7104e1a2David Blaikie    if (S::h<42>) return;
1556dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    if (S::h<int>) return; // expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}}
15690434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    if (&S::h<42>) return;
15790434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    if (&S::h<int>) return;
1582def77399ab3088106a2d61372344f5b7104e1a2David Blaikie    if (s.h<42>) return;
1596dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    if (s.h<int>) return; // expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}}
16090434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    if (&s.h<42>) return;
1616dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    if (&s.h<int>) return; // expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}}
16290434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth
16390434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    { bool b = S::f<char>; } // expected-error {{call to non-static member function without an object argument}}
16490434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    { bool b = S::f<int>; } // expected-error {{call to non-static member function without an object argument}}
16590434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    { bool b = &S::f<char>; }
16690434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    { bool b = &S::f<int>; }
167864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    // These next two errors are terrible.
1685acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall    { bool b = s.f<char>; } // expected-error {{reference to non-static member function must be called}}
1695acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall    { bool b = s.f<int>; } // expected-error {{reference to non-static member function must be called}}
170864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    { bool b = &s.f<char>; } // expected-error {{cannot create a non-constant pointer to member function}}
171864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    { bool b = &s.f<int>; } // expected-error {{cannot create a non-constant pointer to member function}}
17290434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth
1732def77399ab3088106a2d61372344f5b7104e1a2David Blaikie    { bool b = S::g<char>; }
1742def77399ab3088106a2d61372344f5b7104e1a2David Blaikie    { bool b = S::g<int>; }
17590434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    { bool b = &S::g<char>; }
17690434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    { bool b = &S::g<int>; }
1772def77399ab3088106a2d61372344f5b7104e1a2David Blaikie    { bool b = s.g<char>; }
1782def77399ab3088106a2d61372344f5b7104e1a2David Blaikie    { bool b = s.g<int>; }
17990434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    { bool b = &s.g<char>; }
18090434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    { bool b = &s.g<int>; }
18190434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth
1822def77399ab3088106a2d61372344f5b7104e1a2David Blaikie    { bool b = S::h<42>; }
18390434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    { bool b = S::h<int>; } // expected-error {{can't form member pointer of type 'bool' without '&' and class name}}
18490434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    { bool b = &S::h<42>; }
18590434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    { bool b = &S::h<int>; }
1862def77399ab3088106a2d61372344f5b7104e1a2David Blaikie    { bool b = s.h<42>; }
18790434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    { bool b = s.h<int>; } // expected-error {{can't form member pointer of type 'bool' without '&' and class name}}
18890434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    { bool b = &s.h<42>; }
18990434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth    { bool b = &s.h<int>; } // expected-error {{can't form member pointer of type 'bool' without '&' and class name}}
19090434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth  }
19190434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth}
192