<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Oct 26, 2014 at 1:47 PM, Hans Wennborg <span dir="ltr"><<a href="mailto:hans@chromium.org" target="_blank">hans@chromium.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Sun, Oct 26, 2014 at 1:44 PM, Lang Hames <<a href="mailto:lhames@gmail.com">lhames@gmail.com</a>> wrote:<br>
> Oh:<br>
><br>
> This diagnostic occurred in the compiler generated function<br>
> 'llvm::PBQP::RegAlloc::NodeMetadata::NodeMetadata(const<br>
> llvm::PBQP::RegAlloc::NodeMetadata &)'<br>
><br>
> That explains that, though it's less clear why VC thinks a copy constructor<br>
> is needed.<br>
><br>
> Will have a fix shortly.<br>
<br>
</span>Thanks! I think we've run into similar problems before where some<br>
object gets moved but VC is synthesizing a copy constructor instead,<br>
and fails to copy the unique_ptr member.<br></blockquote><div><br></div><div>Yep - MSVC doesn't synthesize move operations, so if you don't provide one explicityl, it'll try to synthesize/use a copy operation instead. Then sadness.<br><br>You, unfortunately, just have to write out the move operations explicitly to help MSVC along.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5"><br>
<br>
> On Sun, Oct 26, 2014 at 1:36 PM, Lang Hames <<a href="mailto:lhames@gmail.com">lhames@gmail.com</a>> wrote:<br>
>><br>
>> That's odd. It's just a unique_ptr to an array - that should be supported.<br>
>> I'm going to try #including memory directly and recommit.<br>
>><br>
>> - Lang.<br>
>><br>
>> On Sun, Oct 26, 2014 at 12:50 PM, Hans Wennborg <<a href="mailto:hans@hanshq.net">hans@hanshq.net</a>> wrote:<br>
>>><br>
>>> Author: hans<br>
>>> Date: Sun Oct 26 14:50:13 2014<br>
>>> New Revision: 220645<br>
>>><br>
>>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=220645&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=220645&view=rev</a><br>
>>> Log:<br>
>>> Revert "[PBQP] Unique-ptrify some PBQP Metadata structures. No functional<br>
>>> change." (r220642)<br>
>>><br>
>>> It broke the Windows build:<br>
>>><br>
>>>   [1/19] Building CXX object<br>
>>> lib\CodeGen\CMakeFiles\LLVMCodeGen.dir\RegAllocPBQP.cpp.obj<br>
>>><br>
>>> C:\bb-win7\ninja-clang-i686-msc17-R\llvm-project\llvm\include\llvm/CodeGen/RegAllocPBQP.h(132)<br>
>>> : error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private<br>
>>> member declared in class 'std::unique_ptr<_Ty>'<br>
>>><br>
>>>      with<br>
>>>      [<br>
>>>          _Ty=unsigned int []<br>
>>>      ]<br>
>>>      D:\Program Files (x86)\Microsoft Visual Studio<br>
>>> 11.0\VC\include\memory(1600) : see declaration of<br>
>>> 'std::unique_ptr<_Ty>::unique_ptr'<br>
>>>      with<br>
>>>      [<br>
>>>          _Ty=unsigned int []<br>
>>>      ]<br>
>>>      This diagnostic occurred in the compiler generated function<br>
>>> 'llvm::PBQP::RegAlloc::NodeMetadata::NodeMetadata(const<br>
>>> llvm::PBQP::RegAlloc::NodeMetadata &)'<br>
>>><br>
>>> Modified:<br>
>>>     llvm/trunk/include/llvm/CodeGen/RegAllocPBQP.h<br>
>>><br>
>>> Modified: llvm/trunk/include/llvm/CodeGen/RegAllocPBQP.h<br>
>>> URL:<br>
>>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/RegAllocPBQP.h?rev=220645&r1=220644&r2=220645&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/RegAllocPBQP.h?rev=220645&r1=220644&r2=220645&view=diff</a><br>
>>><br>
>>> ==============================================================================<br>
>>> --- llvm/trunk/include/llvm/CodeGen/RegAllocPBQP.h (original)<br>
>>> +++ llvm/trunk/include/llvm/CodeGen/RegAllocPBQP.h Sun Oct 26 14:50:13<br>
>>> 2014<br>
>>> @@ -62,15 +62,20 @@ public:<br>
>>>      delete[] ColCounts;<br>
>>>    }<br>
>>><br>
>>> +  ~MatrixMetadata() {<br>
>>> +    delete[] UnsafeRows;<br>
>>> +    delete[] UnsafeCols;<br>
>>> +  }<br>
>>> +<br>
>>>    unsigned getWorstRow() const { return WorstRow; }<br>
>>>    unsigned getWorstCol() const { return WorstCol; }<br>
>>> -  const bool* getUnsafeRows() const { return UnsafeRows.get(); }<br>
>>> -  const bool* getUnsafeCols() const { return UnsafeCols.get(); }<br>
>>> +  const bool* getUnsafeRows() const { return UnsafeRows; }<br>
>>> +  const bool* getUnsafeCols() const { return UnsafeCols; }<br>
>>><br>
>>>  private:<br>
>>>    unsigned WorstRow, WorstCol;<br>
>>> -  std::unique_ptr<bool[]> UnsafeRows;<br>
>>> -  std::unique_ptr<bool[]> UnsafeCols;<br>
>>> +  bool* UnsafeRows;<br>
>>> +  bool* UnsafeCols;<br>
>>>  };<br>
>>><br>
>>>  class NodeMetadata {<br>
>>> @@ -83,6 +88,7 @@ public:<br>
>>>                   NotProvablyAllocatable } ReductionState;<br>
>>><br>
>>>    NodeMetadata() : RS(Unprocessed), DeniedOpts(0),<br>
>>> OptUnsafeEdges(nullptr){}<br>
>>> +  ~NodeMetadata() { delete[] OptUnsafeEdges; }<br>
>>><br>
>>>    void setVReg(unsigned VReg) { this->VReg = VReg; }<br>
>>>    unsigned getVReg() const { return VReg; }<br>
>>> @@ -94,7 +100,7 @@ public:<br>
>>><br>
>>>    void setup(const Vector& Costs) {<br>
>>>      NumOpts = Costs.getLength() - 1;<br>
>>> -    OptUnsafeEdges = std::unique_ptr<unsigned[]>(new<br>
>>> unsigned[NumOpts]());<br>
>>> +    OptUnsafeEdges = new unsigned[NumOpts]();<br>
>>>    }<br>
>>><br>
>>>    ReductionState getReductionState() const { return RS; }<br>
>>> @@ -118,15 +124,15 @@ public:<br>
>>><br>
>>>    bool isConservativelyAllocatable() const {<br>
>>>      return (DeniedOpts < NumOpts) ||<br>
>>> -      (std::find(&OptUnsafeEdges[0], &OptUnsafeEdges[NumOpts], 0) !=<br>
>>> -       &OptUnsafeEdges[NumOpts]);<br>
>>> +      (std::find(OptUnsafeEdges, OptUnsafeEdges + NumOpts, 0) !=<br>
>>> +       OptUnsafeEdges + NumOpts);<br>
>>>    }<br>
>>><br>
>>>  private:<br>
>>>    ReductionState RS;<br>
>>>    unsigned NumOpts;<br>
>>>    unsigned DeniedOpts;<br>
>>> -  std::unique_ptr<unsigned[]> OptUnsafeEdges;<br>
>>> +  unsigned* OptUnsafeEdges;<br>
>>>    unsigned VReg;<br>
>>>    OptionToRegMap OptionRegs;<br>
>>>  };<br>
>>><br>
>>><br>
>>> _______________________________________________<br>
>>> llvm-commits mailing list<br>
>>> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
>>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
>><br>
>><br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
><br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div></div>