[llvm-bugs] [Bug 32191] New: clang not exporting inline move constructor and assignment operator

via llvm-bugs llvm-bugs at lists.llvm.org
Wed Mar 8 23:36:51 PST 2017


https://bugs.llvm.org/show_bug.cgi?id=32191

            Bug ID: 32191
           Summary: clang not exporting inline move constructor and
                    assignment operator
           Product: clang
           Version: trunk
          Hardware: PC
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: C++
          Assignee: unassignedclangbugs at nondot.org
          Reporter: smeenai at fb.com
                CC: dgregor at apple.com, llvm-bugs at lists.llvm.org

% cat reduced.cpp
struct __declspec(dllexport) s {
  s(s &&other) {}
  s &operator=(s &&rhs) { return *this; }
};

% clang++ -target i686-windows -std=c++11 -c reduced.cpp
% llvm-readobj -coff-directives reduced.o

File: reduced.o
Format: COFF-i386
Arch: i386
AddressSize: 32bit

To contrast with cl

% cl /c reduced.cpp
% dumpbin /directives reduced.obj
--snip--
   -----------------
   /EXPORT:??0s@@QAE@$$QAU0@@Z
   /EXPORT:??4s@@QAEAAU0@$$QAU0@@Z

There are two (probably related) issues here. The __declspec(dllexport) should
force an out-of-line copy of all inline members to be emitted, and this copy
should be marked dllexport. Neither of those is occurring here.

Interestingly, moving the definitions out of line behaves correctly, even if
the out-of-line definitions are marked inline.

This seems to be specific to the move constructor and assignment operator. The
copy constructor and assignment operator behave as expected (i.e. definitions
in the class body get exported).

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20170309/9915f135/attachment.html>


More information about the llvm-bugs mailing list