@@ -753,8 +753,8 @@ namespace {
753753
754754 mUsed = true ;
755755
756- // Special handling for T() when T is a pointer
757- if (Token::Match (tok, " %name% ( ) " )) {
756+ // Special handling for T(... ) when T is a pointer
757+ if (Token::Match (tok, " %name% [({] " ) && ! Token::simpleMatch (tok-> linkAt ( 1 ), " ) ( " )) {
758758 bool pointerType = false ;
759759 for (const Token* type = mRangeType .first ; type != mRangeType .second ; type = type->next ()) {
760760 if (type->str () == " *" || type->str () == " &" ) {
@@ -769,10 +769,23 @@ namespace {
769769 }
770770 }
771771 if (pointerType) {
772- tok->deleteThis ();
773- tok->next ()->insertToken (" 0" );
774- Token* tok2 = insertTokens (tok, mRangeType );
775- insertTokens (tok2, mRangeTypeQualifiers );
772+ tok->tokAt (1 )->str (" (" );
773+ tok->linkAt (1 )->str (" )" );
774+ if (tok->linkAt (1 ) == tok->tokAt (2 )) { // T() or T{}
775+ tok->deleteThis ();
776+ tok->next ()->insertToken (" 0" );
777+ Token* tok2 = insertTokens (tok, mRangeType );
778+ insertTokens (tok2, mRangeTypeQualifiers );
779+ }
780+ else { // functional-style cast
781+ tok->originalName (tok->str ());
782+ tok->isSimplifiedTypedef (true );
783+ tok->str (" (" );
784+ Token* tok2 = insertTokens (tok, mRangeType );
785+ tok2 = insertTokens (tok2, mRangeTypeQualifiers );
786+ Token* tok3 = tok2->insertToken (" )" );
787+ Token::createMutualLinks (tok, tok3);
788+ }
776789 return ;
777790 }
778791 }
@@ -3331,13 +3344,27 @@ bool Tokenizer::simplifyUsing()
33313344 }
33323345 }
33333346
3334- // Is this a "T()" expression where T is a pointer type?
3335- if (Token::Match (tok1, " %name% ( )" ) && !pointers.empty ()) {
3336- Token* tok2 = tok1->linkAt (1 );
3337- tok1->deleteThis ();
3338- TokenList::copyTokens (tok1, start, usingEnd->previous ());
3339- tok2->insertToken (" 0" );
3340- after = tok2->next ();
3347+ // Is this a "T(...)" expression where T is a pointer type?
3348+ if (Token::Match (tok1, " %name% [({]" ) && !pointers.empty () && !Token::simpleMatch (tok1->linkAt (1 ), " ) (" )) {
3349+ tok1->tokAt (1 )->str (" (" );
3350+ tok1->linkAt (1 )->str (" )" );
3351+ if (tok1->linkAt (1 ) == tok1->tokAt (2 )) { // T() or T{}
3352+ Token* tok2 = tok1->linkAt (1 );
3353+ tok1->deleteThis ();
3354+ TokenList::copyTokens (tok1, start, usingEnd->previous ());
3355+ tok2->insertToken (" 0" );
3356+ after = tok2->next ();
3357+ }
3358+ else { // functional-style cast
3359+ Token* tok2 = tok1->linkAt (1 );
3360+ tok1->originalName (tok1->str ());
3361+ tok1->isSimplifiedTypedef (true );
3362+ tok1->str (" (" );
3363+ Token* tok3 = TokenList::copyTokens (tok1, start, usingEnd->previous ());
3364+ tok3->insertToken (" )" );
3365+ Token::createMutualLinks (tok1, tok3->next ());
3366+ after = tok2->next ();
3367+ }
33413368 }
33423369 else { // just replace simple type aliases
33433370 TokenList::copyTokens (tok1, start, usingEnd->previous ());
0 commit comments