Skip to content

Commit

Permalink
Fix #12807 (dump file: provide alignas expressions)
Browse files Browse the repository at this point in the history
  • Loading branch information
danmar committed Jun 3, 2024
1 parent bd694db commit 851403f
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 0 deletions.
16 changes: 16 additions & 0 deletions lib/token.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,9 @@ struct TokenImpl {
};
CppcheckAttributes* mCppcheckAttributes{};

// alignas expressions
std::string mAttributeAlignas;

// For memoization, to speed up parsing of huge arrays #8897
enum class Cpp11init { UNKNOWN, CPP11INIT, NOINIT } mCpp11init = Cpp11init::UNKNOWN;

Expand Down Expand Up @@ -545,6 +548,19 @@ class CPPCHECKLIB Token {
void isAttributeMaybeUnused(const bool value) {
setFlag(fIsAttributeMaybeUnused, value);
}
std::string getAttributeAlignas() const {
return mImpl->mAttributeAlignas;
}
bool hasAttributeAlignas() const {
return !mImpl->mAttributeAlignas.empty();
}
void setAttributeAlignas(const std::string& a) {
if (a.empty() || mImpl->mAttributeAlignas.empty())
mImpl->mAttributeAlignas = a;
else if (a != mImpl->mAttributeAlignas)
// mismatching alignas expressions, add both
mImpl->mAttributeAlignas += "\\" + a;
}
void setCppcheckAttribute(TokenImpl::CppcheckAttributes::Type type, MathLib::bigint value) {
mImpl->setCppcheckAttribute(type, value);
}
Expand Down
17 changes: 17 additions & 0 deletions lib/tokenize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6044,6 +6044,8 @@ void Tokenizer::dump(std::ostream &out) const
outs += " isAttributeMaybeUnused=\"true\"";
if (tok->isAttributeUnused())
outs += " isAttributeUnused=\"true\"";
if (tok->hasAttributeAlignas())
outs += " alignas=\"" + ErrorLogger::toxml(tok->getAttributeAlignas()) + "\"";
if (tok->link()) {
outs += " link=\"";
outs += id_string(tok->link());
Expand Down Expand Up @@ -9353,6 +9355,21 @@ void Tokenizer::simplifyCPPAttribute()
}
} else {
if (Token::simpleMatch(tok, "alignas (")) {
Token* atok = nullptr;
if (Token::Match(tok->previous(), "%name%"))
atok = tok->previous();
else {
atok = tok;
while (isCPPAttribute(atok) || isAlignAttribute(atok))
atok = skipCPPOrAlignAttribute(atok)->next();
}
if (atok) {
std::string a;
for (const Token* t = tok->tokAt(2); t && t->str() != ")"; t = t->next())
a += " " + t->str();
if (a.size() > 1)
atok->setAttributeAlignas(a.substr(1));
}
// alignment requirements could be checked here
}
}
Expand Down

0 comments on commit 851403f

Please sign in to comment.