1 // RUN: %clang_cc1 -fsyntax-only -verify -Wno-c++11-extensions %s 2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 -Wno-c++11-extensions %s 3 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 4 5 struct A {}; 6 struct B {}; 7 struct D { 8 A fizbin; // expected-note 2 {{declared here}} 9 A foobar; // expected-note 2 {{declared here}} 10 B roxbin; // expected-note 2 {{declared here}} 11 B toobad; // expected-note 2 {{declared here}} 12 void BooHoo(); 13 void FoxBox(); 14 }; 15 16 void something(A, B); 17 void test() { 18 D obj; 19 something(obj.fixbin, // expected-error {{did you mean 'fizbin'?}} 20 obj.toobat); // expected-error {{did you mean 'toobad'?}} 21 something(obj.toobat, // expected-error {{did you mean 'foobar'?}} 22 obj.fixbin); // expected-error {{did you mean 'roxbin'?}} 23 something(obj.fixbin, // expected-error {{did you mean 'fizbin'?}} 24 obj.fixbin); // expected-error {{did you mean 'roxbin'?}} 25 something(obj.toobat, // expected-error {{did you mean 'foobar'?}} 26 obj.toobat); // expected-error {{did you mean 'toobad'?}} 27 // Both members could be corrected to methods, but that isn't valid. 28 something(obj.boohoo, // expected-error-re {{no member named 'boohoo' in 'D'{{$}}}} 29 obj.foxbox); // expected-error-re {{no member named 'foxbox' in 'D'{{$}}}} 30 // The first argument has a usable correction but the second doesn't. 31 something(obj.boobar, // expected-error-re {{no member named 'boobar' in 'D'{{$}}}} 32 obj.foxbox); // expected-error-re {{no member named 'foxbox' in 'D'{{$}}}} 33 } 34 35 // Ensure the delayed typo correction does the right thing when trying to 36 // recover using a seemingly-valid correction for which a valid expression to 37 // replace the TypoExpr cannot be created (but which does have a second 38 // correction candidate that would be a valid and usable correction). 39 class Foo { 40 public: 41 template <> void testIt(); // expected-error {{no function template matches}} 42 void textIt(); // expected-note {{'textIt' declared here}} 43 }; 44 void testMemberExpr(Foo *f) { 45 f->TestIt(); // expected-error {{no member named 'TestIt' in 'Foo'; did you mean 'textIt'?}} 46 } 47 48 void callee(double, double); 49 void testNoCandidates() { 50 callee(xxxxxx, // expected-error-re {{use of undeclared identifier 'xxxxxx'{{$}}}} 51 zzzzzz); // expected-error-re {{use of undeclared identifier 'zzzzzz'{{$}}}} 52 } 53 54 class string {}; 55 struct Item { 56 void Nest(); 57 string text(); 58 Item* next(); // expected-note {{'next' declared here}} 59 }; 60 void testExprFilter(Item *i) { 61 Item *j; 62 j = i->Next(); // expected-error {{no member named 'Next' in 'Item'; did you mean 'next'?}} 63 } 64 65 // Test that initializer expressions are handled correctly and that the type 66 // being initialized is taken into account when choosing a correction. 67 namespace initializerCorrections { 68 struct Node { 69 string text() const; 70 // Node* Next() is not implemented yet 71 }; 72 void f(Node *node) { 73 // text is only an edit distance of 1 from Next, but would trigger type 74 // conversion errors if used in this initialization expression. 75 Node *next = node->Next(); // expected-error-re {{no member named 'Next' in 'initializerCorrections::Node'{{$}}}} 76 } 77 78 struct LinkedNode { 79 LinkedNode* next(); // expected-note {{'next' declared here}} 80 string text() const; 81 }; 82 void f(LinkedNode *node) { 83 // text and next are equidistant from Next, but only one results in a valid 84 // initialization expression. 85 LinkedNode *next = node->Next(); // expected-error {{no member named 'Next' in 'initializerCorrections::LinkedNode'; did you mean 'next'?}} 86 } 87 88 struct NestedNode { 89 NestedNode* Nest(); 90 NestedNode* next(); 91 string text() const; 92 }; 93 void f(NestedNode *node) { 94 // There are two equidistant, usable corrections for Next: next and Nest 95 NestedNode *next = node->Next(); // expected-error-re {{no member named 'Next' in 'initializerCorrections::NestedNode'{{$}}}} 96 } 97 } 98 99 namespace PR21669 { 100 void f(int *i) { 101 // Check that arguments to a builtin with custom type checking are corrected 102 // properly, since calls to such builtins bypass much of the normal code path 103 // for building and checking the call. 104 __atomic_load(i, i, something_something); // expected-error-re {{use of undeclared identifier 'something_something'{{$}}}} 105 } 106 } 107 108 const int DefaultArg = 9; // expected-note {{'DefaultArg' declared here}} 109 template <int I = defaultArg> struct S {}; // expected-error {{use of undeclared identifier 'defaultArg'; did you mean 'DefaultArg'?}} 110 S<1> s; 111 112 namespace foo {} 113 void test_paren_suffix() { 114 foo::bar({5, 6}); // expected-error-re {{no member named 'bar' in namespace 'foo'{{$}}}} 115 #if __cplusplus <= 199711L 116 // expected-error@-2 {{expected expression}} 117 #endif 118 } 119 120 const int kNum = 10; // expected-note {{'kNum' declared here}} 121 class SomeClass { 122 int Kind; 123 public: 124 explicit SomeClass() : Kind(kSum) {} // expected-error {{use of undeclared identifier 'kSum'; did you mean 'kNum'?}} 125 }; 126 127 // There used to be an issue with typo resolution inside overloads. 128 struct AssertionResult { ~AssertionResult(); }; 129 AssertionResult Overload(const char *a); 130 AssertionResult Overload(int a); 131 void UseOverload() { 132 // expected-note@+1 {{'result' declared here}} 133 const char *result; 134 // expected-error@+1 {{use of undeclared identifier 'resulta'; did you mean 'result'?}} 135 Overload(resulta); 136 } 137 138 namespace PR21925 { 139 struct X { 140 int get() { return 7; } // expected-note {{'get' declared here}} 141 }; 142 void test() { 143 X variable; // expected-note {{'variable' declared here}} 144 145 // expected-error@+2 {{use of undeclared identifier 'variableX'; did you mean 'variable'?}} 146 // expected-error@+1 {{no member named 'getX' in 'PR21925::X'; did you mean 'get'?}} 147 int x = variableX.getX(); 148 } 149 } 150 151 namespace PR21905 { 152 int (*a) () = (void)Z; // expected-error-re {{use of undeclared identifier 'Z'{{$}}}} 153 } 154 155 namespace PR21947 { 156 int blue; // expected-note {{'blue' declared here}} 157 __typeof blur y; // expected-error {{use of undeclared identifier 'blur'; did you mean 'blue'?}} 158 } 159 160 namespace PR22092 { 161 a = b ? : 0; // expected-error {{C++ requires a type specifier for all declarations}} \ 162 // expected-error-re {{use of undeclared identifier 'b'{{$}}}} 163 } 164 165 extern long clock (void); 166 struct Pointer { 167 void set_xpos(int); 168 void set_ypos(int); 169 }; 170 void MovePointer(Pointer &Click, int x, int y) { // expected-note 2 {{'Click' declared here}} 171 click.set_xpos(x); // expected-error {{use of undeclared identifier 'click'; did you mean 'Click'?}} 172 click.set_ypos(x); // expected-error {{use of undeclared identifier 'click'; did you mean 'Click'?}} 173 } 174 175 namespace PR22250 { 176 // expected-error@+4 {{use of undeclared identifier 'size_t'; did you mean 'sizeof'?}} 177 // expected-error-re@+3 {{use of undeclared identifier 'y'{{$}}}} 178 // expected-error-re@+2 {{use of undeclared identifier 'z'{{$}}}} 179 // expected-error@+1 {{expected ';' after top level declarator}} 180 int getenv_s(size_t *y, char(&z)) {} 181 } 182 183 namespace PR22291 { 184 template <unsigned I> void f() { 185 unsigned *prio_bits_array; // expected-note {{'prio_bits_array' declared here}} 186 // expected-error@+1 {{use of undeclared identifier 'prio_op_array'; did you mean 'prio_bits_array'?}} 187 __atomic_store_n(prio_op_array + I, false, __ATOMIC_RELAXED); 188 } 189 } 190 191 namespace PR22297 { 192 double pow(double x, double y); 193 struct TimeTicks { 194 static void Now(); // expected-note {{'Now' declared here}} 195 }; 196 void f() { 197 TimeTicks::now(); // expected-error {{no member named 'now' in 'PR22297::TimeTicks'; did you mean 'Now'?}} 198 } 199 } 200 201 namespace PR23005 { 202 void f() { int a = Unknown::b(c); } // expected-error {{use of undeclared identifier 'Unknown'}} 203 // expected-error@-1 {{use of undeclared identifier 'c'}} 204 } 205 206 namespace PR23350 { 207 int z = 1 ? N : ; // expected-error {{expected expression}} 208 // expected-error-re@-1 {{use of undeclared identifier 'N'{{$}}}} 209 } 210 211 // PR 23285. This test must be at the end of the file to avoid additional, 212 // unwanted diagnostics. 213 // expected-error-re@+2 {{use of undeclared identifier 'uintmax_t'{{$}}}} 214 // expected-error@+1 {{expected ';' after top level declarator}} 215 unsigned int a = 0(uintmax_t 216