[LLVMbugs] [Bug 12131] New: Templated constructor not instanciated when copy constructor implicitly deleted

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Wed Feb 29 02:11:32 PST 2012


http://llvm.org/bugs/show_bug.cgi?id=12131

             Bug #: 12131
           Summary: Templated constructor not instanciated when copy
                    constructor implicitly deleted
           Product: clang
           Version: trunk
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++0x
        AssignedTo: unassignedclangbugs at nondot.org
        ReportedBy: antoinep92 at gmail.com
                CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
    Classification: Unclassified


Copying a shared_ptr from libstdc++ causes compilation error in clang++ trunk.
I reproduced the problem with a minimal code here:

// begin code

template<class T> struct C {
        T x;
        C() = default;
        C(const C<T>&& obj): x(obj.x) {}
        template<class U> C(const C<U>& obj): x(obj.x) {}
};

int main() {
        C<int> x;
        C<int> y(x);
        return 0;
}

// end code

This compiles ok on gcc and as is correct as far as I can tell, clang++
-std=c++0x gives the following diagnostic:
error: call to implicitly-deleted copy constructor of 'C<int>

-- Some thoughts:

The default copy constructor is not generated because of the declared move
constructor, but the templated const reference constructor should match. Clang
dosn't instanciate C<T>::C<T>.
I'm not familiar with clang's codebase, but maybe what happens is that
internally the copy constructor is declared and marked deleted, as opposed to
simply not present - thus preventing the template from being considered?

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list