fixit.cpp revision 36771d910b049cc534841c48ced90772784af446
16e1fd33116c2977174f2df17ac8bad2a32659db8Richard Smith// RUN: %clang_cc1 -pedantic -Wall -Wno-comment -verify -fcxx-exceptions -x c++ %s
236771d910b049cc534841c48ced90772784af446David Blaikie// RUN: %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits -x c++ %s 2>&1 | FileCheck %s
3ba5f6eced29937e4e4851a2c0980744768413d66Nick Lewycky// RUN: cp %s %t
46e1fd33116c2977174f2df17ac8bad2a32659db8Richard Smith// RUN: not %clang_cc1 -pedantic -Wall -Wno-comment -fcxx-exceptions -fixit -x c++ %t
56e1fd33116c2977174f2df17ac8bad2a32659db8Richard Smith// RUN: %clang_cc1 -fsyntax-only -pedantic -Wall -Werror -Wno-comment -fcxx-exceptions -x c++ %t
69b3064b55f3c858923734e8b1c9831777fc22554Douglas Gregor
79b3064b55f3c858923734e8b1c9831777fc22554Douglas Gregor/* This is a test of the various code modification hints that are
8fe057ac36b9a76cdfa37dfa003f986461fb5fb98Douglas Gregor   provided as part of warning or extension diagnostics. All of the
9fe057ac36b9a76cdfa37dfa003f986461fb5fb98Douglas Gregor   warnings will be fixed by -fixit, and the resulting file should
10fe057ac36b9a76cdfa37dfa003f986461fb5fb98Douglas Gregor   compile cleanly with -Werror -pedantic. */
119b3064b55f3c858923734e8b1c9831777fc22554Douglas Gregor
12ba5f6eced29937e4e4851a2c0980744768413d66Nick Lewyckystruct C1 {
13a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor  virtual void f();
14a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor  static void g();
15a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor};
169b3064b55f3c858923734e8b1c9831777fc22554Douglas Gregorstruct C2 : virtual public virtual C1 { }; // expected-error{{duplicate}}
179b3064b55f3c858923734e8b1c9831777fc22554Douglas Gregor
18a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregorvirtual void C1::f() { } // expected-error{{'virtual' can only be specified inside the class definition}}
19a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor
20a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregorstatic void C1::g() { } // expected-error{{'static' can only be specified inside the class definition}}
21a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor
22a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregortemplate<int Value> struct CT { }; // expected-note{{previous use is here}}
239b3064b55f3c858923734e8b1c9831777fc22554Douglas Gregor
249b3064b55f3c858923734e8b1c9831777fc22554Douglas GregorCT<10 >> 2> ct; // expected-warning{{require parentheses}}
25a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor
26a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregorclass C3 {
27a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregorpublic:
28a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor  C3(C3, int i = 0); // expected-error{{copy constructor must pass its first argument by reference}}
29a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor};
30a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor
31a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregorstruct CT<0> { }; // expected-error{{'template<>'}}
32a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregor
3398e13eac132c16466b75af3fd2365be09130e9d6Richard Smithtemplate<> union CT<1> { }; // expected-error{{tag type}}
34ad26b7376b6fd71d14b9b893eaa1ba79e029c830Anders Carlsson
3528485232e411b4a296f629bcabd3904dbb9cd7beDouglas Gregor// Access declarations
3628485232e411b4a296f629bcabd3904dbb9cd7beDouglas Gregorclass A {
3728485232e411b4a296f629bcabd3904dbb9cd7beDouglas Gregorprotected:
3828485232e411b4a296f629bcabd3904dbb9cd7beDouglas Gregor  int foo();
3928485232e411b4a296f629bcabd3904dbb9cd7beDouglas Gregor};
40ad26b7376b6fd71d14b9b893eaa1ba79e029c830Anders Carlsson
4128485232e411b4a296f629bcabd3904dbb9cd7beDouglas Gregorclass B : public A {
4228485232e411b4a296f629bcabd3904dbb9cd7beDouglas Gregor  A::foo; // expected-warning{{access declarations are deprecated}}
4328485232e411b4a296f629bcabd3904dbb9cd7beDouglas Gregor};
442eef829b19bdc59976a827fa39b409440e352bffDouglas Gregor
4598e13eac132c16466b75af3fd2365be09130e9d6Richard Smithvoid f() throw(); // expected-note{{previous}}
462eef829b19bdc59976a827fa39b409440e352bffDouglas Gregorvoid f(); // expected-warning{{missing exception specification}}
471aae80b173e22fa5d649f114eb6607efac350d79Douglas Gregor
481aae80b173e22fa5d649f114eb6607efac350d79Douglas Gregornamespace rdar7853795 {
491aae80b173e22fa5d649f114eb6607efac350d79Douglas Gregor  struct A {
501aae80b173e22fa5d649f114eb6607efac350d79Douglas Gregor    bool getNumComponents() const; // expected-note{{declared here}}
51ba5f6eced29937e4e4851a2c0980744768413d66Nick Lewycky    void dump() const {
521aae80b173e22fa5d649f114eb6607efac350d79Douglas Gregor      getNumComponenets(); // expected-error{{use of undeclared identifier 'getNumComponenets'; did you mean 'getNumComponents'?}}
531aae80b173e22fa5d649f114eb6607efac350d79Douglas Gregor    }
541aae80b173e22fa5d649f114eb6607efac350d79Douglas Gregor  };
551aae80b173e22fa5d649f114eb6607efac350d79Douglas Gregor}
56b1f6fa48960eae269a3931d1fc545ed468d9a4d2Douglas Gregor
57b1f6fa48960eae269a3931d1fc545ed468d9a4d2Douglas Gregornamespace rdar7796492 {
58f5485125ae70644c76b64ed3ff8a1c5fda937a82Benjamin Kramer  struct A { int x, y; A(); };
59b1f6fa48960eae269a3931d1fc545ed468d9a4d2Douglas Gregor
60b1f6fa48960eae269a3931d1fc545ed468d9a4d2Douglas Gregor  A::A()
61b1f6fa48960eae269a3931d1fc545ed468d9a4d2Douglas Gregor    : x(1) y(2) { // expected-error{{missing ',' between base or member initializers}}
62b1f6fa48960eae269a3931d1fc545ed468d9a4d2Douglas Gregor  }
63b1f6fa48960eae269a3931d1fc545ed468d9a4d2Douglas Gregor
64b1f6fa48960eae269a3931d1fc545ed468d9a4d2Douglas Gregor}
65a4a301dc74dd4e7da1c35cbb3c1e03614482728bGabor Greif
66c71d8eb6592ae3ef498fc57db3563d1dfae48dffFrancois Pichet// extra qualification on member
67c71d8eb6592ae3ef498fc57db3563d1dfae48dffFrancois Pichetclass C {
6875379455fc88ca1f021e55ffe1cab3a9c2b2a37aDouglas Gregor  int C::foo(); // expected-error {{extra qualification}}
69c71d8eb6592ae3ef498fc57db3563d1dfae48dffFrancois Pichet};
70c71d8eb6592ae3ef498fc57db3563d1dfae48dffFrancois Pichet
71a6eb5f81d13bacac01faff70a947047725b4413fArgyrios Kyrtzidisnamespace rdar8488464 {
72fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieuint x = 0;
73fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieuint x1 &= 0; // expected-error {{invalid '&=' at end of declaration; did you mean '='?}}
74fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieuint x2 *= 0; // expected-error {{invalid '*=' at end of declaration; did you mean '='?}}
75fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieuint x3 += 0; // expected-error {{invalid '+=' at end of declaration; did you mean '='?}}
76fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieuint x4 -= 0; // expected-error {{invalid '-=' at end of declaration; did you mean '='?}}
77fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieuint x5 != 0; // expected-error {{invalid '!=' at end of declaration; did you mean '='?}}
78fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieuint x6 /= 0; // expected-error {{invalid '/=' at end of declaration; did you mean '='?}}
79fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieuint x7 %= 0; // expected-error {{invalid '%=' at end of declaration; did you mean '='?}}
80fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieuint x8 <= 0; // expected-error {{invalid '<=' at end of declaration; did you mean '='?}}
81fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieuint x9 <<= 0; // expected-error {{invalid '<<=' at end of declaration; did you mean '='?}}
82fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieuint x10 >= 0; // expected-error {{invalid '>=' at end of declaration; did you mean '='?}}
83fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieuint x11 >>= 0; // expected-error {{invalid '>>=' at end of declaration; did you mean '='?}}
84fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieuint x12 ^= 0; // expected-error {{invalid '^=' at end of declaration; did you mean '='?}}
85fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieuint x13 |= 0; // expected-error {{invalid '|=' at end of declaration; did you mean '='?}}
86fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieuint x14 == 0; // expected-error {{invalid '==' at end of declaration; did you mean '='?}}
87a6eb5f81d13bacac01faff70a947047725b4413fArgyrios Kyrtzidis
88a6eb5f81d13bacac01faff70a947047725b4413fArgyrios Kyrtzidisvoid f() {
89fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    int x = 0;
90a6eb5f81d13bacac01faff70a947047725b4413fArgyrios Kyrtzidis    (void)x;
91fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    int x1 &= 0; // expected-error {{invalid '&=' at end of declaration; did you mean '='?}}
92fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    (void)x1;
93fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    int x2 *= 0; // expected-error {{invalid '*=' at end of declaration; did you mean '='?}}
94fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    (void)x2;
95fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    int x3 += 0; // expected-error {{invalid '+=' at end of declaration; did you mean '='?}}
96fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    (void)x3;
97fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    int x4 -= 0; // expected-error {{invalid '-=' at end of declaration; did you mean '='?}}
98fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    (void)x4;
99fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    int x5 != 0; // expected-error {{invalid '!=' at end of declaration; did you mean '='?}}
100fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    (void)x5;
101fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    int x6 /= 0; // expected-error {{invalid '/=' at end of declaration; did you mean '='?}}
102fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    (void)x6;
103fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    int x7 %= 0; // expected-error {{invalid '%=' at end of declaration; did you mean '='?}}
104fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    (void)x7;
105fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    int x8 <= 0; // expected-error {{invalid '<=' at end of declaration; did you mean '='?}}
106fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    (void)x8;
107fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    int x9 <<= 0; // expected-error {{invalid '<<=' at end of declaration; did you mean '='?}}
108fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    (void)x9;
109fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    int x10 >= 0; // expected-error {{invalid '>=' at end of declaration; did you mean '='?}}
110fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    (void)x10;
111fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    int x11 >>= 0; // expected-error {{invalid '>>=' at end of declaration; did you mean '='?}}
112fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    (void)x11;
113fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    int x12 ^= 0; // expected-error {{invalid '^=' at end of declaration; did you mean '='?}}
114fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    (void)x12;
115fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    int x13 |= 0; // expected-error {{invalid '|=' at end of declaration; did you mean '='?}}
116fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    (void)x13;
117fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    int x14 == 0; // expected-error {{invalid '==' at end of declaration; did you mean '='?}}
118fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    (void)x14;
119fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    if (int x = 0)  { (void)x; }
120fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    if (int x1 &= 0) { (void)x1; } // expected-error {{invalid '&=' at end of declaration; did you mean '='?}}
121fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    if (int x2 *= 0) { (void)x2; } // expected-error {{invalid '*=' at end of declaration; did you mean '='?}}
122fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    if (int x3 += 0) { (void)x3; } // expected-error {{invalid '+=' at end of declaration; did you mean '='?}}
123fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    if (int x4 -= 0) { (void)x4; } // expected-error {{invalid '-=' at end of declaration; did you mean '='?}}
124fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    if (int x5 != 0) { (void)x5; } // expected-error {{invalid '!=' at end of declaration; did you mean '='?}}
125fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    if (int x6 /= 0) { (void)x6; } // expected-error {{invalid '/=' at end of declaration; did you mean '='?}}
126fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    if (int x7 %= 0) { (void)x7; } // expected-error {{invalid '%=' at end of declaration; did you mean '='?}}
127fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    if (int x8 <= 0) { (void)x8; } // expected-error {{invalid '<=' at end of declaration; did you mean '='?}}
128fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    if (int x9 <<= 0) { (void)x9; } // expected-error {{invalid '<<=' at end of declaration; did you mean '='?}}
129fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    if (int x10 >= 0) { (void)x10; } // expected-error {{invalid '>=' at end of declaration; did you mean '='?}}
130fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    if (int x11 >>= 0) { (void)x11; } // expected-error {{invalid '>>=' at end of declaration; did you mean '='?}}
131fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    if (int x12 ^= 0) { (void)x12; } // expected-error {{invalid '^=' at end of declaration; did you mean '='?}}
132fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    if (int x13 |= 0) { (void)x13; } // expected-error {{invalid '|=' at end of declaration; did you mean '='?}}
133fcaf27e185695bdf755e202aeba9632e0a8ef3c6Richard Trieu    if (int x14 == 0) { (void)x14; } // expected-error {{invalid '==' at end of declaration; did you mean '='?}}
134a6eb5f81d13bacac01faff70a947047725b4413fArgyrios Kyrtzidis}
135a6eb5f81d13bacac01faff70a947047725b4413fArgyrios Kyrtzidis}
136a6eb5f81d13bacac01faff70a947047725b4413fArgyrios Kyrtzidis
1374147d307086cf024a40a080e2bf379e9725f6f41Francois Pichettemplate <class A>
1384147d307086cf024a40a080e2bf379e9725f6f41Francois Pichetclass F1 {
1394147d307086cf024a40a080e2bf379e9725f6f41Francois Pichetpublic:
1404147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet  template <int B>
1414147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet  class Iterator {
1424147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet  };
1434147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet};
1444147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet
1454147d307086cf024a40a080e2bf379e9725f6f41Francois Pichettemplate<class T>
1464147d307086cf024a40a080e2bf379e9725f6f41Francois Pichetclass F2  {
1474147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet  typename F1<T>:: /*template*/  Iterator<0> Mypos; // expected-error {{use 'template' keyword to treat 'Iterator' as a dependent template name}}
1484147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet};
1494147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet
1504147d307086cf024a40a080e2bf379e9725f6f41Francois Pichettemplate <class T>
1514147d307086cf024a40a080e2bf379e9725f6f41Francois Pichetvoid f(){
1524147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet  typename F1<T>:: /*template*/ Iterator<0> Mypos; // expected-error {{use 'template' keyword to treat 'Iterator' as a dependent template name}}
1534147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet}
1544147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet
1556722155dfe056e2c3dfbacbcaffae04dea0c2be0Anna Zaks// Tests for &/* fixits radar 7113438.
1566722155dfe056e2c3dfbacbcaffae04dea0c2be0Anna Zaksclass AD {};
1576722155dfe056e2c3dfbacbcaffae04dea0c2be0Anna Zaksclass BD: public AD {};
1586722155dfe056e2c3dfbacbcaffae04dea0c2be0Anna Zaks
1596722155dfe056e2c3dfbacbcaffae04dea0c2be0Anna Zaksvoid test (BD &br) {
1606722155dfe056e2c3dfbacbcaffae04dea0c2be0Anna Zaks  AD* aPtr;
1616722155dfe056e2c3dfbacbcaffae04dea0c2be0Anna Zaks  BD b;
1626722155dfe056e2c3dfbacbcaffae04dea0c2be0Anna Zaks  aPtr = b; // expected-error {{assigning to 'AD *' from incompatible type 'BD'; take the address with &}}
16398e13eac132c16466b75af3fd2365be09130e9d6Richard Smith  aPtr = br; // expected-error {{assigning to 'AD *' from incompatible type 'BD'; take the address with &}}
1646722155dfe056e2c3dfbacbcaffae04dea0c2be0Anna Zaks}
1656722155dfe056e2c3dfbacbcaffae04dea0c2be0Anna Zaks
166d37b360bf9f954af119c9805fdc79ab9d30e06c6Richard Smithvoid foo1() const {} // expected-error {{non-member function cannot have 'const' qualifier}}
167d37b360bf9f954af119c9805fdc79ab9d30e06c6Richard Smithvoid foo2() volatile {} // expected-error {{non-member function cannot have 'volatile' qualifier}}
168d37b360bf9f954af119c9805fdc79ab9d30e06c6Richard Smithvoid foo3() const volatile {} // expected-error {{non-member function cannot have 'const volatile' qualifier}}
1694147d307086cf024a40a080e2bf379e9725f6f41Francois Pichet
1700706df40064d4d7559b4304af79d519033414b84Richard Smithstruct S { void f(int, char); };
1710706df40064d4d7559b4304af79d519033414b84Richard Smithint itsAComma,
1720706df40064d4d7559b4304af79d519033414b84Richard SmithitsAComma2 = 0,
17398e13eac132c16466b75af3fd2365be09130e9d6Richard SmithoopsAComma(42), // expected-error {{expected ';' at end of declaration}}
1740706df40064d4d7559b4304af79d519033414b84Richard SmithAD oopsMoreCommas() {
17598e13eac132c16466b75af3fd2365be09130e9d6Richard Smith  static int n = 0, // expected-error {{expected ';' at end of declaration}}
1760706df40064d4d7559b4304af79d519033414b84Richard Smith  static char c,
17798e13eac132c16466b75af3fd2365be09130e9d6Richard Smith  &d = c, // expected-error {{expected ';' at end of declaration}}
17898e13eac132c16466b75af3fd2365be09130e9d6Richard Smith  S s, // expected-error {{expected ';' at end of declaration}}
1790706df40064d4d7559b4304af79d519033414b84Richard Smith  s.f(n, d);
18098e13eac132c16466b75af3fd2365be09130e9d6Richard Smith  AD ad, // expected-error {{expected ';' at end of declaration}}
1810706df40064d4d7559b4304af79d519033414b84Richard Smith  return ad;
1820706df40064d4d7559b4304af79d519033414b84Richard Smith}
1831c94c16317c1a35c1549e022958188eea2567089Richard Smithstruct MoreAccidentalCommas {
1841c94c16317c1a35c1549e022958188eea2567089Richard Smith  int a : 5,
1851c94c16317c1a35c1549e022958188eea2567089Richard Smith      b : 7,
1861c94c16317c1a35c1549e022958188eea2567089Richard Smith        : 4, // expected-error {{expected ';' at end of declaration}}
1871c94c16317c1a35c1549e022958188eea2567089Richard Smith  char c, // expected-error {{expected ';' at end of declaration}}
1881c94c16317c1a35c1549e022958188eea2567089Richard Smith  double d, // expected-error {{expected ';' at end of declaration}}
1891c94c16317c1a35c1549e022958188eea2567089Richard Smith  MoreAccidentalCommas *next, // expected-error {{expected ';' at end of declaration}}
1901c94c16317c1a35c1549e022958188eea2567089Richard Smithpublic:
1911c94c16317c1a35c1549e022958188eea2567089Richard Smith  int k, // expected-error {{expected ';' at end of declaration}}
1921c94c16317c1a35c1549e022958188eea2567089Richard Smith  friend void f(MoreAccidentalCommas) {}
1931c94c16317c1a35c1549e022958188eea2567089Richard Smith  int k2, // expected-error {{expected ';' at end of declaration}}
1941c94c16317c1a35c1549e022958188eea2567089Richard Smith  virtual void g(), // expected-error {{expected ';' at end of declaration}}
1951c94c16317c1a35c1549e022958188eea2567089Richard Smith};
196874d253668f9ed183ca409cdff9d424925ee7800Richard Smith
1976e1fd33116c2977174f2df17ac8bad2a32659db8Richard Smithtemplate<class T> struct Mystery;
1986e1fd33116c2977174f2df17ac8bad2a32659db8Richard Smithtemplate<class T> typedef Mystery<T>::type getMysteriousThing() { // \
1996e1fd33116c2977174f2df17ac8bad2a32659db8Richard Smith  expected-error {{function definition declared 'typedef'}} \
2006e1fd33116c2977174f2df17ac8bad2a32659db8Richard Smith  expected-error {{missing 'typename' prior to dependent}}
2016e1fd33116c2977174f2df17ac8bad2a32659db8Richard Smith  return Mystery<T>::get();
2026e1fd33116c2977174f2df17ac8bad2a32659db8Richard Smith}
203460ef136eb96b879f149c8703938a13c35b4bc68David Blaikie
204673720d8cfbc8c9d08faec2817f1e1452e4ecc2eDavid Blaikietemplate<template<typename> Foo, // expected-error {{template template parameter requires 'class' after the parameter list}}
205673720d8cfbc8c9d08faec2817f1e1452e4ecc2eDavid Blaikie         template<typename> typename Bar, // expected-error {{template template parameter requires 'class' after the parameter list}}
206673720d8cfbc8c9d08faec2817f1e1452e4ecc2eDavid Blaikie         template<typename> struct Baz> // expected-error {{template template parameter requires 'class' after the parameter list}}
207460ef136eb96b879f149c8703938a13c35b4bc68David Blaikievoid func();
208434ed260eb28cacd1b87fc2429dfee66d61dfcf0Kaelyn Uhrain
209434ed260eb28cacd1b87fc2429dfee66d61dfcf0Kaelyn Uhrainnamespace ShadowedTagType {
210434ed260eb28cacd1b87fc2429dfee66d61dfcf0Kaelyn Uhrainclass Foo {
211434ed260eb28cacd1b87fc2429dfee66d61dfcf0Kaelyn Uhrain public:
212434ed260eb28cacd1b87fc2429dfee66d61dfcf0Kaelyn Uhrain  enum Bar { X, Y };
213434ed260eb28cacd1b87fc2429dfee66d61dfcf0Kaelyn Uhrain  void SetBar(Bar bar);
214392b3f5798a62fe038082df0a5e2244b08b917d8Kaelyn Uhrain  Bar Bar(); // expected-note 2 {{enum 'Bar' is hidden by a non-type declaration of 'Bar' here}}
215434ed260eb28cacd1b87fc2429dfee66d61dfcf0Kaelyn Uhrain private:
216434ed260eb28cacd1b87fc2429dfee66d61dfcf0Kaelyn Uhrain  Bar bar_; // expected-error {{must use 'enum' tag to refer to type 'Bar' in this scope}}
217434ed260eb28cacd1b87fc2429dfee66d61dfcf0Kaelyn Uhrain};
218434ed260eb28cacd1b87fc2429dfee66d61dfcf0Kaelyn Uhrainvoid Foo::SetBar(Bar bar) { bar_ = bar; } // expected-error {{must use 'enum' tag to refer to type 'Bar' in this scope}}
2191e77b65b4819bc7a809245b12bd00450b4924025Kaelyn Uhrain}
2202b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain
2212c0abf4ae33ab2ba690ccae724b8d6f196e7cfdaDavid Blaikie#define NULL __null
2222c0abf4ae33ab2ba690ccae724b8d6f196e7cfdaDavid Blaikiechar c = NULL; // expected-warning {{implicit conversion of NULL constant to 'char'}}
223b26331b4ff419b22861b0823daf83bc8f22a6803David Blaikiedouble dbl = NULL; // expected-warning {{implicit conversion of NULL constant to 'double'}}
2242c0abf4ae33ab2ba690ccae724b8d6f196e7cfdaDavid Blaikie
2252b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrainnamespace arrow_suggest {
2262b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain
2272b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhraintemplate <typename T>
2282b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrainclass wrapped_ptr {
2292b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain public:
2302b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  wrapped_ptr(T* ptr) : ptr_(ptr) {}
2312b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  T* operator->() { return ptr_; }
2322b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain private:
2332b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  T *ptr_;
2342b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain};
2352b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain
2362b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrainclass Worker {
2372b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain public:
2382b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  void DoSomething();
2392b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain};
2402b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain
2412b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrainvoid test() {
2422b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  wrapped_ptr<Worker> worker(new Worker);
2432b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain  worker.DoSomething(); // expected-error {{no member named 'DoSomething' in 'arrow_suggest::wrapped_ptr<arrow_suggest::Worker>'; did you mean to use '->' instead of '.'?}}
2442b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain}
2452b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain
2462b90f7637e846ea555dedac14e7f5065d85c5d3bKaelyn Uhrain} // namespace arrow_suggest
247b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrain
248b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrain// Make sure fixing namespace-qualified identifiers functions properly with
249b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrain// namespace-aware typo correction/
250b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrainnamespace redecl_typo {
251b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrainnamespace Foo {
252b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrain  void BeEvil(); // expected-note {{'BeEvil' declared here}}
253b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrain}
254b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrainnamespace Bar {
255b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrain  namespace Foo {
256b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrain    bool isGood(); // expected-note {{'Bar::Foo::isGood' declared here}}
257b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrain    void beEvil();
258b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrain  }
259b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrain}
260b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrainbool Foo::isGood() { // expected-error {{out-of-line definition of 'isGood' does not match any declaration in namespace 'redecl_typo::Foo'; did you mean 'Bar::Foo::isGood'?}}
261b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrain  return true;
262b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrain}
263b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrainvoid Foo::beEvil() {} // expected-error {{out-of-line definition of 'beEvil' does not match any declaration in namespace 'redecl_typo::Foo'; did you mean 'BeEvil'?}}
264b7fe579968a2fad25d95514f96c6649aae519c81Kaelyn Uhrain}
26519a2702042b7e3ee838cca458b35f607111a3897Richard Smith
26619a2702042b7e3ee838cca458b35f607111a3897Richard Smith// Test behavior when a template-id is ended by a token which starts with '>'.
26719a2702042b7e3ee838cca458b35f607111a3897Richard Smithnamespace greatergreater {
26819a2702042b7e3ee838cca458b35f607111a3897Richard Smith  template<typename T> struct S { S(); S(T); };
26919a2702042b7e3ee838cca458b35f607111a3897Richard Smith  void f(S<int>=0); // expected-error {{a space is required between a right angle bracket and an equals sign (use '> =')}}
27019a2702042b7e3ee838cca458b35f607111a3897Richard Smith
27119a2702042b7e3ee838cca458b35f607111a3897Richard Smith  // FIXME: The fix-its here overlap so -fixit mode can't apply the second one.
27219a2702042b7e3ee838cca458b35f607111a3897Richard Smith  //void f(S<S<int>>=S<int>());
27319a2702042b7e3ee838cca458b35f607111a3897Richard Smith
27419a2702042b7e3ee838cca458b35f607111a3897Richard Smith  struct Shr {
27519a2702042b7e3ee838cca458b35f607111a3897Richard Smith    template<typename T> Shr(T);
27619a2702042b7e3ee838cca458b35f607111a3897Richard Smith    template<typename T> void operator >>=(T);
27719a2702042b7e3ee838cca458b35f607111a3897Richard Smith  };
27819a2702042b7e3ee838cca458b35f607111a3897Richard Smith
27919a2702042b7e3ee838cca458b35f607111a3897Richard Smith  template<template<typename>> struct TemplateTemplateParam; // expected-error {{requires 'class'}}
28019a2702042b7e3ee838cca458b35f607111a3897Richard Smith
28119a2702042b7e3ee838cca458b35f607111a3897Richard Smith  template<typename T> void t();
28219a2702042b7e3ee838cca458b35f607111a3897Richard Smith  void g() {
28319a2702042b7e3ee838cca458b35f607111a3897Richard Smith    void (*p)() = &t<int>;
28419a2702042b7e3ee838cca458b35f607111a3897Richard Smith    (void)(&t<int>==p); // expected-error {{use '> ='}}
28519a2702042b7e3ee838cca458b35f607111a3897Richard Smith    (void)(&t<int>>=p); // expected-error {{use '> >'}}
28619a2702042b7e3ee838cca458b35f607111a3897Richard Smith    (void)(&t<S<int>>>=p); // expected-error {{use '> >'}}
28719a2702042b7e3ee838cca458b35f607111a3897Richard Smith    (Shr)&t<S<int>>>>=p; // expected-error {{use '> >'}}
28819a2702042b7e3ee838cca458b35f607111a3897Richard Smith
28919a2702042b7e3ee838cca458b35f607111a3897Richard Smith    // FIXME: We correct this to '&t<int> > >= p;' not '&t<int> >>= p;'
29019a2702042b7e3ee838cca458b35f607111a3897Richard Smith    //(Shr)&t<int>>>=p;
29119a2702042b7e3ee838cca458b35f607111a3897Richard Smith
29219a2702042b7e3ee838cca458b35f607111a3897Richard Smith    // FIXME: The fix-its here overlap.
29319a2702042b7e3ee838cca458b35f607111a3897Richard Smith    //(void)(&t<S<int>>==p);
29419a2702042b7e3ee838cca458b35f607111a3897Richard Smith  }
29519a2702042b7e3ee838cca458b35f607111a3897Richard Smith}
296abeadfb11fde148f15c2fd67015e8163609d5b68David Blaikie
297abeadfb11fde148f15c2fd67015e8163609d5b68David Blaikieclass foo {
298abeadfb11fde148f15c2fd67015e8163609d5b68David Blaikie  static void test() {
299abeadfb11fde148f15c2fd67015e8163609d5b68David Blaikie    (void)&i; // expected-error{{must explicitly qualify name of member function when taking its address}}
300abeadfb11fde148f15c2fd67015e8163609d5b68David Blaikie  }
301abeadfb11fde148f15c2fd67015e8163609d5b68David Blaikie  int i();
302abeadfb11fde148f15c2fd67015e8163609d5b68David Blaikie};
30336771d910b049cc534841c48ced90772784af446David Blaikie
30436771d910b049cc534841c48ced90772784af446David Blaikienamespace dtor_fixit {
30536771d910b049cc534841c48ced90772784af446David Blaikie  class foo {
30636771d910b049cc534841c48ced90772784af446David Blaikie    ~bar() { }  // expected-error {{expected the class name after '~' to name a destructor}}
30736771d910b049cc534841c48ced90772784af446David Blaikie    // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:6-[[@LINE-1]]:9}:"foo"
30836771d910b049cc534841c48ced90772784af446David Blaikie  };
30936771d910b049cc534841c48ced90772784af446David Blaikie}
310