r263785 - Make LookupResult movable again.

Benjamin Kramer via cfe-commits cfe-commits at lists.llvm.org
Fri Mar 18 09:15:19 PDT 2016


On Fri, Mar 18, 2016 at 5:10 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
> On Fri, Mar 18, 2016 at 6:31 AM, Benjamin Kramer via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>>
>> Author: d0k
>> Date: Fri Mar 18 08:31:00 2016
>> New Revision: 263785
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=263785&view=rev
>> Log:
>> Make LookupResult movable again.
>
>
> This shouldn't've been movable at all due to the presence of a user-declared
> dtor, right?
>
> Any code that was trying to move was really getting a broken copy, I think.

Yes. This just happened to work if the lookup result didn't contain
any base paths and didn't have the diagnostics flag set.

>>
>>
>> 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 :/
>>
>>
>> Modified:
>>     cfe/trunk/include/clang/Sema/Lookup.h
>>
>> Modified: cfe/trunk/include/clang/Sema/Lookup.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Lookup.h?rev=263785&r1=263784&r2=263785&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Sema/Lookup.h (original)
>> +++ cfe/trunk/include/clang/Sema/Lookup.h Fri Mar 18 08:31:00 2016
>> @@ -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);
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>


More information about the cfe-commits mailing list