diff --git a/lib/clangimport.cpp b/lib/clangimport.cpp index d69a4cec0..662a9a306 100644 --- a/lib/clangimport.cpp +++ b/lib/clangimport.cpp @@ -108,6 +108,11 @@ static std::vector splitString(const std::string &line) std::string::size_type pos1 = line.find_first_not_of(" "); while (pos1 != std::string::npos) { std::string::size_type pos2; + if (line[pos1] == '*') { + ret.push_back("*"); + pos1 = line.find_first_not_of(" ", pos1 + 1); + continue; + } if (line[pos1] == '<') pos2 = line.find(">", pos1); else if (line[pos1] == '\"') diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 5bb34ab44..943c57ffc 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -1846,9 +1846,9 @@ Variable::Variable(const Token *name_, const std::string &clangType, const Token mTypeStartToken = mTypeStartToken->next(); } - if (endsWith(clangType, " &", 2)) + if (Token::simpleMatch(mTypeEndToken, "&")) setFlag(fIsReference, true); - else if (endsWith(clangType, " &&", 3)) { + else if (Token::simpleMatch(mTypeEndToken, "&&")) { setFlag(fIsReference, true); setFlag(fIsRValueRef, true); } diff --git a/test/testclangimport.cpp b/test/testclangimport.cpp index b9c3d6357..e382c7a39 100644 --- a/test/testclangimport.cpp +++ b/test/testclangimport.cpp @@ -109,6 +109,7 @@ private: TEST_CASE(symbolDatabaseFunctionConst); TEST_CASE(symbolDatabaseVariableRef); TEST_CASE(symbolDatabaseVariableRRef); + TEST_CASE(symbolDatabaseVariablePointerRef); TEST_CASE(symbolDatabaseNodeType1); TEST_CASE(valueFlow1); @@ -456,7 +457,7 @@ private: " | `-CXXFunctionalCastExpr 0x1592b40 'MyVar':'MyVar' functional cast to MyVar \n" " | `-CXXConstructExpr 0x15929f0 'MyVar':'MyVar' 'void (int)'\n" " | `-IntegerLiteral 0x1570248 'int' 5\n"; - ASSERT_EQUALS("int main ( int argc@1 , char ** argv@2 ) { MyVar setCode@3 = MyVar ( 5 ) ; }", + ASSERT_EQUALS("int main ( int argc@1 , char * * argv@2 ) { MyVar setCode@3 = MyVar ( 5 ) ; }", parse(clang)); } @@ -922,7 +923,7 @@ private: void vardecl5() { const char clang[] = "|-VarDecl 0x2e31fc0 col:26 sys_errlist 'const char *const []' extern"; - ASSERT_EQUALS("const char *const [] sys_errlist@1 ;", parse(clang)); + ASSERT_EQUALS("const char * const [] sys_errlist@1 ;", parse(clang)); } void vardecl6() { @@ -1095,6 +1096,18 @@ private: ASSERT(refVar->isRValueReference()); } + void symbolDatabaseVariablePointerRef() { + const char clang[] = "`-FunctionDecl 0x9b4f10 <3.cpp:1:1, col:17> col:6 used foo 'void (int *&)'\n" + " `-ParmVarDecl 0x9b4e40 col:16 p 'int *&'\n"; + + ASSERT_EQUALS("void foo ( int * & p@1 ) ;", parse(clang)); + + GET_SYMBOL_DB(clang); + const Variable *p = db->variableList().back(); + ASSERT(p->isPointer()); + ASSERT(p->isReference()); + } + void symbolDatabaseNodeType1() { const char clang[] = "`-FunctionDecl 0x32438c0 line:5:6 foo 'a::b (a::b)'\n" " |-ParmVarDecl 0x32437b0 col:15 used i 'a::b':'long'\n"