diff --git a/lib/token.h b/lib/token.h index 8a88ec540..5864a0db9 100644 --- a/lib/token.h +++ b/lib/token.h @@ -661,6 +661,13 @@ public: setFlag(fIsInline, b); } + bool isAtomic() const { + return getFlag(fIsAtomic); + } + void isAtomic(bool b) { + setFlag(fIsAtomic, b); + } + bool isRestrict() const { return getFlag(fIsRestrict); } @@ -1337,8 +1344,9 @@ private: fIsRemovedVoidParameter = (1ULL << 36), // A void function parameter has been removed fIsIncompleteConstant = (1ULL << 37), fIsRestrict = (1ULL << 38), // Is this a restrict pointer type - fIsSimplifiedTypedef = (1ULL << 39), - fIsFinalType = (1ULL << 40), // Is this a type with final specifier + fIsAtomic = (1ULL << 39), // Is this a _Atomic declaration + fIsSimplifiedTypedef = (1ULL << 40), + fIsFinalType = (1ULL << 41), // Is this a type with final specifier }; enum : uint64_t { diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 66d1c1a84..999f3b84a 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -5852,6 +5852,8 @@ void Tokenizer::dump(std::ostream &out) const out << " isComplex=\"true\""; if (tok->isRestrict()) out << " isRestrict=\"true\""; + if (tok->isAtomic()) + out << " isAtomic=\"true\""; if (tok->isAttributeExport()) out << " isAttributeExport=\"true\""; if (tok->link()) @@ -9046,16 +9048,31 @@ void Tokenizer::simplifyKeyword() tok->deleteNext(); if (c99) { - if (tok->str() == "restrict") { - for (Token *temp = tok->next(); Token::Match(temp, "%name%"); temp = temp->next()) { - temp->isRestrict(true); + auto getTypeTokens = [tok]() { + std::vector ret; + for (Token *temp = tok; Token::Match(temp, "%name%"); temp = temp->previous()) { + if (!temp->isKeyword()) + ret.emplace_back(temp); } + for (Token *temp = tok->next(); Token::Match(temp, "%name%"); temp = temp->next()) { + if (!temp->isKeyword()) + ret.emplace_back(temp); + } + return ret; + }; + + if (tok->str() == "restrict") { + for (Token* temp: getTypeTokens()) + temp->isRestrict(true); tok->deleteThis(); } if (mSettings->standards.c >= Standards::C11) { - while (tok->str() == "_Atomic") + while (tok->str() == "_Atomic") { + for (Token* temp: getTypeTokens()) + temp->isAtomic(true); tok->deleteThis(); + } } }