This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG0086a3555ac6: [clang][dataflow] Fix bug in optional-checker's handling of nullopt constructor. (authored by ymandel).
Changed prior to commit: https://reviews.llvm.org/D140921?vs=486063&id=486076#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D140921/new/ https://reviews.llvm.org/D140921 Files: clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp Index: clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp =================================================================== --- clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp +++ clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp @@ -1498,6 +1498,23 @@ )"); } +TEST_P(UncheckedOptionalAccessTest, NulloptConstructorWithSugaredType) { + ExpectDiagnosticsFor( + R"( + #include "unchecked_optional_access_test.h" + template <typename T> + using wrapper = T; + + template <typename T> + wrapper<T> wrap(T); + + void target() { + $ns::$optional<int> opt(wrap($ns::nullopt)); + opt.value(); // [[unsafe]] + } + )"); +} + TEST_P(UncheckedOptionalAccessTest, InPlaceConstructor) { ExpectDiagnosticsFor(R"( #include "unchecked_optional_access_test.h" Index: clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp =================================================================== --- clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp +++ clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp @@ -22,6 +22,7 @@ #include "clang/Analysis/FlowSensitive/CFGMatchSwitch.h" #include "clang/Analysis/FlowSensitive/DataflowEnvironment.h" #include "clang/Analysis/FlowSensitive/NoopLattice.h" +#include "clang/Analysis/FlowSensitive/StorageLocation.h" #include "clang/Analysis/FlowSensitive/Value.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/StringRef.h" @@ -100,8 +101,10 @@ } auto isOptionalNulloptConstructor() { - return cxxConstructExpr(hasOptionalType(), argumentCountIs(1), - hasArgument(0, hasNulloptType())); + return cxxConstructExpr( + hasOptionalType(), + hasDeclaration(cxxConstructorDecl(parameterCountIs(1), + hasParameter(0, hasNulloptType())))); } auto isOptionalInPlaceConstructor() { @@ -452,6 +455,7 @@ BoolValue &valueOrConversionHasValue(const FunctionDecl &F, const Expr &E, const MatchFinder::MatchResult &MatchRes, LatticeTransferState &State) { + assert(F.getTemplateSpecializationArgs() != nullptr); assert(F.getTemplateSpecializationArgs()->size() > 0); const int TemplateParamOptionalWrappersCount = countOptionalWrappers(
Index: clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp =================================================================== --- clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp +++ clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp @@ -1498,6 +1498,23 @@ )"); } +TEST_P(UncheckedOptionalAccessTest, NulloptConstructorWithSugaredType) { + ExpectDiagnosticsFor( + R"( + #include "unchecked_optional_access_test.h" + template <typename T> + using wrapper = T; + + template <typename T> + wrapper<T> wrap(T); + + void target() { + $ns::$optional<int> opt(wrap($ns::nullopt)); + opt.value(); // [[unsafe]] + } + )"); +} + TEST_P(UncheckedOptionalAccessTest, InPlaceConstructor) { ExpectDiagnosticsFor(R"( #include "unchecked_optional_access_test.h" Index: clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp =================================================================== --- clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp +++ clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp @@ -22,6 +22,7 @@ #include "clang/Analysis/FlowSensitive/CFGMatchSwitch.h" #include "clang/Analysis/FlowSensitive/DataflowEnvironment.h" #include "clang/Analysis/FlowSensitive/NoopLattice.h" +#include "clang/Analysis/FlowSensitive/StorageLocation.h" #include "clang/Analysis/FlowSensitive/Value.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/StringRef.h" @@ -100,8 +101,10 @@ } auto isOptionalNulloptConstructor() { - return cxxConstructExpr(hasOptionalType(), argumentCountIs(1), - hasArgument(0, hasNulloptType())); + return cxxConstructExpr( + hasOptionalType(), + hasDeclaration(cxxConstructorDecl(parameterCountIs(1), + hasParameter(0, hasNulloptType())))); } auto isOptionalInPlaceConstructor() { @@ -452,6 +455,7 @@ BoolValue &valueOrConversionHasValue(const FunctionDecl &F, const Expr &E, const MatchFinder::MatchResult &MatchRes, LatticeTransferState &State) { + assert(F.getTemplateSpecializationArgs() != nullptr); assert(F.getTemplateSpecializationArgs()->size() > 0); const int TemplateParamOptionalWrappersCount = countOptionalWrappers(
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits