@@ -452,8 +452,7 @@ namespace {
452
452
bool inCase{}; // true from case to :
453
453
bool stopAtColon{}; // help to properly parse ternary operators
454
454
const Token* functionCallEndPar{};
455
- const Library &library;
456
- explicit AST_state (bool cpp, const Library &library) : cpp(cpp), library(library) {}
455
+ explicit AST_state (bool cpp) : cpp(cpp) {}
457
456
};
458
457
}
459
458
@@ -491,7 +490,7 @@ static Token* skipDecl(Token* tok, std::vector<Token*>* inner = nullptr)
491
490
return tok;
492
491
}
493
492
494
- static bool iscast (const Token *tok, const AST_state &state )
493
+ static bool iscast (const Token *tok, bool cpp )
495
494
{
496
495
if (!Token::Match (tok, " ( ::| %name%" ))
497
496
return false ;
@@ -503,7 +502,7 @@ static bool iscast(const Token *tok, const AST_state &state)
503
502
return false ;
504
503
505
504
if (tok->previous () && tok->previous ()->isName () && tok->strAt (-1 ) != " return" &&
506
- (!state. cpp || !Token::Match (tok->previous (), " delete|throw" )))
505
+ (!cpp || !Token::Match (tok->previous (), " delete|throw" )))
507
506
return false ;
508
507
509
508
if (Token::simpleMatch (tok->previous (), " >" ) && tok->linkAt (-1 ))
@@ -528,10 +527,7 @@ static bool iscast(const Token *tok, const AST_state &state)
528
527
for (const Token *tok2 = tok->next (); tok2; tok2 = tok2->next ()) {
529
528
if (tok2->varId () != 0 )
530
529
return false ;
531
- if (state.cpp && !type && tok2->str () == " new" )
532
- return false ;
533
-
534
- if (!state.library .isNotLibraryFunction (tok2))
530
+ if (cpp && !type && tok2->str () == " new" )
535
531
return false ;
536
532
537
533
while (tok2->link () && Token::Match (tok2, " (|[|<" ))
@@ -804,7 +800,7 @@ static void compileTerm(Token *&tok, AST_state& state)
804
800
std::vector<Token*> inner;
805
801
tok = skipDecl (tok, &inner);
806
802
for (Token* tok3 : inner) {
807
- AST_state state1 (state.cpp , state. library );
803
+ AST_state state1 (state.cpp );
808
804
compileExpression (tok3, state1);
809
805
}
810
806
bool repeat = true ;
@@ -834,7 +830,7 @@ static void compileTerm(Token *&tok, AST_state& state)
834
830
}
835
831
} else if (tok->str () == " {" ) {
836
832
const Token *prev = tok->previous ();
837
- if (Token::simpleMatch (prev, " ) {" ) && iscast (prev->link (), state))
833
+ if (Token::simpleMatch (prev, " ) {" ) && iscast (prev->link (), state. cpp ))
838
834
prev = prev->link ()->previous ();
839
835
if (Token::simpleMatch (tok->link ()," } [" )) {
840
836
tok = tok->next ();
@@ -906,9 +902,9 @@ static void compileScope(Token *&tok, AST_state& state)
906
902
}
907
903
}
908
904
909
- static bool isPrefixUnary (const Token* tok, const AST_state &state )
905
+ static bool isPrefixUnary (const Token* tok, bool cpp )
910
906
{
911
- if (state. cpp && Token::simpleMatch (tok->previous (), " * [" ) && Token::simpleMatch (tok->link (), " ] {" )) {
907
+ if (cpp && Token::simpleMatch (tok->previous (), " * [" ) && Token::simpleMatch (tok->link (), " ] {" )) {
912
908
for (const Token* prev = tok->previous (); Token::Match (prev, " %name%|::|*|&|>|>>" ); prev = prev->previous ()) {
913
909
if (Token::Match (prev, " >|>>" )) {
914
910
if (!prev->link ())
@@ -920,7 +916,7 @@ static bool isPrefixUnary(const Token* tok, const AST_state &state)
920
916
}
921
917
}
922
918
if (!tok->previous ()
923
- || ((Token::Match (tok->previous (), " (|[|{|%op%|;|?|:|,|.|case|return|::" ) || (state. cpp && tok->strAt (-1 ) == " throw" ))
919
+ || ((Token::Match (tok->previous (), " (|[|{|%op%|;|?|:|,|.|case|return|::" ) || (cpp && tok->strAt (-1 ) == " throw" ))
924
920
&& (tok->previous ()->tokType () != Token::eIncDecOp || tok->tokType () == Token::eIncDecOp)))
925
921
return true ;
926
922
@@ -929,10 +925,10 @@ static bool isPrefixUnary(const Token* tok, const AST_state &state)
929
925
return !Token::Match (parent, " %type%" ) || parent->isKeyword ();
930
926
}
931
927
932
- if (tok->str () == " *" && tok->previous ()->tokType () == Token::eIncDecOp && isPrefixUnary (tok->previous (), state ))
928
+ if (tok->str () == " *" && tok->previous ()->tokType () == Token::eIncDecOp && isPrefixUnary (tok->previous (), cpp ))
933
929
return true ;
934
930
935
- return tok->strAt (-1 ) == " )" && iscast (tok->linkAt (-1 ), state );
931
+ return tok->strAt (-1 ) == " )" && iscast (tok->linkAt (-1 ), cpp );
936
932
}
937
933
938
934
static void compilePrecedence2 (Token *&tok, AST_state& state)
@@ -958,7 +954,7 @@ static void compilePrecedence2(Token *&tok, AST_state& state)
958
954
isNew = false ;
959
955
}
960
956
while (tok) {
961
- if (tok->tokType () == Token::eIncDecOp && !isPrefixUnary (tok, state)) {
957
+ if (tok->tokType () == Token::eIncDecOp && !isPrefixUnary (tok, state. cpp )) {
962
958
compileUnaryOp (tok, state, compileScope);
963
959
} else if (tok->str () == " ..." ) {
964
960
if (!Token::simpleMatch (tok->previous (), " )" ))
@@ -976,7 +972,7 @@ static void compilePrecedence2(Token *&tok, AST_state& state)
976
972
else
977
973
compileUnaryOp (tok, state, compileScope);
978
974
} else if (tok->str () == " [" ) {
979
- if (state.cpp && isPrefixUnary (tok, state ) && Token::Match (tok->link (), " ] (|{|<" )) { // Lambda
975
+ if (state.cpp && isPrefixUnary (tok, /* cpp */ true ) && Token::Match (tok->link (), " ] (|{|<" )) { // Lambda
980
976
// What we do here:
981
977
// - Nest the round bracket under the square bracket.
982
978
// - Nest what follows the lambda (if anything) with the lambda opening [
@@ -986,7 +982,7 @@ static void compilePrecedence2(Token *&tok, AST_state& state)
986
982
// Parse arguments in the capture list
987
983
if (tok->strAt (1 ) != " ]" ) {
988
984
Token* tok2 = tok->next ();
989
- AST_state state2 (state.cpp , state. library );
985
+ AST_state state2 (state.cpp );
990
986
compileExpression (tok2, state2);
991
987
if (!state2.op .empty ()) {
992
988
squareBracket->astOperand2 (state2.op .top ());
@@ -1050,7 +1046,7 @@ static void compilePrecedence2(Token *&tok, AST_state& state)
1050
1046
tok = tok->link ()->next ();
1051
1047
continue ;
1052
1048
} else if (tok->str () == " (" &&
1053
- (!iscast (tok, state) || Token::Match (tok->previous (), " if|while|for|switch|catch" ))) {
1049
+ (!iscast (tok, state. cpp ) || Token::Match (tok->previous (), " if|while|for|switch|catch" ))) {
1054
1050
Token* tok2 = tok;
1055
1051
tok = tok->next ();
1056
1052
const bool opPrevTopSquare = !state.op .empty () && state.op .top () && state.op .top ()->str () == " [" ;
@@ -1061,7 +1057,7 @@ static void compilePrecedence2(Token *&tok, AST_state& state)
1061
1057
|| (tok->previous () && tok->previous ()->isName () && !Token::Match (tok->previous (), " return|case" ) && (!state.cpp || !Token::Match (tok->previous (), " throw|delete" )))
1062
1058
|| (tok->strAt (-1 ) == " ]" && (!state.cpp || !Token::Match (tok->linkAt (-1 )->previous (), " new|delete" )))
1063
1059
|| (tok->strAt (-1 ) == " >" && tok->linkAt (-1 ))
1064
- || (tok->strAt (-1 ) == " )" && !iscast (tok->linkAt (-1 ), state)) // Don't treat brackets to clarify precedence as function calls
1060
+ || (tok->strAt (-1 ) == " )" && !iscast (tok->linkAt (-1 ), state. cpp )) // Don't treat brackets to clarify precedence as function calls
1065
1061
|| (tok->strAt (-1 ) == " }" && opPrevTopSquare)) {
1066
1062
const bool operandInside = oldOpSize < state.op .size ();
1067
1063
if (operandInside)
@@ -1072,7 +1068,7 @@ static void compilePrecedence2(Token *&tok, AST_state& state)
1072
1068
tok = tok->link ()->next ();
1073
1069
if (Token::simpleMatch (tok, " ::" ))
1074
1070
compileBinOp (tok, state, compileTerm);
1075
- } else if (iscast (tok, state) && Token::simpleMatch (tok->link (), " ) {" ) &&
1071
+ } else if (iscast (tok, state. cpp ) && Token::simpleMatch (tok->link (), " ) {" ) &&
1076
1072
Token::simpleMatch (tok->link ()->linkAt (1 ), " } [" )) {
1077
1073
Token *cast = tok;
1078
1074
tok = tok->link ()->next ();
@@ -1105,7 +1101,7 @@ static void compilePrecedence3(Token *&tok, AST_state& state)
1105
1101
compilePrecedence2 (tok, state);
1106
1102
while (tok) {
1107
1103
if ((Token::Match (tok, " [+-!~*&]" ) || tok->tokType () == Token::eIncDecOp) &&
1108
- isPrefixUnary (tok, state)) {
1104
+ isPrefixUnary (tok, state. cpp )) {
1109
1105
if (Token::Match (tok, " * [*,)]" )) {
1110
1106
Token* tok2 = tok->next ();
1111
1107
while (tok2->next () && tok2->str () == " *" )
@@ -1116,7 +1112,7 @@ static void compilePrecedence3(Token *&tok, AST_state& state)
1116
1112
}
1117
1113
}
1118
1114
compileUnaryOp (tok, state, compilePrecedence3);
1119
- } else if (tok->str () == " (" && iscast (tok, state)) {
1115
+ } else if (tok->str () == " (" && iscast (tok, state. cpp )) {
1120
1116
Token* castTok = tok;
1121
1117
castTok->isCast (true );
1122
1118
tok = tok->link ()->next ();
@@ -1136,7 +1132,7 @@ static void compilePrecedence3(Token *&tok, AST_state& state)
1136
1132
if (Token::Match (tok->link (), " ) ::| %type%" )) {
1137
1133
if (Token::Match (tok, " ( !!)" )) {
1138
1134
Token *innerTok = tok->next ();
1139
- AST_state innerState (true , state. library );
1135
+ AST_state innerState (true );
1140
1136
compileExpression (innerTok, innerState);
1141
1137
}
1142
1138
tok = tok->link ()->next ();
@@ -1461,10 +1457,10 @@ const Token* findLambdaEndTokenWithoutAST(const Token* tok) {
1461
1457
return tok->link ()->next ();
1462
1458
}
1463
1459
1464
- static Token * createAstAtToken (Token *tok, const Library &library );
1460
+ static Token * createAstAtToken (Token *tok);
1465
1461
1466
1462
// Compile inner expressions inside inner ({..}) and lambda bodies
1467
- static void createAstAtTokenInner (Token * const tok1, const Token *endToken, bool cpp, const Library &library )
1463
+ static void createAstAtTokenInner (Token * const tok1, const Token *endToken, bool cpp)
1468
1464
{
1469
1465
for (Token* tok = tok1; precedes (tok, endToken); tok = tok ? tok->next () : nullptr ) {
1470
1466
if (tok->str () == " {" && !iscpp11init (tok)) {
@@ -1482,7 +1478,7 @@ static void createAstAtTokenInner(Token * const tok1, const Token *endToken, boo
1482
1478
}
1483
1479
if (!hasAst) {
1484
1480
for (; tok && tok != endToken && tok != endToken2; tok = tok ? tok->next () : nullptr )
1485
- tok = createAstAtToken (tok, library );
1481
+ tok = createAstAtToken (tok);
1486
1482
}
1487
1483
} else if (cpp && tok->str () == " [" ) {
1488
1484
if (isLambdaCaptureList (tok)) {
@@ -1492,7 +1488,7 @@ static void createAstAtTokenInner(Token * const tok1, const Token *endToken, boo
1492
1488
const Token * const endToken2 = tok->link ();
1493
1489
tok = tok->next ();
1494
1490
for (; tok && tok != endToken && tok != endToken2; tok = tok ? tok->next () : nullptr )
1495
- tok = createAstAtToken (tok, library );
1491
+ tok = createAstAtToken (tok);
1496
1492
}
1497
1493
}
1498
1494
else if (Token::simpleMatch (tok, " ( * ) [" )) {
@@ -1506,9 +1502,9 @@ static void createAstAtTokenInner(Token * const tok1, const Token *endToken, boo
1506
1502
if (!hasAst) {
1507
1503
Token *const startTok = tok = tok->tokAt (4 );
1508
1504
const Token* const endtok = startTok->linkAt (-1 );
1509
- AST_state state (cpp, library );
1505
+ AST_state state (cpp);
1510
1506
compileExpression (tok, state);
1511
- createAstAtTokenInner (startTok, endtok, cpp, library );
1507
+ createAstAtTokenInner (startTok, endtok, cpp);
1512
1508
}
1513
1509
}
1514
1510
}
@@ -1534,7 +1530,7 @@ static Token * findAstTop(Token *tok1, const Token *tok2)
1534
1530
return nullptr ;
1535
1531
}
1536
1532
1537
- static Token * createAstAtToken (Token *tok, const Library &library )
1533
+ static Token * createAstAtToken (Token *tok)
1538
1534
{
1539
1535
const bool cpp = tok->isCpp ();
1540
1536
// skip function pointer declaration
@@ -1572,7 +1568,7 @@ static Token * createAstAtToken(Token *tok, const Library &library)
1572
1568
if (cpp && Token::Match (tok, " for ( const| auto &|&&| [" )) {
1573
1569
Token *decl = Token::findsimplematch (tok, " [" );
1574
1570
if (Token::simpleMatch (decl->link (), " ] :" )) {
1575
- AST_state state1 (cpp, library );
1571
+ AST_state state1 (cpp);
1576
1572
while (decl->str () != " ]" ) {
1577
1573
if (Token::Match (decl, " %name% ,|]" )) {
1578
1574
state1.op .push (decl);
@@ -1609,14 +1605,14 @@ static Token * createAstAtToken(Token *tok, const Library &library)
1609
1605
std::vector<Token*> inner;
1610
1606
Token* tok2 = skipDecl (tok->tokAt (2 ), &inner);
1611
1607
for (Token* tok3 : inner) {
1612
- AST_state state1 (cpp, library );
1608
+ AST_state state1 (cpp);
1613
1609
compileExpression (tok3, state1);
1614
1610
}
1615
1611
Token *init1 = nullptr ;
1616
1612
Token * const endPar = tok->linkAt (1 );
1617
1613
if (tok2 == tok->tokAt (2 ) && Token::Match (tok2, " %op%|(" )) {
1618
1614
init1 = tok2;
1619
- AST_state state1 (cpp, library );
1615
+ AST_state state1 (cpp);
1620
1616
compileExpression (tok2, state1);
1621
1617
if (Token::Match (init1, " ( !!{" )) {
1622
1618
for (Token *tok3 = init1; tok3 && tok3 != tok3->link (); tok3 = tok3->next ()) {
@@ -1636,7 +1632,7 @@ static Token * createAstAtToken(Token *tok, const Library &library)
1636
1632
tok2 = tok2->link ();
1637
1633
} else if (Token::Match (tok2, " %name% )| %op%|(|[|{|.|:|::" ) || Token::Match (tok2->previous (), " [(;{}] %cop%|(" )) {
1638
1634
init1 = tok2;
1639
- AST_state state1 (cpp, library );
1635
+ AST_state state1 (cpp);
1640
1636
compileExpression (tok2, state1);
1641
1637
if (Token::Match (tok2, " ;|)" ))
1642
1638
break ;
@@ -1649,7 +1645,7 @@ static Token * createAstAtToken(Token *tok, const Library &library)
1649
1645
}
1650
1646
if (!tok2 || tok2->str () != " ;" ) {
1651
1647
if (tok2 == endPar && init1) {
1652
- createAstAtTokenInner (init1->next (), endPar, cpp, library );
1648
+ createAstAtTokenInner (init1->next (), endPar, cpp);
1653
1649
tok->next ()->astOperand2 (init1);
1654
1650
tok->next ()->astOperand1 (tok);
1655
1651
}
@@ -1660,7 +1656,7 @@ static Token * createAstAtToken(Token *tok, const Library &library)
1660
1656
1661
1657
Token * const semicolon1 = tok2;
1662
1658
tok2 = tok2->next ();
1663
- AST_state state2 (cpp, library );
1659
+ AST_state state2 (cpp);
1664
1660
compileExpression (tok2, state2);
1665
1661
1666
1662
Token * const semicolon2 = tok2;
@@ -1669,7 +1665,7 @@ static Token * createAstAtToken(Token *tok, const Library &library)
1669
1665
1670
1666
if (semicolon2->str () == " ;" ) {
1671
1667
tok2 = tok2->next ();
1672
- AST_state state3 (cpp, library );
1668
+ AST_state state3 (cpp);
1673
1669
if (Token::simpleMatch (tok2, " ( {" )) {
1674
1670
state3.op .push (tok2->next ());
1675
1671
tok2 = tok2->link ()->next ();
@@ -1697,7 +1693,7 @@ static Token * createAstAtToken(Token *tok, const Library &library)
1697
1693
tok->next ()->astOperand1 (tok);
1698
1694
tok->next ()->astOperand2 (semicolon1);
1699
1695
1700
- createAstAtTokenInner (endPar->link (), endPar, cpp, library );
1696
+ createAstAtTokenInner (endPar->link (), endPar, cpp);
1701
1697
1702
1698
return endPar;
1703
1699
}
@@ -1720,9 +1716,9 @@ static Token * createAstAtToken(Token *tok, const Library &library)
1720
1716
}
1721
1717
if (Token::Match (tok2, " %name%|> %name% {" ) && tok2->next ()->varId () && iscpp11init (tok2->tokAt (2 ))) {
1722
1718
Token *const tok1 = tok = tok2->next ();
1723
- AST_state state (cpp, library );
1719
+ AST_state state (cpp);
1724
1720
compileExpression (tok, state);
1725
- createAstAtTokenInner (tok1->next (), tok1->linkAt (1 ), cpp, library );
1721
+ createAstAtTokenInner (tok1->next (), tok1->linkAt (1 ), cpp);
1726
1722
return tok;
1727
1723
}
1728
1724
}
@@ -1762,7 +1758,7 @@ static Token * createAstAtToken(Token *tok, const Library &library)
1762
1758
tok = tok->previous ();
1763
1759
1764
1760
Token * const tok1 = tok;
1765
- AST_state state (cpp, library );
1761
+ AST_state state (cpp);
1766
1762
if (Token::Match (tok, " %name% (" ))
1767
1763
state.functionCallEndPar = tok->linkAt (1 );
1768
1764
if (Token::simpleMatch (tok->tokAt (-1 ), " ::" ) && (!tok->tokAt (-2 ) || !tok->tokAt (-2 )->isName ()))
@@ -1772,20 +1768,20 @@ static Token * createAstAtToken(Token *tok, const Library &library)
1772
1768
if (endToken == tok1 || !endToken)
1773
1769
return tok1;
1774
1770
1775
- createAstAtTokenInner (tok1->next (), endToken, cpp, library );
1771
+ createAstAtTokenInner (tok1->next (), endToken, cpp);
1776
1772
1777
1773
return endToken->previous ();
1778
1774
}
1779
1775
1780
1776
if (cpp && tok->str () == " {" && iscpp11init (tok)) {
1781
1777
Token * const tok1 = tok;
1782
- AST_state state (cpp, library );
1778
+ AST_state state (cpp);
1783
1779
compileExpression (tok, state);
1784
1780
Token* const endToken = tok;
1785
1781
if (endToken == tok1 || !endToken)
1786
1782
return tok1;
1787
1783
1788
- createAstAtTokenInner (tok1->next (), endToken, cpp, library );
1784
+ createAstAtTokenInner (tok1->next (), endToken, cpp);
1789
1785
return endToken->previous ();
1790
1786
}
1791
1787
@@ -1795,7 +1791,7 @@ static Token * createAstAtToken(Token *tok, const Library &library)
1795
1791
void TokenList::createAst () const
1796
1792
{
1797
1793
for (Token *tok = mTokensFrontBack .front ; tok; tok = tok ? tok->next () : nullptr ) {
1798
- Token* const nextTok = createAstAtToken (tok, mSettings -> library );
1794
+ Token* const nextTok = createAstAtToken (tok);
1799
1795
if (precedes (nextTok, tok))
1800
1796
throw InternalError (tok, " Syntax Error: Infinite loop when creating AST." , InternalError::AST);
1801
1797
tok = nextTok;
0 commit comments