Skip to content

Commit 56400c2

Browse files
authored
fix #12605: internalAstError with C11 _Atomic() (danmar#7311)
1 parent 8b70ee8 commit 56400c2

File tree

2 files changed

+14
-0
lines changed

2 files changed

+14
-0
lines changed

lib/tokenize.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9585,6 +9585,10 @@ void Tokenizer::simplifyKeyword()
95859585

95869586
if (mSettings.standards.c >= Standards::C11) {
95879587
while (tok->str() == "_Atomic") {
9588+
if (Token::simpleMatch(tok->next(), "(")) {
9589+
tok->linkAt(1)->deleteThis();
9590+
tok->next()->deleteThis();
9591+
}
95889592
for (Token* temp: getTypeTokens())
95899593
temp->isAtomic(true);
95909594
tok->deleteThis();

test/testtokenize.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,8 @@ class TestTokenizer : public TestFixture {
471471
TEST_CASE(genericInIf); // #13561
472472

473473
TEST_CASE(preincrementInLambda); // #13312
474+
475+
TEST_CASE(atomicCast); // #12605
474476
}
475477

476478
#define tokenizeAndStringify(...) tokenizeAndStringify_(__FILE__, __LINE__, __VA_ARGS__)
@@ -8431,6 +8433,14 @@ class TestTokenizer : public TestFixture {
84318433
"}\n";
84328434
ASSERT_NO_THROW(tokenizeAndStringify(code));
84338435
}
8436+
8437+
void atomicCast() { // #12605
8438+
const char code[] = "int atomic_add_int(int *ptr, int v)\n"
8439+
"{\n"
8440+
" return atomic_fetch_add((_Atomic(unsigned int) *)ptr, v) + v;\n"
8441+
"}\n";
8442+
ASSERT_NO_THROW(tokenizeAndStringify(code, settingsDefault, false));
8443+
}
84348444
};
84358445

84368446
REGISTER_TEST(TestTokenizer)

0 commit comments

Comments
 (0)