// 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();
}
struct Dog {
int age; //expected-note{{'age' declared here}}
int size; //expected-note{{'size' declared here}}
};
int from_dog_years(int DogYears, int DogSize);
int get_dog_years() {
struct Dog doggo;
return from_dog_years(doggo.agee, //expected-error{{no member named 'agee' in 'Dog'; did you mean 'age'}}
doggo.sizee); //expected-error{{no member named 'sizee' in 'Dog'; did you mean 'size'}}
}