forked from OSchip/llvm-project
cd0d52610d
Currently the unchecked-optional-access model fails on this example: #include <memory> #include <optional> void foo() { std::unique_ptr<std::optional<float>> x; *x = std::nullopt; } You can verify the failure by saving the file as `foo.cpp` and running this command: clang-tidy -checks='-*,bugprone-unchecked-optional-access' foo.cpp -- -std=c++17 The failing `assert` is in the `transferAssignment` function of the `UncheckedOptionalAccessModel.cpp` file: assert(OptionalLoc != nullptr); The symptom can be treated by replacing that `assert` with an early `return`: if (OptionalLoc == nullptr) return; That would be better anyway since we cannot expect to always cover all possible LHS expressions, but it is out of scope for this patch and left as a followup. Note that the failure did not occur on this very similar example: #include <optional> template <typename T> struct smart_ptr { T& operator*() &; T* operator->(); }; void foo() { smart_ptr<std::optional<float>> x; *x = std::nullopt; } The difference is caused by the `isCallReturningOptional` matcher, which was previously checking the `functionDecl` of the `callee`. This patch changes it to instead use `hasType` directly on the call expression, fixing the failure for the `std::unique_ptr` example above. Reviewed By: sgatev Differential Revision: https://reviews.llvm.org/D127434 |
||
---|---|---|
.. | ||
FlowSensitive | ||
CFGBuildResult.h | ||
CFGDominatorTree.cpp | ||
CFGTest.cpp | ||
CMakeLists.txt | ||
CloneDetectionTest.cpp | ||
ExprMutationAnalyzerTest.cpp | ||
MacroExpansionContextTest.cpp |