gridaphobe updated this revision to Diff 307348. gridaphobe added a comment.
Add a couple passing tests involving typedefs. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D91975/new/ https://reviews.llvm.org/D91975 Files: clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-narrowing-conversions.cpp Index: clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-narrowing-conversions.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-narrowing-conversions.cpp +++ clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-narrowing-conversions.cpp @@ -343,4 +343,17 @@ DERP(i, .5l); } +// We understand typedefs. +void typedef_context() { + typedef long long myint64_t; + int i; + myint64_t i64; + + i64 = i64; // Okay, no conversion. + i64 = i; // Okay, no narrowing. + + i = i64; + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: narrowing conversion from 'myint64_t' (aka 'long long') to signed type 'int' is implementation-defined [cppcoreguidelines-narrowing-conversions] +} + } // namespace floats Index: clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp +++ clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp @@ -48,8 +48,10 @@ Finder->addMatcher( traverse( ast_type_traits::TK_AsIs, - implicitCastExpr(hasImplicitDestinationType(builtinType()), - hasSourceExpression(hasType(builtinType())), + implicitCastExpr(hasImplicitDestinationType( + hasUnqualifiedDesugaredType(builtinType())), + hasSourceExpression(hasType( + hasUnqualifiedDesugaredType(builtinType()))), unless(hasSourceExpression(IsCeilFloorCallExpr)), unless(hasParent(castExpr())), unless(isInTemplateInstantiation())) @@ -58,16 +60,18 @@ // Binary operators: // i += 0.5; - Finder->addMatcher(binaryOperator(isAssignmentOperator(), - hasLHS(expr(hasType(builtinType()))), - hasRHS(expr(hasType(builtinType()))), - unless(hasRHS(IsCeilFloorCallExpr)), - unless(isInTemplateInstantiation()), - // The `=` case generates an implicit cast - // which is covered by the previous matcher. - unless(hasOperatorName("="))) - .bind("binary_op"), - this); + Finder->addMatcher( + binaryOperator( + isAssignmentOperator(), + hasLHS(expr(hasType(hasUnqualifiedDesugaredType(builtinType())))), + hasRHS(expr(hasType(hasUnqualifiedDesugaredType(builtinType())))), + unless(hasRHS(IsCeilFloorCallExpr)), + unless(isInTemplateInstantiation()), + // The `=` case generates an implicit cast + // which is covered by the previous matcher. + unless(hasOperatorName("="))) + .bind("binary_op"), + this); } static const BuiltinType *getBuiltinType(const Expr &E) {
Index: clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-narrowing-conversions.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-narrowing-conversions.cpp +++ clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-narrowing-conversions.cpp @@ -343,4 +343,17 @@ DERP(i, .5l); } +// We understand typedefs. +void typedef_context() { + typedef long long myint64_t; + int i; + myint64_t i64; + + i64 = i64; // Okay, no conversion. + i64 = i; // Okay, no narrowing. + + i = i64; + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: narrowing conversion from 'myint64_t' (aka 'long long') to signed type 'int' is implementation-defined [cppcoreguidelines-narrowing-conversions] +} + } // namespace floats Index: clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp +++ clang-tools-extra/clang-tidy/cppcoreguidelines/NarrowingConversionsCheck.cpp @@ -48,8 +48,10 @@ Finder->addMatcher( traverse( ast_type_traits::TK_AsIs, - implicitCastExpr(hasImplicitDestinationType(builtinType()), - hasSourceExpression(hasType(builtinType())), + implicitCastExpr(hasImplicitDestinationType( + hasUnqualifiedDesugaredType(builtinType())), + hasSourceExpression(hasType( + hasUnqualifiedDesugaredType(builtinType()))), unless(hasSourceExpression(IsCeilFloorCallExpr)), unless(hasParent(castExpr())), unless(isInTemplateInstantiation())) @@ -58,16 +60,18 @@ // Binary operators: // i += 0.5; - Finder->addMatcher(binaryOperator(isAssignmentOperator(), - hasLHS(expr(hasType(builtinType()))), - hasRHS(expr(hasType(builtinType()))), - unless(hasRHS(IsCeilFloorCallExpr)), - unless(isInTemplateInstantiation()), - // The `=` case generates an implicit cast - // which is covered by the previous matcher. - unless(hasOperatorName("="))) - .bind("binary_op"), - this); + Finder->addMatcher( + binaryOperator( + isAssignmentOperator(), + hasLHS(expr(hasType(hasUnqualifiedDesugaredType(builtinType())))), + hasRHS(expr(hasType(hasUnqualifiedDesugaredType(builtinType())))), + unless(hasRHS(IsCeilFloorCallExpr)), + unless(isInTemplateInstantiation()), + // The `=` case generates an implicit cast + // which is covered by the previous matcher. + unless(hasOperatorName("="))) + .bind("binary_op"), + this); } static const BuiltinType *getBuiltinType(const Expr &E) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits