================ @@ -793,3 +794,44 @@ void test13() { } } // namespace GH100526 + +namespace LifetimeboundInterleave { + +const std::string& Ref(const std::string& abc [[clang::lifetimebound]]); +std::string_view test1() { + std::string_view t1 = Ref(std::string()); // expected-warning {{object backing}} + t1 = Ref(std::string()); // expected-warning {{object backing}} + return Ref(std::string()); // expected-warning {{returning address}} +} + +template <typename T> +struct Foo { + const T& get() const [[clang::lifetimebound]]; + const T& getNoLB() const; +}; +std::string_view test2(Foo<std::string> r1, Foo<std::string_view> r2) { + std::string_view t1 = Foo<std::string>().get(); // expected-warning {{object backing}} + t1 = Foo<std::string>().get(); // expected-warning {{object backing}} + return r1.get(); // expected-warning {{address of stack}} + + std::string_view t2 = Foo<std::string_view>().get(); + t2 = Foo<std::string_view>().get(); + return r2.get(); + + // no warning on no-LB-annotated method. + std::string_view t3 = Foo<std::string>().getNoLB(); + t3 = Foo<std::string>().getNoLB(); + return r1.getNoLB(); +} + +struct Bar {}; +struct [[gsl::Pointer]] Pointer { + Pointer(const Bar & bar [[clang::lifetimebound]]); +}; +Pointer test3(Bar bar) { + Pointer p = Pointer(Bar()); // expected-warning {{temporary}} + p = Pointer(Bar()); // expected-warning {{object backing}} ---------------- hokein wrote:
This was a false negative before, this patch also fixes it. https://github.com/llvm/llvm-project/pull/114044 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits