forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			216 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -verify -Wno-c++11-extensions %s
 | |
| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 -Wno-c++11-extensions %s
 | |
| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
 | |
| 
 | |
| struct A {};
 | |
| struct B {};
 | |
| struct D {
 | |
|   A fizbin;  // expected-note 2 {{declared here}}
 | |
|   A foobar;  // expected-note 2 {{declared here}}
 | |
|   B roxbin;  // expected-note 2 {{declared here}}
 | |
|   B toobad;  // expected-note 2 {{declared here}}
 | |
|   void BooHoo();
 | |
|   void FoxBox();
 | |
| };
 | |
| 
 | |
| void something(A, B);
 | |
| void test() {
 | |
|   D obj;
 | |
|   something(obj.fixbin,   // expected-error {{did you mean 'fizbin'?}}
 | |
|             obj.toobat);  // expected-error {{did you mean 'toobad'?}}
 | |
|   something(obj.toobat,   // expected-error {{did you mean 'foobar'?}}
 | |
|             obj.fixbin);  // expected-error {{did you mean 'roxbin'?}}
 | |
|   something(obj.fixbin,   // expected-error {{did you mean 'fizbin'?}}
 | |
|             obj.fixbin);  // expected-error {{did you mean 'roxbin'?}}
 | |
|   something(obj.toobat,   // expected-error {{did you mean 'foobar'?}}
 | |
|             obj.toobat);  // expected-error {{did you mean 'toobad'?}}
 | |
|   // Both members could be corrected to methods, but that isn't valid.
 | |
|   something(obj.boohoo,   // expected-error-re {{no member named 'boohoo' in 'D'{{$}}}}
 | |
|             obj.foxbox);  // expected-error-re {{no member named 'foxbox' in 'D'{{$}}}}
 | |
|   // The first argument has a usable correction but the second doesn't.
 | |
|   something(obj.boobar,   // expected-error-re {{no member named 'boobar' in 'D'{{$}}}}
 | |
|             obj.foxbox);  // expected-error-re {{no member named 'foxbox' in 'D'{{$}}}}
 | |
| }
 | |
| 
 | |
| // Ensure the delayed typo correction does the right thing when trying to
 | |
| // recover using a seemingly-valid correction for which a valid expression to
 | |
| // replace the TypoExpr cannot be created (but which does have a second
 | |
| // correction candidate that would be a valid and usable correction).
 | |
| class Foo {
 | |
| public:
 | |
|   template <> void testIt();  // expected-error {{no function template matches}}
 | |
|   void textIt();  // expected-note {{'textIt' declared here}}
 | |
| };
 | |
| void testMemberExpr(Foo *f) {
 | |
|   f->TestIt();  // expected-error {{no member named 'TestIt' in 'Foo'; did you mean 'textIt'?}}
 | |
| }
 | |
| 
 | |
| void callee(double, double);
 | |
| void testNoCandidates() {
 | |
|   callee(xxxxxx,   // expected-error-re {{use of undeclared identifier 'xxxxxx'{{$}}}}
 | |
|          zzzzzz);  // expected-error-re {{use of undeclared identifier 'zzzzzz'{{$}}}}
 | |
| }
 | |
| 
 | |
| class string {};
 | |
| struct Item {
 | |
|   void Nest();
 | |
|   string text();
 | |
|   Item* next();  // expected-note {{'next' declared here}}
 | |
| };
 | |
| void testExprFilter(Item *i) {
 | |
|   Item *j;
 | |
|   j = i->Next();  // expected-error {{no member named 'Next' in 'Item'; did you mean 'next'?}}
 | |
| }
 | |
| 
 | |
| // Test that initializer expressions are handled correctly and that the type
 | |
| // being initialized is taken into account when choosing a correction.
 | |
| namespace initializerCorrections {
 | |
| struct Node {
 | |
|   string text() const;
 | |
|   // Node* Next() is not implemented yet
 | |
| };
 | |
| void f(Node *node) {
 | |
|   // text is only an edit distance of 1 from Next, but would trigger type
 | |
|   // conversion errors if used in this initialization expression.
 | |
|   Node *next = node->Next();  // expected-error-re {{no member named 'Next' in 'initializerCorrections::Node'{{$}}}}
 | |
| }
 | |
| 
 | |
| struct LinkedNode {
 | |
|   LinkedNode* next();  // expected-note {{'next' declared here}}
 | |
|   string text() const;
 | |
| };
 | |
| void f(LinkedNode *node) {
 | |
|   // text and next are equidistant from Next, but only one results in a valid
 | |
|   // initialization expression.
 | |
|   LinkedNode *next = node->Next();  // expected-error {{no member named 'Next' in 'initializerCorrections::LinkedNode'; did you mean 'next'?}}
 | |
| }
 | |
| 
 | |
| struct NestedNode {
 | |
|   NestedNode* Nest();
 | |
|   NestedNode* next();
 | |
|   string text() const;
 | |
| };
 | |
| void f(NestedNode *node) {
 | |
|   // There are two equidistant, usable corrections for Next: next and Nest
 | |
|   NestedNode *next = node->Next();  // expected-error-re {{no member named 'Next' in 'initializerCorrections::NestedNode'{{$}}}}
 | |
| }
 | |
| }
 | |
| 
 | |
| namespace PR21669 {
 | |
| void f(int *i) {
 | |
|   // Check that arguments to a builtin with custom type checking are corrected
 | |
|   // properly, since calls to such builtins bypass much of the normal code path
 | |
|   // for building and checking the call.
 | |
|   __atomic_load(i, i, something_something);  // expected-error-re {{use of undeclared identifier 'something_something'{{$}}}}
 | |
| }
 | |
| }
 | |
| 
 | |
| const int DefaultArg = 9;  // expected-note {{'DefaultArg' declared here}}
 | |
| template <int I = defaultArg> struct S {};  // expected-error {{use of undeclared identifier 'defaultArg'; did you mean 'DefaultArg'?}}
 | |
| S<1> s;
 | |
| 
 | |
| namespace foo {}
 | |
| void test_paren_suffix() {
 | |
|   foo::bar({5, 6});  // expected-error-re {{no member named 'bar' in namespace 'foo'{{$}}}}
 | |
| #if __cplusplus <= 199711L
 | |
|   // expected-error@-2 {{expected expression}}
 | |
| #endif
 | |
| }
 | |
| 
 | |
| const int kNum = 10;  // expected-note {{'kNum' declared here}}
 | |
| class SomeClass {
 | |
|   int Kind;
 | |
| public:
 | |
|   explicit SomeClass() : Kind(kSum) {}  // expected-error {{use of undeclared identifier 'kSum'; did you mean 'kNum'?}}
 | |
| };
 | |
| 
 | |
| // There used to be an issue with typo resolution inside overloads.
 | |
| struct AssertionResult { ~AssertionResult(); };
 | |
| AssertionResult Overload(const char *a);
 | |
| AssertionResult Overload(int a);
 | |
| void UseOverload() {
 | |
|   // expected-note@+1 {{'result' declared here}}
 | |
|   const char *result;
 | |
|   // expected-error@+1 {{use of undeclared identifier 'resulta'; did you mean 'result'?}}
 | |
|   Overload(resulta);
 | |
| }
 | |
| 
 | |
| namespace PR21925 {
 | |
| struct X {
 | |
|   int get() { return 7; }  // expected-note {{'get' declared here}}
 | |
| };
 | |
| void test() {
 | |
|   X variable;  // expected-note {{'variable' declared here}}
 | |
| 
 | |
|   // expected-error@+2 {{use of undeclared identifier 'variableX'; did you mean 'variable'?}}
 | |
|   // expected-error@+1 {{no member named 'getX' in 'PR21925::X'; did you mean 'get'?}}
 | |
|   int x = variableX.getX();
 | |
| }
 | |
| }
 | |
| 
 | |
| namespace PR21905 {
 | |
| int (*a) () = (void)Z;  // expected-error-re {{use of undeclared identifier 'Z'{{$}}}}
 | |
| }
 | |
| 
 | |
| namespace PR21947 {
 | |
| int blue;  // expected-note {{'blue' declared here}}
 | |
| __typeof blur y;  // expected-error {{use of undeclared identifier 'blur'; did you mean 'blue'?}}
 | |
| }
 | |
| 
 | |
| namespace PR22092 {
 | |
| a = b ? : 0;  // expected-error {{C++ requires a type specifier for all declarations}} \
 | |
|               // expected-error-re {{use of undeclared identifier 'b'{{$}}}}
 | |
| }
 | |
| 
 | |
| extern long clock (void);
 | |
| struct Pointer {
 | |
|   void set_xpos(int);
 | |
|   void set_ypos(int);
 | |
| };
 | |
| void MovePointer(Pointer &Click, int x, int y) {  // expected-note 2 {{'Click' declared here}}
 | |
|   click.set_xpos(x);  // expected-error {{use of undeclared identifier 'click'; did you mean 'Click'?}}
 | |
|   click.set_ypos(x);  // expected-error {{use of undeclared identifier 'click'; did you mean 'Click'?}}
 | |
| }
 | |
| 
 | |
| namespace PR22250 {
 | |
| // expected-error@+4 {{use of undeclared identifier 'size_t'; did you mean 'sizeof'?}}
 | |
| // expected-error-re@+3 {{use of undeclared identifier 'y'{{$}}}}
 | |
| // expected-error-re@+2 {{use of undeclared identifier 'z'{{$}}}}
 | |
| // expected-error@+1 {{expected ';' after top level declarator}}
 | |
| int getenv_s(size_t *y, char(&z)) {}
 | |
| }
 | |
| 
 | |
| namespace PR22291 {
 | |
| template <unsigned I> void f() {
 | |
|   unsigned *prio_bits_array;  // expected-note {{'prio_bits_array' declared here}}
 | |
|   // expected-error@+1 {{use of undeclared identifier 'prio_op_array'; did you mean 'prio_bits_array'?}}
 | |
|   __atomic_store_n(prio_op_array + I, false, __ATOMIC_RELAXED);
 | |
| }
 | |
| }
 | |
| 
 | |
| namespace PR22297 {
 | |
| double pow(double x, double y);
 | |
| struct TimeTicks {
 | |
|   static void Now();  // expected-note {{'Now' declared here}}
 | |
| };
 | |
| void f() {
 | |
|   TimeTicks::now();  // expected-error {{no member named 'now' in 'PR22297::TimeTicks'; did you mean 'Now'?}}
 | |
| }
 | |
| }
 | |
| 
 | |
| namespace PR23005 {
 | |
| void f() { int a = Unknown::b(c); }  // expected-error {{use of undeclared identifier 'Unknown'}}
 | |
| // expected-error@-1 {{use of undeclared identifier 'c'}}
 | |
| }
 | |
| 
 | |
| namespace PR23350 {
 | |
| int z = 1 ? N : ;  // expected-error {{expected expression}}
 | |
| // expected-error-re@-1 {{use of undeclared identifier 'N'{{$}}}}
 | |
| }
 | |
| 
 | |
| // PR 23285. This test must be at the end of the file to avoid additional,
 | |
| // unwanted diagnostics.
 | |
| // expected-error-re@+2 {{use of undeclared identifier 'uintmax_t'{{$}}}}
 | |
| // expected-error@+1 {{expected ';' after top level declarator}}
 | |
| unsigned int a = 0(uintmax_t
 |