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 |
||
---|---|---|
.. | ||
AST | ||
ASTMatchers | ||
Analysis | ||
Basic | ||
CodeGen | ||
CrossTU | ||
DirectoryWatcher | ||
Driver | ||
Format | ||
Frontend | ||
Index | ||
Interpreter | ||
Introspection | ||
Lex | ||
Rename | ||
Rewrite | ||
Sema | ||
Serialization | ||
StaticAnalyzer | ||
Tooling | ||
libclang | ||
CMakeLists.txt |