gecko-dev/build/clang-plugin/tests/TestOverrideBaseCall.cpp

176 строки
2.9 KiB
C++

#define MOZ_REQUIRED_BASE_METHOD __attribute__((annotate("moz_required_base_method")))
class Base {
public:
virtual void fo() MOZ_REQUIRED_BASE_METHOD {
}
virtual int foRet() MOZ_REQUIRED_BASE_METHOD {
return 0;
}
};
class BaseOne : public Base {
public:
virtual void fo() MOZ_REQUIRED_BASE_METHOD {
Base::fo();
}
};
class BaseSecond : public Base {
public:
virtual void fo() MOZ_REQUIRED_BASE_METHOD {
Base::fo();
}
};
class Deriv : public BaseOne, public BaseSecond {
public:
void func() {
}
void fo() {
func();
BaseSecond::fo();
BaseOne::fo();
}
};
class DerivSimple : public Base {
public:
void fo() { // expected-error {{Method Base::fo must be called in all overrides, but is not called in this override defined for class DerivSimple}}
}
};
class BaseVirtualOne : public virtual Base {
};
class BaseVirtualSecond: public virtual Base {
};
class DerivVirtual : public BaseVirtualOne, public BaseVirtualSecond {
public:
void fo() {
Base::fo();
}
};
class DerivIf : public Base {
public:
void fo() {
if (true) {
Base::fo();
}
}
};
class DerivIfElse : public Base {
public:
void fo() {
if (true) {
Base::fo();
} else {
Base::fo();
}
}
};
class DerivFor : public Base {
public:
void fo() {
for (int i = 0; i < 10; i++) {
Base::fo();
}
}
};
class DerivDoWhile : public Base {
public:
void fo() {
do {
Base::fo();
} while(false);
}
};
class DerivWhile : public Base {
public:
void fo() {
while (true) {
Base::fo();
break;
}
}
};
class DerivAssignment : public Base {
public:
int foRet() {
return foRet();
}
};
class BaseOperator {
private:
int value;
public:
BaseOperator() : value(0) {
}
virtual BaseOperator& operator++() MOZ_REQUIRED_BASE_METHOD {
value++;
return *this;
}
};
class DerivOperatorErr : public BaseOperator {
private:
int value;
public:
DerivOperatorErr() : value(0) {
}
DerivOperatorErr& operator++() { // expected-error {{Method BaseOperator::operator++ must be called in all overrides, but is not called in this override defined for class DerivOperatorErr}}
value++;
return *this;
}
};
class DerivOperator : public BaseOperator {
private:
int value;
public:
DerivOperator() : value(0) {
}
DerivOperator& operator++() {
BaseOperator::operator++();
value++;
return *this;
}
};
class DerivPrime : public Base {
public:
void fo() {
Base::fo();
}
};
class DerivSecondErr : public DerivPrime {
public:
void fo() { // expected-error {{Method Base::fo must be called in all overrides, but is not called in this override defined for class DerivSecondErr}}
}
};
class DerivSecond : public DerivPrime {
public:
void fo() {
Base::fo();
}
};
class DerivSecondIndirect : public DerivPrime {
public:
void fo() {
DerivPrime::fo();
}
};