Make LookupResult movable again.

We lost copy semantics in r263730, because it only worked for a few very
specific cases. Move semantics don't have this issue. Sadly the
implementation is a bit messy but I don't know how to clean it up
without losing support for msvc 2013 :/

llvm-svn: 263785
This commit is contained in:
Benjamin Kramer 2016-03-18 13:31:00 +00:00
parent 129fa9a048
commit d2f5bf7815
1 changed files with 38 additions and 0 deletions

View File

@ -190,6 +190,44 @@ public:
LookupResult(const LookupResult &) = delete;
LookupResult &operator=(const LookupResult &) = delete;
LookupResult(LookupResult &&Other)
: ResultKind(std::move(Other.ResultKind)),
Ambiguity(std::move(Other.Ambiguity)), Decls(std::move(Other.Decls)),
Paths(std::move(Other.Paths)),
NamingClass(std::move(Other.NamingClass)),
BaseObjectType(std::move(Other.BaseObjectType)),
SemaPtr(std::move(Other.SemaPtr)), NameInfo(std::move(Other.NameInfo)),
NameContextRange(std::move(Other.NameContextRange)),
LookupKind(std::move(Other.LookupKind)), IDNS(std::move(Other.IDNS)),
Redecl(std::move(Other.Redecl)), HideTags(std::move(Other.HideTags)),
Diagnose(std::move(Other.Diagnose)),
AllowHidden(std::move(Other.AllowHidden)),
Shadowed(std::move(Other.Shadowed)) {
Other.Paths = nullptr;
Other.Diagnose = false;
}
LookupResult &operator=(LookupResult &&Other) {
ResultKind = std::move(Other.ResultKind);
Ambiguity = std::move(Other.Ambiguity);
Decls = std::move(Other.Decls);
Paths = std::move(Other.Paths);
NamingClass = std::move(Other.NamingClass);
BaseObjectType = std::move(Other.BaseObjectType);
SemaPtr = std::move(Other.SemaPtr);
NameInfo = std::move(Other.NameInfo);
NameContextRange = std::move(Other.NameContextRange);
LookupKind = std::move(Other.LookupKind);
IDNS = std::move(Other.IDNS);
Redecl = std::move(Other.Redecl);
HideTags = std::move(Other.HideTags);
Diagnose = std::move(Other.Diagnose);
AllowHidden = std::move(Other.AllowHidden);
Shadowed = std::move(Other.Shadowed);
Other.Paths = nullptr;
Other.Diagnose = false;
return *this;
}
~LookupResult() {
if (Diagnose) diagnose();
if (Paths) deletePaths(Paths);