15f31f0893d75203c326ddcd9808099bbfe34aec0David Blaikie// RUN: %clang_cc1 -fsyntax-only -verify -Wno-c++11-extensions %s
26c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrain//
36c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrain// WARNING: Do not add more typo correction test cases to this file lest you run
46c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrain// afoul the hard-coded limit (escape hatch) of 20 different typos whose
56c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrain// correction was attempted by Sema::CorrectTypo
6fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain
7fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrainstruct errc {
8fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain  int v_;
9fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain  operator int() const {return v_;}
10fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain};
11fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain
12fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrainclass error_condition
13fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain{
14fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain  int _val_;
15fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrainpublic:
16fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain  error_condition() : _val_(0) {}
17fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain
18fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain  error_condition(int _val)
19fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain    : _val_(_val) {}
20fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain
21fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain  template <class E>
22257e17f9b61614a43d6317dcb5ba0801564f25b7Kaelyn Uhrain  error_condition(E _e) {
23257e17f9b61614a43d6317dcb5ba0801564f25b7Kaelyn Uhrain    // make_error_condition must not be typo corrected to error_condition
24257e17f9b61614a43d6317dcb5ba0801564f25b7Kaelyn Uhrain    // even though the first declaration of make_error_condition has not
25257e17f9b61614a43d6317dcb5ba0801564f25b7Kaelyn Uhrain    // yet been encountered. This was a bug in the first version of the type
26257e17f9b61614a43d6317dcb5ba0801564f25b7Kaelyn Uhrain    // name typo correction patch that wasn't noticed until building LLVM with
27257e17f9b61614a43d6317dcb5ba0801564f25b7Kaelyn Uhrain    // Clang failed.
28257e17f9b61614a43d6317dcb5ba0801564f25b7Kaelyn Uhrain    *this = make_error_condition(_e);
29257e17f9b61614a43d6317dcb5ba0801564f25b7Kaelyn Uhrain  }
30fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain
31fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain};
32fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain
33fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhraininline error_condition make_error_condition(errc _e) {
34fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain  return error_condition(static_cast<int>(_e));
35fac9467d1676dc05761e12e41e13e01a3a3da52bKaelyn Uhrain}
367d5e6948e6a4e04ee67b607f931d90d3063579f2Kaelyn Uhrain
377d5e6948e6a4e04ee67b607f931d90d3063579f2Kaelyn Uhrain
387d5e6948e6a4e04ee67b607f931d90d3063579f2Kaelyn Uhrain// Prior to the introduction of a callback object to further filter possible
397d5e6948e6a4e04ee67b607f931d90d3063579f2Kaelyn Uhrain// typo corrections, this example would not trigger a suggestion as "base_type"
407d5e6948e6a4e04ee67b607f931d90d3063579f2Kaelyn Uhrain// is a closer match to "basetype" than is "BaseType" but "base_type" does not
417d5e6948e6a4e04ee67b607f931d90d3063579f2Kaelyn Uhrain// refer to a base class or non-static data member.
427d5e6948e6a4e04ee67b607f931d90d3063579f2Kaelyn Uhrainstruct BaseType { };
437d5e6948e6a4e04ee67b607f931d90d3063579f2Kaelyn Uhrainstruct Derived : public BaseType { // expected-note {{base class 'BaseType' specified here}}
44e4c7f90da208ed2caeab784b32f416a50eed8da3Kaelyn Uhrain  static int base_type; // expected-note {{'base_type' declared here}}
457d5e6948e6a4e04ee67b607f931d90d3063579f2Kaelyn Uhrain  Derived() : basetype() {} // expected-error{{initializer 'basetype' does not name a non-static data member or base class; did you mean the base class 'BaseType'?}}
467d5e6948e6a4e04ee67b607f931d90d3063579f2Kaelyn Uhrain};
47dc98cd0cdd2eee8290b624ef69c6d91ce626d85eKaelyn Uhrain
48f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain// Test the improvement from passing a callback object to CorrectTypo in
49f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain// the helper function LookupMemberExprInRecord.
50e4c7f90da208ed2caeab784b32f416a50eed8da3Kaelyn Uhrainint get_type(struct Derived *st) {
51e4c7f90da208ed2caeab784b32f416a50eed8da3Kaelyn Uhrain  return st->Base_Type; // expected-error{{no member named 'Base_Type' in 'Derived'; did you mean 'base_type'?}}
52e4c7f90da208ed2caeab784b32f416a50eed8da3Kaelyn Uhrain}
53e4c7f90da208ed2caeab784b32f416a50eed8da3Kaelyn Uhrain
54dc98cd0cdd2eee8290b624ef69c6d91ce626d85eKaelyn Uhrain// In this example, somename should not be corrected to the cached correction
55dc98cd0cdd2eee8290b624ef69c6d91ce626d85eKaelyn Uhrain// "some_name" since "some_name" is a class and a namespace name is needed.
56dc98cd0cdd2eee8290b624ef69c6d91ce626d85eKaelyn Uhrainclass some_name {}; // expected-note {{'some_name' declared here}}
57dc98cd0cdd2eee8290b624ef69c6d91ce626d85eKaelyn Uhrainsomename Foo; // expected-error {{unknown type name 'somename'; did you mean 'some_name'?}}
58dc98cd0cdd2eee8290b624ef69c6d91ce626d85eKaelyn Uhrainnamespace SomeName {} // expected-note {{namespace 'SomeName' defined here}}
59dc98cd0cdd2eee8290b624ef69c6d91ce626d85eKaelyn Uhrainusing namespace somename; // expected-error {{no namespace named 'somename'; did you mean 'SomeName'?}}
60425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain
61425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain
62425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain// Without the callback object, CorrectTypo would choose "field1" as the
63425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain// correction for "fielda" as it is closer than "FieldA", but that correction
64425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain// would be later discarded by the caller and no suggestion would be given.
65425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrainstruct st {
66425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain  struct {
67425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain    int field1;
68425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain  };
69425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain  double FieldA; // expected-note{{'FieldA' declared here}}
70425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrain};
71425d631082699b37624a7b1d6abb87c7abd5abe6Kaelyn Uhrainst var = { .fielda = 0.0 }; // expected-error{{field designator 'fielda' does not refer to any field in type 'st'; did you mean 'FieldA'?}}
723b4b047ff0ebaefeaed0a5f545b4fa91f18e6cdbKaelyn Uhrain
73f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain// Test the improvement from passing a callback object to CorrectTypo in
7443e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrain// Sema::BuildCXXNestedNameSpecifier. And also for the improvement by doing
7543e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrain// so in Sema::getTypeName.
7643e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhraintypedef char* another_str; // expected-note{{'another_str' declared here}}
773b4b047ff0ebaefeaed0a5f545b4fa91f18e6cdbKaelyn Uhrainnamespace AnotherStd { // expected-note{{'AnotherStd' declared here}}
783b4b047ff0ebaefeaed0a5f545b4fa91f18e6cdbKaelyn Uhrain  class string {};
793b4b047ff0ebaefeaed0a5f545b4fa91f18e6cdbKaelyn Uhrain}
803b4b047ff0ebaefeaed0a5f545b4fa91f18e6cdbKaelyn Uhrainanother_std::string str; // expected-error{{use of undeclared identifier 'another_std'; did you mean 'AnotherStd'?}}
8143e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrainanother_str *cstr = new AnotherStr; // expected-error{{unknown type name 'AnotherStr'; did you mean 'another_str'?}}
82f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain
83f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain// Test the improvement from passing a callback object to CorrectTypo in
84f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain// Sema::ActOnSizeofParameterPackExpr.
85f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrainchar* TireNames;
86f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhraintemplate<typename ...TypeNames> struct count { // expected-note{{parameter pack 'TypeNames' declared here}}
87f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain  static const unsigned value = sizeof...(TyreNames); // expected-error{{'TyreNames' does not refer to the name of a parameter pack; did you mean 'TypeNames'?}}
88f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain};
8943e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrain
9043e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrain// Test the typo-correction callback in Sema::DiagnoseUnknownTypeName.
9143e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrainnamespace unknown_type_test {
92438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrain  class StreamOut {}; // expected-note 2 {{'StreamOut' declared here}}
93438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrain  long stream_count; // expected-note 2 {{'stream_count' declared here}}
9443e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrain};
9543e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrainunknown_type_test::stream_out out; // expected-error{{no type named 'stream_out' in namespace 'unknown_type_test'; did you mean 'StreamOut'?}}
9643e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrain
97438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrain// Demonstrate a case where using only the cached value returns the wrong thing
98438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrain// when the cached value was the result of a previous callback object that only
99438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrain// accepts a subset of the current callback object.
100438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrainnamespace {
101438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrainusing namespace unknown_type_test;
102438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrainvoid bar(long i);
103438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrainvoid before_caching_classname() {
104438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrain  bar((stream_out)); // expected-error{{use of undeclared identifier 'stream_out'; did you mean 'stream_count'?}}
105438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrain}
106438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrainstream_out out; // expected-error{{unknown type name 'stream_out'; did you mean 'StreamOut'?}}
107438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrainvoid after_caching_classname() {
108438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrain  bar((stream_out)); // expected-error{{use of undeclared identifier 'stream_out'; did you mean 'stream_count'?}}
109438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrain}
110438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrain}
111438ee1fc5e5baaa204faede83cb999e45bb6b57eKaelyn Uhrain
11243e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrain// Test the typo-correction callback in Sema::DiagnoseInvalidRedeclaration.
11343e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrainstruct BaseDecl {
11443e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrain  void add_in(int i);
11543e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrain};
11643e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrainstruct TestRedecl : public BaseDecl {
11743e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrain  void add_it(int i); // expected-note{{'add_it' declared here}}
11843e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrain};
11943e875d2610afcf9e7017b71f46116dc86624fd9Kaelyn Uhrainvoid TestRedecl::add_in(int i) {} // expected-error{{out-of-line definition of 'add_in' does not match any declaration in 'TestRedecl'; did you mean 'add_it'?}}
12060a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain
121cd78e612d6fa8e214e6a6bb0e739a0c3e419df91Kaelyn Uhrain// Test the improved typo correction for the Parser::ParseCastExpr =>
122cd78e612d6fa8e214e6a6bb0e739a0c3e419df91Kaelyn Uhrain// Sema::ActOnIdExpression => Sema::DiagnoseEmptyLookup call path.
1230576681bac125be07f77f66b02a3dba2c3a24557Richard Smithclass SomeNetMessage; // expected-note 2{{'SomeNetMessage'}}
124cd78e612d6fa8e214e6a6bb0e739a0c3e419df91Kaelyn Uhrainclass Message {};
125cd78e612d6fa8e214e6a6bb0e739a0c3e419df91Kaelyn Uhrainvoid foo(Message&);
126cd78e612d6fa8e214e6a6bb0e739a0c3e419df91Kaelyn Uhrainvoid foo(SomeNetMessage&);
127cd78e612d6fa8e214e6a6bb0e739a0c3e419df91Kaelyn Uhrainvoid doit(void *data) {
128cd78e612d6fa8e214e6a6bb0e739a0c3e419df91Kaelyn Uhrain  Message somenetmsg; // expected-note{{'somenetmsg' declared here}}
129cd78e612d6fa8e214e6a6bb0e739a0c3e419df91Kaelyn Uhrain  foo(somenetmessage); // expected-error{{use of undeclared identifier 'somenetmessage'; did you mean 'somenetmsg'?}}
1300576681bac125be07f77f66b02a3dba2c3a24557Richard Smith  foo((somenetmessage)data); // expected-error{{unknown type name 'somenetmessage'; did you mean 'SomeNetMessage'?}} expected-error{{incomplete type}}
131cd78e612d6fa8e214e6a6bb0e739a0c3e419df91Kaelyn Uhrain}
132cd78e612d6fa8e214e6a6bb0e739a0c3e419df91Kaelyn Uhrain
13360a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain// Test the typo-correction callback in BuildRecoveryCallExpr.
13460a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain// Solves the main issue in PR 9320 of suggesting corrections that take the
13560a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain// wrong number of arguments.
13660a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrainvoid revoke(const char*); // expected-note 2{{'revoke' declared here}}
13760a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrainvoid Test() {
13860a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain  Invoke(); // expected-error{{use of undeclared identifier 'Invoke'}}
13960a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain  Invoke("foo"); // expected-error{{use of undeclared identifier 'Invoke'; did you mean 'revoke'?}}
14060a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain  Invoke("foo", "bar"); // expected-error{{use of undeclared identifier 'Invoke'}}
14160a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain}
14260a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrainvoid Test2(void (*invoke)(const char *, int)) { // expected-note{{'invoke' declared here}}
14360a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain  Invoke(); // expected-error{{use of undeclared identifier 'Invoke'}}
14460a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain  Invoke("foo"); // expected-error{{use of undeclared identifier 'Invoke'; did you mean 'revoke'?}}
14560a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain  Invoke("foo", 7); // expected-error{{use of undeclared identifier 'Invoke'; did you mean 'invoke'?}}
14660a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain  Invoke("foo", 7, 22); // expected-error{{use of undeclared identifier 'Invoke'}}
14760a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain}
14860a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain
14960a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrainvoid provoke(const char *x, bool y=false) {} // expected-note 2{{'provoke' declared here}}
15060a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrainvoid Test3() {
15160a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain  Provoke(); // expected-error{{use of undeclared identifier 'Provoke'}}
15260a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain  Provoke("foo"); // expected-error{{use of undeclared identifier 'Provoke'; did you mean 'provoke'?}}
15360a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain  Provoke("foo", true); // expected-error{{use of undeclared identifier 'Provoke'; did you mean 'provoke'?}}
15460a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain  Provoke("foo", 7, 22); // expected-error{{use of undeclared identifier 'Provoke'}}
15560a09dcc4656b82c7f96f8719a403a83247f6742Kaelyn Uhrain}
1563943b1c0215da2a4171dd6c696cb75d19e5a04a9Kaelyn Uhrain
1573943b1c0215da2a4171dd6c696cb75d19e5a04a9Kaelyn Uhrain// PR 11737 - Don't try to typo-correct the implicit 'begin' and 'end' in a
1583943b1c0215da2a4171dd6c696cb75d19e5a04a9Kaelyn Uhrain// C++11 for-range statement.
1593943b1c0215da2a4171dd6c696cb75d19e5a04a9Kaelyn Uhrainstruct R {};
1603943b1c0215da2a4171dd6c696cb75d19e5a04a9Kaelyn Uhrainbool begun(R);
1613943b1c0215da2a4171dd6c696cb75d19e5a04a9Kaelyn Uhrainvoid RangeTest() {
162e1715b66a878bcab315513351e5df68bfc010d2eSam Panzer  for (auto b : R()) {} // expected-error {{invalid range expression of type 'R'}}
1633943b1c0215da2a4171dd6c696cb75d19e5a04a9Kaelyn Uhrain}
1643336353578a02eb7dc35926c2440577993196e36Kaelyn Uhrain
1653336353578a02eb7dc35926c2440577993196e36Kaelyn Uhrain// PR 12019 - Avoid infinite mutual recursion in DiagnoseInvalidRedeclaration
1663336353578a02eb7dc35926c2440577993196e36Kaelyn Uhrain// by not trying to typo-correct a method redeclaration to declarations not
1673336353578a02eb7dc35926c2440577993196e36Kaelyn Uhrain// in the current record.
1683336353578a02eb7dc35926c2440577993196e36Kaelyn Uhrainclass Parent {
1693336353578a02eb7dc35926c2440577993196e36Kaelyn Uhrain void set_types(int index, int value);
1703336353578a02eb7dc35926c2440577993196e36Kaelyn Uhrain void add_types(int value);
1713336353578a02eb7dc35926c2440577993196e36Kaelyn Uhrain};
1723336353578a02eb7dc35926c2440577993196e36Kaelyn Uhrainclass Child: public Parent {};
1733336353578a02eb7dc35926c2440577993196e36Kaelyn Uhrainvoid Child::add_types(int value) {} // expected-error{{out-of-line definition of 'add_types' does not match any declaration in 'Child'}}
174e43fe993a079795ac3d2ba7c9ec5e2a0c8069918Kaelyn Uhrain
175e43fe993a079795ac3d2ba7c9ec5e2a0c8069918Kaelyn Uhrain// Fix the callback based filtering of typo corrections within
176e43fe993a079795ac3d2ba7c9ec5e2a0c8069918Kaelyn Uhrain// Sema::ActOnIdExpression by Parser::ParseCastExpression to allow type names as
177e43fe993a079795ac3d2ba7c9ec5e2a0c8069918Kaelyn Uhrain// potential corrections for template arguments.
178e43fe993a079795ac3d2ba7c9ec5e2a0c8069918Kaelyn Uhrainnamespace clash {
1790576681bac125be07f77f66b02a3dba2c3a24557Richard Smithclass ConstructExpr {}; // expected-note 2{{'clash::ConstructExpr' declared here}}
180e43fe993a079795ac3d2ba7c9ec5e2a0c8069918Kaelyn Uhrain}
181e43fe993a079795ac3d2ba7c9ec5e2a0c8069918Kaelyn Uhrainclass ClashTool {
182e43fe993a079795ac3d2ba7c9ec5e2a0c8069918Kaelyn Uhrain  bool HaveConstructExpr();
183e43fe993a079795ac3d2ba7c9ec5e2a0c8069918Kaelyn Uhrain  template <class T> T* getExprAs();
184e43fe993a079795ac3d2ba7c9ec5e2a0c8069918Kaelyn Uhrain
185e43fe993a079795ac3d2ba7c9ec5e2a0c8069918Kaelyn Uhrain  void test() {
186e43fe993a079795ac3d2ba7c9ec5e2a0c8069918Kaelyn Uhrain    ConstructExpr *expr = // expected-error{{unknown type name 'ConstructExpr'; did you mean 'clash::ConstructExpr'?}}
1870576681bac125be07f77f66b02a3dba2c3a24557Richard Smith        getExprAs<ConstructExpr>(); // expected-error{{unknown type name 'ConstructExpr'; did you mean 'clash::ConstructExpr'?}}
188e43fe993a079795ac3d2ba7c9ec5e2a0c8069918Kaelyn Uhrain  }
189e43fe993a079795ac3d2ba7c9ec5e2a0c8069918Kaelyn Uhrain};
190173a37a57b79bd8f94b85c2273039e760b159922Nick Lewycky
191173a37a57b79bd8f94b85c2273039e760b159922Nick Lewyckynamespace test1 {
192173a37a57b79bd8f94b85c2273039e760b159922Nick Lewycky  struct S {
193173a37a57b79bd8f94b85c2273039e760b159922Nick Lewycky    struct Foobar *f;  // expected-note{{'Foobar' declared here}}
194173a37a57b79bd8f94b85c2273039e760b159922Nick Lewycky  };
195173a37a57b79bd8f94b85c2273039e760b159922Nick Lewycky  test1::FooBar *b;  // expected-error{{no type named 'FooBar' in namespace 'test1'; did you mean 'Foobar'?}}
196173a37a57b79bd8f94b85c2273039e760b159922Nick Lewycky}
197827adaff666e53ae2f2db994bcd62ebe1ff5b9ceRichard Smith
198827adaff666e53ae2f2db994bcd62ebe1ff5b9ceRichard Smithnamespace ImplicitInt {
199827adaff666e53ae2f2db994bcd62ebe1ff5b9ceRichard Smith  void f(int, unsinged); // expected-error{{did you mean 'unsigned'}}
200827adaff666e53ae2f2db994bcd62ebe1ff5b9ceRichard Smith  struct S {
201827adaff666e53ae2f2db994bcd62ebe1ff5b9ceRichard Smith    unsinged : 4; // expected-error{{did you mean 'unsigned'}}
202827adaff666e53ae2f2db994bcd62ebe1ff5b9ceRichard Smith  };
203827adaff666e53ae2f2db994bcd62ebe1ff5b9ceRichard Smith}
204784ae8e5c6b557e2395991c6008293660f5afe66Kaelyn Uhrain
2050f4b5be4a3b3e1c18e611e5a5c262ef028e8320aRichard Smithnamespace PR13051 {
2060f4b5be4a3b3e1c18e611e5a5c262ef028e8320aRichard Smith  template<typename T> struct S {
2070f4b5be4a3b3e1c18e611e5a5c262ef028e8320aRichard Smith    template<typename U> void f();
2080f4b5be4a3b3e1c18e611e5a5c262ef028e8320aRichard Smith    operator bool() const;
2090f4b5be4a3b3e1c18e611e5a5c262ef028e8320aRichard Smith  };
2100f4b5be4a3b3e1c18e611e5a5c262ef028e8320aRichard Smith
211b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain  void foo(); // expected-note{{'foo' declared here}}
212b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain  void g(void(*)());
213b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain  void g(bool(S<int>::*)() const);
214b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain
215b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain  void test() {
216b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain    g(&S<int>::tempalte f<int>); // expected-error{{did you mean 'template'?}}
217b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain    g(&S<int>::opeartor bool); // expected-error{{did you mean 'operator'?}}
218b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain    g(&S<int>::foo); // expected-error{{no member named 'foo' in 'PR13051::S<int>'; did you mean simply 'foo'?}}
2190f4b5be4a3b3e1c18e611e5a5c262ef028e8320aRichard Smith  }
2200f4b5be4a3b3e1c18e611e5a5c262ef028e8320aRichard Smith}
221c1fb54265614845ee1e09856af6e46961c6209f4Kaelyn Uhrain
2220576681bac125be07f77f66b02a3dba2c3a24557Richard Smithinf f(doulbe); // expected-error{{'int'}} expected-error{{'double'}}
2230576681bac125be07f77f66b02a3dba2c3a24557Richard Smith
224c1fb54265614845ee1e09856af6e46961c6209f4Kaelyn Uhrainnamespace PR6325 {
225c1fb54265614845ee1e09856af6e46961c6209f4Kaelyn Uhrainclass foo { }; // expected-note{{'foo' declared here}}
226c1fb54265614845ee1e09856af6e46961c6209f4Kaelyn Uhrain// Note that for this example (pulled from the PR), if keywords are not excluded
227c1fb54265614845ee1e09856af6e46961c6209f4Kaelyn Uhrain// as correction candidates then no suggestion would be given; correcting
228c1fb54265614845ee1e09856af6e46961c6209f4Kaelyn Uhrain// 'boo' to 'bool' is the same edit distance as correcting 'boo' to 'foo'.
229c1fb54265614845ee1e09856af6e46961c6209f4Kaelyn Uhrainclass bar : boo { }; // expected-error{{unknown class name 'boo'; did you mean 'foo'?}}
230c1fb54265614845ee1e09856af6e46961c6209f4Kaelyn Uhrain}
2314ac5751efb9de1065c71b0db587185d552803e2fKaelyn Uhrain
232caa16dd469b6f7bfb5bce05afd8772f5d4196322Kaelyn Uhrainnamespace outer {
233caa16dd469b6f7bfb5bce05afd8772f5d4196322Kaelyn Uhrain  void somefunc();  // expected-note{{'::outer::somefunc' declared here}}
234caa16dd469b6f7bfb5bce05afd8772f5d4196322Kaelyn Uhrain  void somefunc(int, int);  // expected-note{{'::outer::somefunc' declared here}}
235caa16dd469b6f7bfb5bce05afd8772f5d4196322Kaelyn Uhrain
236caa16dd469b6f7bfb5bce05afd8772f5d4196322Kaelyn Uhrain  namespace inner {
237caa16dd469b6f7bfb5bce05afd8772f5d4196322Kaelyn Uhrain    void somefunc(int) {
238caa16dd469b6f7bfb5bce05afd8772f5d4196322Kaelyn Uhrain      someFunc();  // expected-error{{use of undeclared identifier 'someFunc'; did you mean '::outer::somefunc'?}}
239caa16dd469b6f7bfb5bce05afd8772f5d4196322Kaelyn Uhrain      someFunc(1, 2);  // expected-error{{use of undeclared identifier 'someFunc'; did you mean '::outer::somefunc'?}}
240caa16dd469b6f7bfb5bce05afd8772f5d4196322Kaelyn Uhrain    }
241caa16dd469b6f7bfb5bce05afd8772f5d4196322Kaelyn Uhrain  }
242caa16dd469b6f7bfb5bce05afd8772f5d4196322Kaelyn Uhrain}
243caa16dd469b6f7bfb5bce05afd8772f5d4196322Kaelyn Uhrain
244d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewyckynamespace b6956809_test1 {
245d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky  struct A {};
246d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky  struct B {};
247d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky
248d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky  struct S1 {
249d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky    void method(A*);  // no note here
250d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky    void method(B*);
251d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky  };
252d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky
253d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky  void test1() {
254d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky    B b;
255d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky    S1 s;
256d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky    s.methodd(&b);  // expected-error{{no member named 'methodd' in 'b6956809_test1::S1'; did you mean 'method'}}
257d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky  }
258d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky
259d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky  struct S2 {
260d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky    S2();
261d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky    void method(A*) const;  // expected-note{{candidate function not viable}}
262d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky   private:
263d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky    void method(B*);  // expected-note{{candidate function not viable}}
264d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky  };
265d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky
266d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky  void test2() {
267d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky    B b;
268d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky    const S2 s;
269d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky    s.methodd(&b);  // expected-error{{no member named 'methodd' in 'b6956809_test1::S2'; did you mean 'method'}}  expected-error{{no matching member function for call to 'method'}}
270d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky  }
271d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky}
272d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky
273d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewyckynamespace b6956809_test2 {
274d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky  template<typename T> struct Err { typename T::error n; };  // expected-error{{type 'void *' cannot be used prior to '::' because it has no members}}
275d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky  struct S {
276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> typename Err<T>::type method(T);  // expected-note{{in instantiation of template class 'b6956809_test2::Err<void *>' requested here}}
277d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky    template<typename T> int method(T *);
278d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky  };
279d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky
280d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky  void test() {
281d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky    S s;
282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int k = s.methodd((void*)0);  // expected-error{{no member named 'methodd' in 'b6956809_test2::S'; did you mean 'method'?}} expected-note{{while substituting deduced template arguments into function template 'method' [with T = void *]}}
283d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky  }
284d9de51f83d606ceab521e2cc17afc62e011c7cd8Nick Lewycky}
2856c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrain
2866243f627680fbf7c5bf2f339967d806f47153746Kaelyn Uhrain// This test should have one correction, followed by an error without a
2876243f627680fbf7c5bf2f339967d806f47153746Kaelyn Uhrain// suggestion due to exceeding the maximum number of typos for which correction
2886243f627680fbf7c5bf2f339967d806f47153746Kaelyn Uhrain// is attempted.
2896c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrainnamespace CorrectTypo_has_reached_its_limit {
2906243f627680fbf7c5bf2f339967d806f47153746Kaelyn Uhrainint flibberdy();  // expected-note{{'flibberdy' declared here}}
2916c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrainint no_correction() {
2926243f627680fbf7c5bf2f339967d806f47153746Kaelyn Uhrain  return hibberdy() +  // expected-error{{use of undeclared identifier 'hibberdy'; did you mean 'flibberdy'?}}
293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         gibberdy();  // expected-error-re{{use of undeclared identifier 'gibberdy'{{$}}}}
2946c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrain};
2956c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrain}
296