@@ -410,17 +410,15 @@ namespace {
410410static Token *splitDefinitionFromTypedef (Token *tok, nonneg int *unnamedCount)
411411{
412412 std::string name;
413- bool isConst = false ;
414- Token *tok1 = tok->next ();
413+ std::set<std::string> qualifiers;
415414
416- // skip const if present
417- if (tok1->str () == " const" ) {
418- tok1->deleteThis ();
419- isConst = true ;
415+ while (Token::Match (tok->next (), " const|volatile" )) {
416+ qualifiers.insert (tok->next ()->str ());
417+ tok->deleteNext ();
420418 }
421419
422420 // skip "class|struct|union|enum"
423- tok1 = tok1-> next ( );
421+ Token * tok1 = tok-> tokAt ( 2 );
424422
425423 const bool hasName = Token::Match (tok1, " %name%" );
426424
@@ -465,8 +463,8 @@ static Token *splitDefinitionFromTypedef(Token *tok, nonneg int *unnamedCount)
465463 tok1->insertToken (" typedef" );
466464 tok1 = tok1->next ();
467465 Token * tok3 = tok1;
468- if (isConst ) {
469- tok1->insertToken (" const " );
466+ for ( const std::string &qualifier : qualifiers ) {
467+ tok1->insertToken (qualifier );
470468 tok1 = tok1->next ();
471469 }
472470 tok1->insertToken (tok->next ()->str ()); // struct, union or enum
@@ -1209,7 +1207,10 @@ void Tokenizer::simplifyTypedefCpp()
12091207
12101208 // pull struct, union, enum or class definition out of typedef
12111209 // use typedef name for unnamed struct, union, enum or class
1212- if (Token::Match (tok->next (), " const| struct|enum|union|class %type%| {|:" )) {
1210+ const Token* tokClass = tok->next ();
1211+ while (Token::Match (tokClass, " const|volatile" ))
1212+ tokClass = tokClass->next ();
1213+ if (Token::Match (tokClass, " struct|enum|union|class %type%| {|:" )) {
12131214 Token *tok1 = splitDefinitionFromTypedef (tok, &mUnnamedCount );
12141215 if (!tok1)
12151216 continue ;
0 commit comments