@@ -320,14 +320,26 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *setti
320320 function.type = Function::eDestructor;
321321
322322 // copy constructor
323- else if ((Token::Match (function.tokenDef , " %var% ( const %var% & )" ) ||
324- Token::Match (function.tokenDef , " %var% ( const %var% & %var% )" )) &&
323+ else if ((Token::Match (function.tokenDef , " %var% ( const %var% & %var%| )" ) ||
324+ (Token::Match (function.tokenDef , " %var% ( const %var% <" ) &&
325+ Token::Match (function.tokenDef ->linkAt (4 ), " > & %var%| )" ))) &&
325326 function.tokenDef ->strAt (3 ) == scope->className )
326327 function.type = Function::eCopyConstructor;
327328
329+ else if ((Token::Match (function.tokenDef , " %var% <" ) &&
330+ Token::Match (function.tokenDef ->linkAt (1 ), " > (const %var% & %var%| )" )) &&
331+ function.tokenDef ->linkAt (1 )->strAt (3 ) == scope->className )
332+ function.type = Function::eCopyConstructor;
333+
328334 // copy constructor with non-const argument
329- else if ((Token::Match (function.tokenDef , " %var% ( %var% & )" ) ||
330- Token::Match (function.tokenDef , " %var% ( %var% & %var% )" )) &&
335+ else if ((Token::Match (function.tokenDef , " %var% ( %var% & %var%| )" ) ||
336+ (Token::Match (function.tokenDef , " %var% ( %var% <" ) &&
337+ Token::Match (function.tokenDef ->linkAt (4 ), " > & %var%| )" ))) &&
338+ function.tokenDef ->strAt (2 ) == scope->className )
339+ function.type = Function::eCopyConstructor;
340+
341+ else if ((Token::Match (function.tokenDef , " %var% <" ) &&
342+ Token::Match (function.tokenDef ->linkAt (1 ), " > ( %var% & %var%| )" )) &&
331343 function.tokenDef ->strAt (2 ) == scope->className )
332344 function.type = Function::eCopyConstructor;
333345
@@ -929,6 +941,15 @@ bool SymbolDatabase::isFunction(const Token *tok, const Scope* outerScope, const
929941 return true ;
930942 }
931943
944+ // template constructor?
945+ else if (Token::Match (tok, " %var% <" ) && Token::Match (tok->next ()->link (), " > (" ) &&
946+ (Token::Match (tok->next ()->link ()->next ()->link (), " ) const| ;|{|=" ) ||
947+ Token::Match (tok->next ()->link ()->next ()->link (), " ) : ::| %var% (|::|<|{" ))) {
948+ *funcStart = tok;
949+ *argStart = tok->next ()->link ()->next ();
950+ return true ;
951+ }
952+
932953 return false ;
933954}
934955
0 commit comments