This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG91ca3269a1b5: [clang-tidy] Aliasing: Add support for aggregates with references. (authored by dergachev.a).
Changed prior to commit: https://reviews.llvm.org/D101791?vs=342568&id=344197#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D101791/new/ https://reviews.llvm.org/D101791 Files: clang-tools-extra/clang-tidy/utils/Aliasing.cpp clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp Index: clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp +++ clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp @@ -566,3 +566,29 @@ } return 0; } + +struct AggregateWithReference { + int &y; +}; + +void test_structured_bindings_good() { + int x = 0; + AggregateWithReference ref { x }; + auto &[y] = ref; + for (; x < 10; ++y) { + // No warning. The loop is finite because 'y' is a reference to 'x'. + } +} + +struct AggregateWithValue { + int y; +}; + +void test_structured_bindings_bad() { + int x = 0; + AggregateWithValue val { x }; + auto &[y] = val; + for (; x < 10; ++y) { + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: this loop is infinite; none of its condition variables (x) are updated in the loop body [bugprone-infinite-loop] + } +} Index: clang-tools-extra/clang-tidy/utils/Aliasing.cpp =================================================================== --- clang-tools-extra/clang-tidy/utils/Aliasing.cpp +++ clang-tools-extra/clang-tidy/utils/Aliasing.cpp @@ -50,6 +50,13 @@ } else if (const auto *LE = dyn_cast<LambdaExpr>(S)) { // Treat lambda capture by reference as a form of taking a reference. return capturesByRef(LE->getLambdaClass(), Var); + } else if (const auto *ILE = dyn_cast<InitListExpr>(S)) { + return llvm::any_of(ILE->inits(), [Var](const Expr *ChildE) { + // If the child expression is a reference to Var, this means that it's + // used as an initializer of a reference-typed field. Otherwise + // it would have been surrounded with an implicit lvalue-to-rvalue cast. + return isAccessForVar(ChildE, Var); + }); } return false;
Index: clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp +++ clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp @@ -566,3 +566,29 @@ } return 0; } + +struct AggregateWithReference { + int &y; +}; + +void test_structured_bindings_good() { + int x = 0; + AggregateWithReference ref { x }; + auto &[y] = ref; + for (; x < 10; ++y) { + // No warning. The loop is finite because 'y' is a reference to 'x'. + } +} + +struct AggregateWithValue { + int y; +}; + +void test_structured_bindings_bad() { + int x = 0; + AggregateWithValue val { x }; + auto &[y] = val; + for (; x < 10; ++y) { + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: this loop is infinite; none of its condition variables (x) are updated in the loop body [bugprone-infinite-loop] + } +} Index: clang-tools-extra/clang-tidy/utils/Aliasing.cpp =================================================================== --- clang-tools-extra/clang-tidy/utils/Aliasing.cpp +++ clang-tools-extra/clang-tidy/utils/Aliasing.cpp @@ -50,6 +50,13 @@ } else if (const auto *LE = dyn_cast<LambdaExpr>(S)) { // Treat lambda capture by reference as a form of taking a reference. return capturesByRef(LE->getLambdaClass(), Var); + } else if (const auto *ILE = dyn_cast<InitListExpr>(S)) { + return llvm::any_of(ILE->inits(), [Var](const Expr *ChildE) { + // If the child expression is a reference to Var, this means that it's + // used as an initializer of a reference-typed field. Otherwise + // it would have been surrounded with an implicit lvalue-to-rvalue cast. + return isAccessForVar(ChildE, Var); + }); } return false;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits