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