Skip to content

Commit

Permalink
Fixed google-readability-casting test to work in c++17
Browse files Browse the repository at this point in the history
Summary: Fixed google-readability-casting.cpp to get tests working in c++17

Reviewers: gribozavr, hokein

Reviewed By: gribozavr

Subscribers: cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D63128

Patch by Shaurya Gupta.

llvm-svn: 363047
  • Loading branch information
gribozavr committed Jun 11, 2019
1 parent 1a0f7a2 commit be20daa
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 8 deletions.
22 changes: 15 additions & 7 deletions clang-tools-extra/clang-tidy/google/AvoidCStyleCastsCheck.cpp
Expand Up @@ -86,6 +86,10 @@ void AvoidCStyleCastsCheck::check(const MatchFinder::MatchResult &Result) {
bool FnToFnCast =
isFunction(SourceTypeAsWritten) && isFunction(DestTypeAsWritten);

const bool ConstructorCast = !CastExpr->getTypeAsWritten().hasQualifiers() &&
DestTypeAsWritten->isRecordType() &&
!DestTypeAsWritten->isElaboratedTypeSpecifier();

if (CastExpr->getCastKind() == CK_NoOp && !FnToFnCast) {
// Function pointer/reference casts may be needed to resolve ambiguities in
// case of overloaded functions, so detection of redundant casts is trickier
Expand Down Expand Up @@ -144,19 +148,19 @@ void AvoidCStyleCastsCheck::check(const MatchFinder::MatchResult &Result) {
Diag << CastType;
ReplaceWithCast((CastType + "<" + DestTypeString + ">").str());
};

auto ReplaceWithConstructorCall = [&]() {
Diag << "constructor call syntax";
// FIXME: Validate DestTypeString, maybe.
ReplaceWithCast(DestTypeString.str());
};
// Suggest appropriate C++ cast. See [expr.cast] for cast notation semantics.
switch (CastExpr->getCastKind()) {
case CK_FunctionToPointerDecay:
ReplaceWithNamedCast("static_cast");
return;
case CK_ConstructorConversion:
if (!CastExpr->getTypeAsWritten().hasQualifiers() &&
DestTypeAsWritten->isRecordType() &&
!DestTypeAsWritten->isElaboratedTypeSpecifier()) {
Diag << "constructor call syntax";
// FIXME: Validate DestTypeString, maybe.
ReplaceWithCast(DestTypeString.str());
if (ConstructorCast) {
ReplaceWithConstructorCall();
} else {
ReplaceWithNamedCast("static_cast");
}
Expand All @@ -176,6 +180,10 @@ void AvoidCStyleCastsCheck::check(const MatchFinder::MatchResult &Result) {
ReplaceWithNamedCast("const_cast");
return;
}
if (ConstructorCast) {
ReplaceWithConstructorCall();
return;
}
if (DestType->isReferenceType()) {
QualType Dest = DestType.getNonReferenceType();
QualType Source = SourceType.getNonReferenceType();
Expand Down
@@ -1,4 +1,4 @@
// RUN: %check_clang_tidy -std=c++11,c++14 %s google-readability-casting %t
// RUN: %check_clang_tidy -std=c++11-or-later %s google-readability-casting %t
// FIXME: Fix the checker to work in C++17 mode.

bool g() { return false; }
Expand Down

0 comments on commit be20daa

Please sign in to comment.