mgehre created this revision. mgehre added a reviewer: gribozavr. Herald added a project: clang.
Diagnose dangling pointers that come from std::stack::top() and std::optional::value(). Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D66164 Files: clang/lib/Sema/SemaInit.cpp clang/test/Sema/warn-lifetime-analysis-nocfg.cpp Index: clang/test/Sema/warn-lifetime-analysis-nocfg.cpp =================================================================== --- clang/test/Sema/warn-lifetime-analysis-nocfg.cpp +++ clang/test/Sema/warn-lifetime-analysis-nocfg.cpp @@ -169,6 +169,12 @@ optional(); optional(const T&); T &operator*(); + T &value(); +}; + +template <typename T> +struct stack { + T &top(); }; } @@ -204,6 +210,8 @@ int &r = *std::optional<int>(); // expected-warning {{object backing the pointer will be destroyed at the end of the full-expression}} int &r2 = *std::optional<int>(5); // expected-warning {{object backing the pointer will be destroyed at the end of the full-expression}} int &r3 = std::vector<int>().at(3); // expected-warning {{object backing the pointer will be destroyed at the end of the full-expression}} + int &r4 = std::optional<int>(5).value(); // expected-warning {{object backing the pointer will be destroyed at the end of the full-expression}} + int &r5 = std::stack<int>().top(); // expected-warning {{object backing the pointer will be destroyed at the end of the full-expression}} } std::vector<int> getTempVec(); Index: clang/lib/Sema/SemaInit.cpp =================================================================== --- clang/lib/Sema/SemaInit.cpp +++ clang/lib/Sema/SemaInit.cpp @@ -6580,7 +6580,7 @@ return llvm::StringSwitch<bool>(Callee->getName()) .Cases("begin", "rbegin", "cbegin", "crbegin", true) .Cases("end", "rend", "cend", "crend", true) - .Cases("c_str", "data", "get", true) + .Cases("c_str", "data", "get", "value", true) // Map and set types. .Cases("find", "equal_range", "lower_bound", "upper_bound", true) .Default(false); @@ -6591,7 +6591,7 @@ OO == OverloadedOperatorKind::OO_Star; } return llvm::StringSwitch<bool>(Callee->getName()) - .Cases("front", "back", "at", true) + .Cases("front", "back", "at", "top", true) .Default(false); } return false;
Index: clang/test/Sema/warn-lifetime-analysis-nocfg.cpp =================================================================== --- clang/test/Sema/warn-lifetime-analysis-nocfg.cpp +++ clang/test/Sema/warn-lifetime-analysis-nocfg.cpp @@ -169,6 +169,12 @@ optional(); optional(const T&); T &operator*(); + T &value(); +}; + +template <typename T> +struct stack { + T &top(); }; } @@ -204,6 +210,8 @@ int &r = *std::optional<int>(); // expected-warning {{object backing the pointer will be destroyed at the end of the full-expression}} int &r2 = *std::optional<int>(5); // expected-warning {{object backing the pointer will be destroyed at the end of the full-expression}} int &r3 = std::vector<int>().at(3); // expected-warning {{object backing the pointer will be destroyed at the end of the full-expression}} + int &r4 = std::optional<int>(5).value(); // expected-warning {{object backing the pointer will be destroyed at the end of the full-expression}} + int &r5 = std::stack<int>().top(); // expected-warning {{object backing the pointer will be destroyed at the end of the full-expression}} } std::vector<int> getTempVec(); Index: clang/lib/Sema/SemaInit.cpp =================================================================== --- clang/lib/Sema/SemaInit.cpp +++ clang/lib/Sema/SemaInit.cpp @@ -6580,7 +6580,7 @@ return llvm::StringSwitch<bool>(Callee->getName()) .Cases("begin", "rbegin", "cbegin", "crbegin", true) .Cases("end", "rend", "cend", "crend", true) - .Cases("c_str", "data", "get", true) + .Cases("c_str", "data", "get", "value", true) // Map and set types. .Cases("find", "equal_range", "lower_bound", "upper_bound", true) .Default(false); @@ -6591,7 +6591,7 @@ OO == OverloadedOperatorKind::OO_Star; } return llvm::StringSwitch<bool>(Callee->getName()) - .Cases("front", "back", "at", true) + .Cases("front", "back", "at", "top", true) .Default(false); } return false;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits