diff --git a/clang/lib/Analysis/LifetimePsetBuilder.cpp b/clang/lib/Analysis/LifetimePsetBuilder.cpp index 4a0e242ca20b29..be1873606e211b 100644 --- a/clang/lib/Analysis/LifetimePsetBuilder.cpp +++ b/clang/lib/Analysis/LifetimePsetBuilder.cpp @@ -692,7 +692,8 @@ class PSetsBuilder : public ConstStmtVisitor { PSet ArgPS = derefPSet(getPSet(ObjExpr)); for (Variable V : ArgPS.vars()) invalidateVar( - V, 1, InvalidationReason::Modified(ObjExpr->getSourceRange())); + V, V.getOrder(), + InvalidationReason::Modified(ObjExpr->getSourceRange())); }); // Bind Pointer return value. diff --git a/clang/test/Sema/attr-psets.cpp b/clang/test/Sema/attr-psets.cpp index d305d1b3565495..7a0824287444bb 100644 --- a/clang/test/Sema/attr-psets.cpp +++ b/clang/test/Sema/attr-psets.cpp @@ -71,6 +71,12 @@ struct basic_string_view { using string_view = basic_string_view; +template +struct basic_string { + basic_string(const char*); + basic_string &operator +=(const basic_string& other); +}; + template struct remove_reference { typedef T type; }; template @@ -956,6 +962,13 @@ void cast(int *p) { __lifetime_pset(q); // expected-warning {{pset(q) = ((unknown))}} } +void doNotInvalidateReference(std::vector> v) { + std::basic_string &r = v[0]; + __lifetime_pset_ref(r); // expected-warning {{(*v)}} + r += "aa"; + __lifetime_pset_ref(r); // expected-warning {{(*v)}} +} + // Support CXXOperatorCallExpr on non-member function struct S3; void operator==(const S3 &A, const S3 &B) { A == B; }