forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			121 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -verify %s
 | |
| 
 | |
| // Check the following typo correction behavior:
 | |
| // - multiple typos in a single member call chain are all diagnosed
 | |
| // - no typos are diagnosed for multiple typos in an expression when not all
 | |
| //   typos can be corrected
 | |
| 
 | |
| class DeepClass
 | |
| {
 | |
| public:
 | |
|   void trigger() const;  // expected-note {{'trigger' declared here}}
 | |
| };
 | |
| 
 | |
| class Y
 | |
| {
 | |
| public:
 | |
|   const DeepClass& getX() const { return m_deepInstance; }  // expected-note {{'getX' declared here}}
 | |
| private:
 | |
|   DeepClass m_deepInstance;
 | |
|   int m_n;
 | |
| };
 | |
| 
 | |
| class Z
 | |
| {
 | |
| public:
 | |
|   const Y& getY0() const { return m_y0; }  // expected-note {{'getY0' declared here}}
 | |
|   const Y& getActiveY() const { return m_y0; }
 | |
| 
 | |
| private:
 | |
|   Y m_y0;
 | |
|   Y m_y1;
 | |
| };
 | |
| 
 | |
| Z z_obj;
 | |
| 
 | |
| void testMultipleCorrections()
 | |
| {
 | |
|   z_obj.getY2().  // expected-error {{no member named 'getY2' in 'Z'; did you mean 'getY0'}}
 | |
|       getM().     // expected-error {{no member named 'getM' in 'Y'; did you mean 'getX'}}
 | |
|       triggee();  // expected-error {{no member named 'triggee' in 'DeepClass'; did you mean 'trigger'}}
 | |
| }
 | |
| 
 | |
| void testNoCorrections()
 | |
| {
 | |
|   z_obj.getY2().  // expected-error {{no member named 'getY2' in 'Z'}}
 | |
|       getM().
 | |
|       thisDoesntSeemToMakeSense();
 | |
| }
 | |
| 
 | |
| struct C {};
 | |
| struct D { int value; };
 | |
| struct A {
 | |
|   C get_me_a_C();
 | |
| };
 | |
| struct B {
 | |
|   D get_me_a_D();  // expected-note {{'get_me_a_D' declared here}}
 | |
| };
 | |
| class Scope {
 | |
| public:
 | |
|   A make_an_A();
 | |
|   B make_a_B();  // expected-note {{'make_a_B' declared here}}
 | |
| };
 | |
| 
 | |
| Scope scope_obj;
 | |
| 
 | |
| int testDiscardedCorrections() {
 | |
|   return scope_obj.make_an_E().  // expected-error {{no member named 'make_an_E' in 'Scope'; did you mean 'make_a_B'}}
 | |
|       get_me_a_Z().value;        // expected-error {{no member named 'get_me_a_Z' in 'B'; did you mean 'get_me_a_D'}}
 | |
| }
 | |
| 
 | |
| class AmbiguousHelper {
 | |
| public:
 | |
|   int helpMe();
 | |
|   int helpBe();
 | |
| };
 | |
| class Ambiguous {
 | |
| public:
 | |
|   int calculateA();
 | |
|   int calculateB();
 | |
| 
 | |
|   AmbiguousHelper getHelp1();
 | |
|   AmbiguousHelper getHelp2();
 | |
| };
 | |
| 
 | |
| Ambiguous ambiguous_obj;
 | |
| 
 | |
| int testDirectAmbiguousCorrection() {
 | |
|   return ambiguous_obj.calculateZ();  // expected-error {{no member named 'calculateZ' in 'Ambiguous'}}
 | |
| }
 | |
| 
 | |
| int testRecursiveAmbiguousCorrection() {
 | |
|   return ambiguous_obj.getHelp3().    // expected-error {{no member named 'getHelp3' in 'Ambiguous'}}
 | |
|       helpCe();
 | |
| }
 | |
| 
 | |
| 
 | |
| class DeepAmbiguityHelper {
 | |
| public:
 | |
|   DeepAmbiguityHelper& help1();
 | |
|   DeepAmbiguityHelper& help2();
 | |
| 
 | |
|   DeepAmbiguityHelper& methodA();
 | |
|   DeepAmbiguityHelper& somethingMethodB();
 | |
|   DeepAmbiguityHelper& functionC();
 | |
|   DeepAmbiguityHelper& deepMethodD();
 | |
|   DeepAmbiguityHelper& asDeepAsItGets();
 | |
| };
 | |
| 
 | |
| DeepAmbiguityHelper deep_obj;
 | |
| 
 | |
| int testDeepAmbiguity() {
 | |
|   deep_obj.
 | |
|       methodB(). // expected-error {{no member named 'methodB' in 'DeepAmbiguityHelper'}}
 | |
|       somethingMethodC().
 | |
|       functionD().
 | |
|       deepMethodD().
 | |
|       help3().
 | |
|       asDeepASItGet().
 | |
|       functionE();
 | |
| }
 |