Skip to content

Commit c23f1a2

Browse files
committed
Fix #12807 (dump file: provide alignas expressions)
1 parent bd694db commit c23f1a2

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

lib/token.h

+22
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@ struct TokenImpl {
122122
};
123123
CppcheckAttributes* mCppcheckAttributes{};
124124

125+
// alignas expressions
126+
std::string mAttributeAlignas;
127+
125128
// For memoization, to speed up parsing of huge arrays #8897
126129
enum class Cpp11init { UNKNOWN, CPP11INIT, NOINIT } mCpp11init = Cpp11init::UNKNOWN;
127130

@@ -545,6 +548,25 @@ class CPPCHECKLIB Token {
545548
void isAttributeMaybeUnused(const bool value) {
546549
setFlag(fIsAttributeMaybeUnused, value);
547550
}
551+
std::vector<std::string> getAttributeAlignas() const {
552+
if (mImpl->mAttributeAlignas.empty())
553+
return {};
554+
const std::string::size_type pos = mImpl->mAttributeAlignas.find('\n');
555+
if (pos == std::string::npos)
556+
return {mImpl->mAttributeAlignas};
557+
return {mImpl->mAttributeAlignas.substr(0, pos),
558+
mImpl->mAttributeAlignas.substr(pos + 1)};
559+
}
560+
bool hasAttributeAlignas() const {
561+
return !mImpl->mAttributeAlignas.empty();
562+
}
563+
void addAttributeAlignas(const std::string& a) {
564+
if (mImpl->mAttributeAlignas.empty())
565+
mImpl->mAttributeAlignas = a;
566+
else if (a != mImpl->mAttributeAlignas && mImpl->mAttributeAlignas.find('\n') == std::string::npos)
567+
// mismatching alignas expressions, add both
568+
mImpl->mAttributeAlignas += '\n' + a;
569+
}
548570
void setCppcheckAttribute(TokenImpl::CppcheckAttributes::Type type, MathLib::bigint value) {
549571
mImpl->setCppcheckAttribute(type, value);
550572
}

lib/tokenize.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -6044,6 +6044,12 @@ void Tokenizer::dump(std::ostream &out) const
60446044
outs += " isAttributeMaybeUnused=\"true\"";
60456045
if (tok->isAttributeUnused())
60466046
outs += " isAttributeUnused=\"true\"";
6047+
if (tok->hasAttributeAlignas()) {
6048+
const std::vector<std::string>& a = tok->getAttributeAlignas();
6049+
outs += " alignas=\"" + ErrorLogger::toxml(a[0]) + "\"";
6050+
if (a.size() > 1)
6051+
outs += " alignas2=\"" + ErrorLogger::toxml(a[1]) + "\"";
6052+
}
60476053
if (tok->link()) {
60486054
outs += " link=\"";
60496055
outs += id_string(tok->link());
@@ -9353,6 +9359,21 @@ void Tokenizer::simplifyCPPAttribute()
93539359
}
93549360
} else {
93559361
if (Token::simpleMatch(tok, "alignas (")) {
9362+
Token* atok = nullptr;
9363+
if (Token::Match(tok->previous(), "%name%"))
9364+
atok = tok->previous();
9365+
else {
9366+
atok = tok;
9367+
while (isCPPAttribute(atok) || isAlignAttribute(atok))
9368+
atok = skipCPPOrAlignAttribute(atok)->next();
9369+
}
9370+
if (atok) {
9371+
std::string a;
9372+
for (const Token* t = tok->tokAt(2); t && t->str() != ")"; t = t->next())
9373+
a += " " + t->str();
9374+
if (a.size() > 1)
9375+
atok->addAttributeAlignas(a.substr(1));
9376+
}
93569377
// alignment requirements could be checked here
93579378
}
93589379
}

0 commit comments

Comments
 (0)