diff options
author | Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com> | 2015-02-19 13:25:10 +0100 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com> | 2015-02-25 13:55:01 +0000 |
commit | b7e839fbbd366863292566afbe736d7432d439ea (patch) | |
tree | 8875a4935789535ef71676508cfcc5bcb5e11031 /qmake/library | |
parent | 73c84fb32bfb09a87d3a63b1f0c78d3f500ba20b (diff) |
don't make an even number of bangs almost entirely invisible
otherwise we'd silently accept this nonsensical code:
!!defineTest(foo) {}
Change-Id: I66b59c8a89852c6451ce8d7269a3dc66a53e3b1f
Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
Diffstat (limited to 'qmake/library')
-rw-r--r-- | qmake/library/qmakeparser.cpp | 17 | ||||
-rw-r--r-- | qmake/library/qmakeparser.h | 2 |
2 files changed, 9 insertions, 10 deletions
diff --git a/qmake/library/qmakeparser.cpp b/qmake/library/qmakeparser.cpp index d4e9bac86f..0df3c16ea0 100644 --- a/qmake/library/qmakeparser.cpp +++ b/qmake/library/qmakeparser.cpp @@ -320,7 +320,7 @@ void QMakeParser::read(ProFile *pro, const QString &in, int line, SubGrammar gra m_canElse = false; freshLine: m_state = StNew; - m_invert = false; + m_invert = 0; m_operator = NoOperator; m_markLine = m_lineNo; m_inError = false; @@ -603,7 +603,7 @@ void QMakeParser::read(ProFile *pro, const QString &in, int line, SubGrammar gra quote = 0; goto nextChr; } else if (c == '!' && ptr == xprPtr && context == CtxTest) { - m_invert ^= true; + m_invert++; goto nextChr; } } else if (c == '\'' || c == '"') { @@ -666,7 +666,7 @@ void QMakeParser::read(ProFile *pro, const QString &in, int line, SubGrammar gra term = ':'; goto funcCall; } else if (c == '!' && ptr == xprPtr) { - m_invert ^= true; + m_invert++; goto nextChr; } else if (c == ':') { FLUSH_LHS_LITERAL(); @@ -923,7 +923,7 @@ void QMakeParser::warnOperator(const char *msg) { if (m_invert) { languageWarning(fL1S("Stray NOT operator %1.").arg(fL1S(msg))); - m_invert = false; + m_invert = 0; } if (m_operator == AndOperator) { languageWarning(fL1S("Stray AND operator %1.").arg(fL1S(msg))); @@ -939,7 +939,7 @@ bool QMakeParser::failOperator(const char *msg) bool fail = false; if (m_invert) { parseError(fL1S("Unexpected NOT operator %1.").arg(fL1S(msg))); - m_invert = false; + m_invert = 0; fail = true; } if (m_operator == AndOperator) { @@ -980,10 +980,9 @@ void QMakeParser::finalizeTest(ushort *&tokPtr) flushScopes(tokPtr); putLineMarker(tokPtr); putOperator(tokPtr); - if (m_invert) { + if (m_invert & 1) putTok(tokPtr, TokNot); - m_invert = false; - } + m_invert = 0; m_state = StCond; m_canElse = true; } @@ -994,7 +993,7 @@ void QMakeParser::bogusTest(ushort *&tokPtr, const QString &msg) parseError(msg); flushScopes(tokPtr); m_operator = NoOperator; - m_invert = false; + m_invert = 0; m_state = StCond; m_canElse = true; } diff --git a/qmake/library/qmakeparser.h b/qmake/library/qmakeparser.h index 66b26ac759..5c416b26f5 100644 --- a/qmake/library/qmakeparser.h +++ b/qmake/library/qmakeparser.h @@ -175,7 +175,7 @@ private: int m_markLine; // Put marker for this line bool m_inError; // Current line had a parsing error; suppress followup error messages bool m_canElse; // Conditionals met on previous line, but no scope was opened - bool m_invert; // Pending conditional is negated + int m_invert; // Pending conditional is negated enum { NoOperator, AndOperator, OrOperator } m_operator; // Pending conditional is ORed/ANDed QString m_tmp; // Temporary for efficient toQString |