================
@@ -525,3 +544,31 @@ void test() {
std::string_view svjkk1 = ReturnStringView(StrCat("bar", "x")); //
expected-warning {{object backing the pointer will be destroyed at the end of
the full-expression}}
}
} // namespace GH100549
+
+namespace GH100526 {
+void test() {
+ std::vector<std::string_view> v1({std::string()}); // expected-warning
{{object backing the pointer will be destroyed at the end}}
+ std::vector<std::string_view> v2({std::string(), std::string_view()}); //
expected-warning {{object backing the pointer will be destroyed at the end}}
+ std::vector<std::string_view> v3({std::string_view(), std::string()}); //
expected-warning {{object backing the pointer will be destroyed at the end}}
+
+ std::optional<std::string_view> o1 = std::string(); // expected-warning
{{object backing the pointer}}
+
+ std::string s;
+ // This is a tricky use-after-free case, what it does:
+ // 1. make_optional creates a temporary "optional<string>"" object
+ // 2. the temporary object owns the underlying string which is copied from
s.
+ // 3. the t3 object holds the view to the underlying string of the
temporary object.
+ std::optional<std::string_view> o2 = std::make_optional(s); //
expected-warning {{object backing the pointer}}
----------------
usx95 wrote:
IIUC this is catching the case when a `Container<Pointer>` is constructed from
temporary `Container<Owner>`
Can you also add a more intuitive case like `std::optional<std::string_view> o2
= std::optional<std::string>(s);`
https://github.com/llvm/llvm-project/pull/107213
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits