From 0ed9e947f1dc31736944f67f87f3528bd0477090 Mon Sep 17 00:00:00 2001 From: Robert Lind Date: Sun, 8 Dec 2019 18:05:46 +0100 Subject: [PATCH 1/3] Fix extern c typedef syntax error --- lib/tokenize.cpp | 3 ++- test/testgarbage.cpp | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 7dfcc78b866..b5d59d4fd0d 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -9346,7 +9346,8 @@ void Tokenizer::findGarbageCode() const while (prev && prev->isName()) prev = prev->previous(); if (Token::Match(prev, "%op%|%num%|%str%|%char%")) { - if (!Token::simpleMatch(tok->tokAt(-2), "operator \"\" if")) + if (!Token::simpleMatch(tok->tokAt(-2), "operator \"\" if") && + !Token::simpleMatch(tok->tokAt(-2), "extern \"C\" ") ) syntaxError(tok, prev == tok->previous() ? (prev->str() + " " + tok->str()) : (prev->str() + " .. " + tok->str())); } } diff --git a/test/testgarbage.cpp b/test/testgarbage.cpp index c23788654a4..a49d260d673 100644 --- a/test/testgarbage.cpp +++ b/test/testgarbage.cpp @@ -1771,6 +1771,9 @@ class TestGarbage : public TestFixture { "void f() {\n" " auto fn = []() -> foo* { return new foo(); };\n" "}\n"); + + checkCode( + "extern \"C\" typedef void FUNC();\n"); } }; From 1f550d6114a5b8b972460d32f0af14604b388ab6 Mon Sep 17 00:00:00 2001 From: Robert Lind Date: Mon, 9 Dec 2019 16:45:40 +0100 Subject: [PATCH 2/3] Fix extraWhiteSpaceError --- lib/tokenize.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index b5d59d4fd0d..08b7fbd54f8 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -9347,7 +9347,7 @@ void Tokenizer::findGarbageCode() const prev = prev->previous(); if (Token::Match(prev, "%op%|%num%|%str%|%char%")) { if (!Token::simpleMatch(tok->tokAt(-2), "operator \"\" if") && - !Token::simpleMatch(tok->tokAt(-2), "extern \"C\" ") ) + !Token::simpleMatch(tok->tokAt(-2), "extern \"C\"") ) syntaxError(tok, prev == tok->previous() ? (prev->str() + " " + tok->str()) : (prev->str() + " .. " + tok->str())); } } From 6d5efe457e2ff055ed372cf4b27d6fdea0fa90a7 Mon Sep 17 00:00:00 2001 From: Robert Lind Date: Wed, 11 Dec 2019 21:11:46 +0100 Subject: [PATCH 3/3] Move test from testgarbage to testtokenize --- test/testgarbage.cpp | 3 --- test/testtokenize.cpp | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/test/testgarbage.cpp b/test/testgarbage.cpp index a49d260d673..c23788654a4 100644 --- a/test/testgarbage.cpp +++ b/test/testgarbage.cpp @@ -1771,9 +1771,6 @@ class TestGarbage : public TestFixture { "void f() {\n" " auto fn = []() -> foo* { return new foo(); };\n" "}\n"); - - checkCode( - "extern \"C\" typedef void FUNC();\n"); } }; diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index a54ae343c4d..66fa588941f 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -7947,6 +7947,8 @@ class TestTokenizer : public TestFixture { ASSERT_NO_THROW(tokenizeAndStringify("S s = { .x=2, .y[0]=3 };")); ASSERT_NO_THROW(tokenizeAndStringify("S s = { .ab.a=2, .ab.b=3 };")); + + ASSERT_NO_THROW(tokenizeAndStringify("extern \"C\" typedef void FUNC();")); }