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 4, 2024
1 parent bd694db commit c23f1a2
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
22 changes: 22 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,25 @@ class CPPCHECKLIB Token {
void isAttributeMaybeUnused(const bool value) {
setFlag(fIsAttributeMaybeUnused, value);
}
std::vector<std::string> getAttributeAlignas() const {
if (mImpl->mAttributeAlignas.empty())
return {};
const std::string::size_type pos = mImpl->mAttributeAlignas.find('\n');
if (pos == std::string::npos)
return {mImpl->mAttributeAlignas};
return {mImpl->mAttributeAlignas.substr(0, pos),
mImpl->mAttributeAlignas.substr(pos + 1)};
}
bool hasAttributeAlignas() const {
return !mImpl->mAttributeAlignas.empty();
}
void addAttributeAlignas(const std::string& a) {
if (mImpl->mAttributeAlignas.empty())
mImpl->mAttributeAlignas = a;
else if (a != mImpl->mAttributeAlignas && mImpl->mAttributeAlignas.find('\n') == std::string::npos)
// mismatching alignas expressions, add both
mImpl->mAttributeAlignas += '\n' + a;
}
void setCppcheckAttribute(TokenImpl::CppcheckAttributes::Type type, MathLib::bigint value) {
mImpl->setCppcheckAttribute(type, value);
}
Expand Down
21 changes: 21 additions & 0 deletions lib/tokenize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6044,6 +6044,12 @@ void Tokenizer::dump(std::ostream &out) const
outs += " isAttributeMaybeUnused=\"true\"";
if (tok->isAttributeUnused())
outs += " isAttributeUnused=\"true\"";
if (tok->hasAttributeAlignas()) {
const std::vector<std::string>& a = tok->getAttributeAlignas();
outs += " alignas=\"" + ErrorLogger::toxml(a[0]) + "\"";
if (a.size() > 1)
outs += " alignas2=\"" + ErrorLogger::toxml(a[1]) + "\"";
}
if (tok->link()) {
outs += " link=\"";
outs += id_string(tok->link());
Expand Down Expand Up @@ -9353,6 +9359,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->addAttributeAlignas(a.substr(1));
}
// alignment requirements could be checked here
}
}
Expand Down

0 comments on commit c23f1a2

Please sign in to comment.