Skip to content

Commit acfbb0f

Browse files
committed
Fix bsl-non-safe-integral-types-are-forbidden
Non-safe integral types are forbidden except when declared within a struct. The current check is done on the direct parent of a declaration being a struct which is missing the case of when a struct is further up the ancestry. For example, non-safe integral field declared within a union or any nested unions, all descendants of a struct would cause the following warning (treated as an error here) to trigger: ``` error: integral types like int, std::int32_t and bsl::int32 are forbidden. Use bsl::safe_integral instead of 'bsl::uint64' [bsl-non-safe-integral-types-are-forbidden,-warnings-as-errors] bsl::uint64 reg0; ^ ```
1 parent 1b019f9 commit acfbb0f

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed

clang-tools-extra/clang-tidy/bsl/NonSafeIntegralTypesAreForbiddenCheck.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,16 @@ void NonSafeIntegralTypesAreForbiddenCheck::check_field_decl(const MatchFinder::
134134
if (Record->isStruct())
135135
return;
136136

137+
auto const *DC = Record->getParent();
138+
while (!isa<TranslationUnitDecl>(Decl::castFromDeclContext(DC))) {
139+
if (const auto *Rec = dyn_cast<RecordDecl>(DC)) {
140+
if (Rec->isStruct()) {
141+
return;
142+
}
143+
}
144+
DC = DC->getParent();
145+
}
146+
137147
auto const QT = FD->getType().getNonReferenceType().getCanonicalType().getUnqualifiedType();
138148
if (!QT->isIntegerType())
139149
return;

0 commit comments

Comments
 (0)