Fix FP const pointer with class variable and add more tests (#3345)
This commit is contained in:
parent
8efe1d4ab4
commit
41c94b656a
|
@ -1462,6 +1462,8 @@ void CheckOther::checkConstPointer()
|
|||
for (const Token *tok = mTokenizer->tokens(); tok; tok = tok->next()) {
|
||||
if (!tok->variable())
|
||||
continue;
|
||||
if (!tok->variable()->isLocal() && !tok->variable()->isArgument())
|
||||
continue;
|
||||
if (tok == tok->variable()->nameToken())
|
||||
continue;
|
||||
if (!tok->valueType())
|
||||
|
|
|
@ -2674,6 +2674,76 @@ private:
|
|||
|
||||
check("void foo(int *p) { return *p > 1; }");
|
||||
ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared with const\n", errout.str());
|
||||
|
||||
check("void foo(const int* c) { if (c == 0) {}; }");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("struct a { void b(); };\n"
|
||||
"struct c {\n"
|
||||
" a* d;\n"
|
||||
" a& g() { return *d; }\n"
|
||||
"};\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("struct a { void b(); };\n"
|
||||
"struct c { a* d; };\n"
|
||||
"void e(c);\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("struct V {\n"
|
||||
" V& get(typename std::vector<V>::size_type i, std::vector<V>* arr) {\n"
|
||||
" return arr->at(i);\n"
|
||||
" }\n"
|
||||
"};\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("struct A {};\n"
|
||||
"struct B : A {};\n"
|
||||
"B* f(A* x) {\n"
|
||||
" return static_cast<B*>(x);\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("int f(std::vector<int>* x) {\n"
|
||||
" int& i = (*x)[0];\n"
|
||||
" i++;\n"
|
||||
" return i;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("struct A { int a; };\n"
|
||||
"A f(std::vector<A>* x) {\n"
|
||||
" x->front().a = 1;\n"
|
||||
" return x->front();\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void f(std::vector<int>* v) {\n"
|
||||
" for(auto&& x:*v)\n"
|
||||
" x = 1;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("struct A {\n"
|
||||
" int* x;\n"
|
||||
" A(int* y) : x(y)\n"
|
||||
" {}\n"
|
||||
"};");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void f(bool b, int* x, int* y) {\n"
|
||||
" int* z = x;\n"
|
||||
" int* w = b ? y : z;\n"
|
||||
" *w = 1;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void f(bool b, int* x, int* y) {\n"
|
||||
" int& z = *x;\n"
|
||||
" int& w = b ? *y : z;\n"
|
||||
" w = 1;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void switchRedundantAssignmentTest() {
|
||||
|
|
|
@ -121,6 +121,7 @@ extern std::ostringstream output;
|
|||
|
||||
#define TEST_CASE( NAME ) do { if ( prepareTest(#NAME) ) { setVerbose(false); NAME(); } } while(false)
|
||||
#define ASSERT( CONDITION ) if (!assert_(__FILE__, __LINE__, (CONDITION))) return
|
||||
#define CHECK_EQUALS( EXPECTED , ACTUAL ) assertEquals(__FILE__, __LINE__, (EXPECTED), (ACTUAL))
|
||||
#define ASSERT_EQUALS( EXPECTED , ACTUAL ) if (!assertEquals(__FILE__, __LINE__, (EXPECTED), (ACTUAL))) return
|
||||
#define ASSERT_EQUALS_WITHOUT_LINENUMBERS( EXPECTED , ACTUAL ) assertEqualsWithoutLineNumbers(__FILE__, __LINE__, EXPECTED, ACTUAL)
|
||||
#define ASSERT_EQUALS_DOUBLE( EXPECTED , ACTUAL, TOLERANCE ) assertEqualsDouble(__FILE__, __LINE__, EXPECTED, ACTUAL, TOLERANCE)
|
||||
|
|
Loading…
Reference in New Issue