mirror of
https://github.com/intel/llvm.git
synced 2026-01-20 19:07:53 +08:00
Fix a false positive warning when initializing members with gsl::Owners.
llvm-svn: 368501
This commit is contained in:
@@ -7217,6 +7217,11 @@ void Sema::checkInitializerLifetime(const InitializedEntity &Entity,
|
||||
if (pathContainsInit(Path))
|
||||
return false;
|
||||
|
||||
// Suppress false positives for code like the below:
|
||||
// Ctor(unique_ptr<T> up) : member(*up), member2(move(up)) {}
|
||||
if (IsLocalGslOwner && pathOnlyInitializesGslPointer(Path))
|
||||
return false;
|
||||
|
||||
auto *DRE = dyn_cast<DeclRefExpr>(L);
|
||||
auto *VD = DRE ? dyn_cast<VarDecl>(DRE->getDecl()) : nullptr;
|
||||
if (!VD) {
|
||||
|
||||
@@ -120,6 +120,13 @@ void initLocalGslPtrWithTempOwner() {
|
||||
}
|
||||
|
||||
namespace std {
|
||||
template<class T> struct remove_reference { typedef T type; };
|
||||
template<class T> struct remove_reference<T &> { typedef T type; };
|
||||
template<class T> struct remove_reference<T &&> { typedef T type; };
|
||||
|
||||
template<class T>
|
||||
typename remove_reference<T>::type &&move(T &&t) noexcept;
|
||||
|
||||
template <typename T>
|
||||
struct basic_iterator {
|
||||
basic_iterator operator++();
|
||||
@@ -153,6 +160,7 @@ struct basic_string {
|
||||
|
||||
template<typename T>
|
||||
struct unique_ptr {
|
||||
T &operator*();
|
||||
T *get() const;
|
||||
};
|
||||
|
||||
@@ -217,3 +225,10 @@ int &doNotFollowReferencesForLocalOwner() {
|
||||
const char *trackThroughMultiplePointer() {
|
||||
return std::basic_string_view<char>(std::basic_string<char>()).begin(); // expected-warning {{returning address of local temporary object}}
|
||||
}
|
||||
|
||||
struct X {
|
||||
X(std::unique_ptr<int> up) : pointee(*up), pointer(std::move(up)) {}
|
||||
|
||||
int &pointee;
|
||||
std::unique_ptr<int> pointer;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user