Improved handling of inline assembly (#6813):
- Add ; after asm {} block if required - Fixed inline suppressions
This commit is contained in:
parent
a0890ecd2c
commit
149d11d9ad
|
@ -588,8 +588,11 @@ std::string Preprocessor::removeComments(const std::string &str, const std::stri
|
||||||
} else if ((i == 0 || std::isspace((unsigned char)str[i-1])) && str.compare(i, 5, "__asm") == 0) {
|
} else if ((i == 0 || std::isspace((unsigned char)str[i-1])) && str.compare(i, 5, "__asm") == 0) {
|
||||||
while (i < str.size() && (std::isalpha((unsigned char)str[i]) || str[i] == '_'))
|
while (i < str.size() && (std::isalpha((unsigned char)str[i]) || str[i] == '_'))
|
||||||
code << str[i++];
|
code << str[i++];
|
||||||
while (i < str.size() && std::isspace((unsigned char)str[i]))
|
while (i < str.size() && std::isspace((unsigned char)str[i])) {
|
||||||
|
if (str[i] == '\n')
|
||||||
|
lineno++;
|
||||||
code << str[i++];
|
code << str[i++];
|
||||||
|
}
|
||||||
if (str[i] == '{') {
|
if (str[i] == '{') {
|
||||||
// Ticket 4873: Extract comments from the __asm / __asm__'s content
|
// Ticket 4873: Extract comments from the __asm / __asm__'s content
|
||||||
std::string asmBody;
|
std::string asmBody;
|
||||||
|
@ -599,6 +602,8 @@ std::string Preprocessor::removeComments(const std::string &str, const std::stri
|
||||||
if (backslashN != std::string::npos) // Ticket #4922: Don't go in infinite loop or crash if there is no '\n'
|
if (backslashN != std::string::npos) // Ticket #4922: Don't go in infinite loop or crash if there is no '\n'
|
||||||
i = backslashN;
|
i = backslashN;
|
||||||
}
|
}
|
||||||
|
if (str[i] == '\n')
|
||||||
|
lineno++;
|
||||||
asmBody += str[i++];
|
asmBody += str[i++];
|
||||||
}
|
}
|
||||||
code << removeComments(asmBody, filename);
|
code << removeComments(asmBody, filename);
|
||||||
|
|
|
@ -9528,6 +9528,8 @@ void Tokenizer::simplifyAsm()
|
||||||
|
|
||||||
// insert "asm ( "instruction" )"
|
// insert "asm ( "instruction" )"
|
||||||
tok->str("asm");
|
tok->str("asm");
|
||||||
|
if (tok->strAt(1) != ";" && tok->strAt(1) != "{")
|
||||||
|
tok->insertToken(";");
|
||||||
tok->insertToken(")");
|
tok->insertToken(")");
|
||||||
tok->insertToken("\"" + instruction + "\"");
|
tok->insertToken("\"" + instruction + "\"");
|
||||||
tok->insertToken("(");
|
tok->insertToken("(");
|
||||||
|
|
|
@ -297,6 +297,18 @@ private:
|
||||||
"");
|
"");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
// suppress uninitvar inline, with asm before (#6813)
|
||||||
|
(this->*check)("void f() {\n"
|
||||||
|
" __asm {\n"
|
||||||
|
" foo\n"
|
||||||
|
" }"
|
||||||
|
" int a;\n"
|
||||||
|
" // cppcheck-suppress uninitvar\n"
|
||||||
|
" a++;\n"
|
||||||
|
"}",
|
||||||
|
"");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
// suppress uninitvar inline, without error present
|
// suppress uninitvar inline, without error present
|
||||||
(this->*check)("void f() {\n"
|
(this->*check)("void f() {\n"
|
||||||
" int a;\n"
|
" int a;\n"
|
||||||
|
|
|
@ -1076,6 +1076,7 @@ private:
|
||||||
ASSERT_EQUALS("asm ( \"\"ddd\"\" ) ;", tokenizeAndStringify(" __asm __volatile__ (\"ddd\") ;"));
|
ASSERT_EQUALS("asm ( \"\"ddd\"\" ) ;", tokenizeAndStringify(" __asm __volatile__ (\"ddd\") ;"));
|
||||||
ASSERT_EQUALS("asm ( \"\"ddd\"\" ) ;", tokenizeAndStringify(" __asm __volatile (\"ddd\") ;"));
|
ASSERT_EQUALS("asm ( \"\"ddd\"\" ) ;", tokenizeAndStringify(" __asm __volatile (\"ddd\") ;"));
|
||||||
ASSERT_EQUALS("asm ( \"\"mov ax,bx\"\" ) ;", tokenizeAndStringify("__asm__ volatile ( \"mov ax,bx\" );"));
|
ASSERT_EQUALS("asm ( \"\"mov ax,bx\"\" ) ;", tokenizeAndStringify("__asm__ volatile ( \"mov ax,bx\" );"));
|
||||||
|
ASSERT_EQUALS("asm ( \"mov ax , bx\" ) ; int a ;", tokenizeAndStringify("asm { mov ax,bx } int a;"));
|
||||||
|
|
||||||
// 'asm ( ) ;' should be in the same line
|
// 'asm ( ) ;' should be in the same line
|
||||||
ASSERT_EQUALS(";\n\nasm ( \"\"mov ax,bx\"\" ) ;", tokenizeAndStringify(";\n\n__asm__ volatile ( \"mov ax,bx\" );", true));
|
ASSERT_EQUALS(";\n\nasm ( \"\"mov ax,bx\"\" ) ;", tokenizeAndStringify(";\n\n__asm__ volatile ( \"mov ax,bx\" );", true));
|
||||||
|
|
Loading…
Reference in New Issue