mboehme created this revision. Herald added subscribers: martong, xazax.hun. Herald added a reviewer: NoQ. Herald added a project: All. mboehme requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
I accidentally used `cast` instead of `cast_or_null`. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D153956 Files: clang/lib/Analysis/FlowSensitive/Transfer.cpp clang/unittests/Analysis/FlowSensitive/TransferTest.cpp Index: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp =================================================================== --- clang/unittests/Analysis/FlowSensitive/TransferTest.cpp +++ clang/unittests/Analysis/FlowSensitive/TransferTest.cpp @@ -2237,6 +2237,21 @@ }); } +TEST(TransferTest, CopyConstructorArgIsRefReturnedByFunction) { + // This is a crash repro. + std::string Code = R"( + struct S {}; + const S &returnsSRef(); + void target() { + S s(returnsSRef()); + } + )"; + runDataflow( + Code, + [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &Results, + ASTContext &ASTCtx) {}); +} + TEST(TransferTest, MoveConstructor) { std::string Code = R"( namespace std { Index: clang/lib/Analysis/FlowSensitive/Transfer.cpp =================================================================== --- clang/lib/Analysis/FlowSensitive/Transfer.cpp +++ clang/lib/Analysis/FlowSensitive/Transfer.cpp @@ -598,7 +598,7 @@ const Expr *Arg = S->getArg(0); assert(Arg != nullptr); - auto *ArgLoc = cast<AggregateStorageLocation>( + auto *ArgLoc = cast_or_null<AggregateStorageLocation>( Env.getStorageLocation(*Arg, SkipPast::Reference)); if (ArgLoc == nullptr) return;
Index: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp =================================================================== --- clang/unittests/Analysis/FlowSensitive/TransferTest.cpp +++ clang/unittests/Analysis/FlowSensitive/TransferTest.cpp @@ -2237,6 +2237,21 @@ }); } +TEST(TransferTest, CopyConstructorArgIsRefReturnedByFunction) { + // This is a crash repro. + std::string Code = R"( + struct S {}; + const S &returnsSRef(); + void target() { + S s(returnsSRef()); + } + )"; + runDataflow( + Code, + [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &Results, + ASTContext &ASTCtx) {}); +} + TEST(TransferTest, MoveConstructor) { std::string Code = R"( namespace std { Index: clang/lib/Analysis/FlowSensitive/Transfer.cpp =================================================================== --- clang/lib/Analysis/FlowSensitive/Transfer.cpp +++ clang/lib/Analysis/FlowSensitive/Transfer.cpp @@ -598,7 +598,7 @@ const Expr *Arg = S->getArg(0); assert(Arg != nullptr); - auto *ArgLoc = cast<AggregateStorageLocation>( + auto *ArgLoc = cast_or_null<AggregateStorageLocation>( Env.getStorageLocation(*Arg, SkipPast::Reference)); if (ArgLoc == nullptr) return;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits