[cfe-dev] Interesting clang behavior/bug? on Windows
Edward Diener
eldlistmailingz at tropicsoft.com
Fri Feb 13 20:43:50 PST 2015
On 2/13/2015 11:17 PM, Nico Weber wrote:
> Hans would know for sure, but I think this is intentional: Since AClass
> is dllexported, all its implicit functions get generated (so that they
> can be exported from the dll), which means they need to be semantically
> checked. If you give the class a deleted copy constructor and assignment
> operator, it might work.
Where in the C++ standard is such behavior justified ?
The C++ standard does tell us I believe that if an object of a class is
not copied there is never a need to specify a copy constructor and if a
class is not assigned there is never a need to specify an assignment
operator, whether or not one has a non-copyable or non-assignable member
or not. Changing that basic rule to support something in clang related
to "exported' classes cannot be correct IMO.
Why does '__attribute__((__visibility__("default")))' work but
'__attribute__((dllexport))' does not ? Aren't they both the equivalent
of "exporting" a class in clang ?
I realize that for clang on Windows targeting mingw/gcc and not VC++
that the correct "export" attribute is probably
'__attribute__((__visibility__("default")))' and not
'__attribute__((dllexport))'. But I heavily object to the idea that
because I might be exporting a class the rules of copyability or
assignability for that class must change contrary to the C++ standard.
This also puts an extra conceptual burden on the design of a class.
>
> On Fri, Feb 13, 2015 at 8:07 PM, Edward Diener
> <eldlistmailingz at tropicsoft.com
> <mailto:eldlistmailingz at tropicsoft.com>> wrote:
>
> I am compiling code with "-c -x c++ -O0 -g -fno-inline -Wall -g"
> using clang targeting mingw/gcc on Windows.
>
> This code compiles with no errors ( boost::scoped_ptr<T> is
> non-copyable, non-assignable ):
>
> #include <boost/scoped_ptr.hpp>
> class
> AClass { boost::scoped_ptr<int> sp_pointer; };
> int main() { return 0; }
>
> This code compiles with no errors:
>
> #include <boost/scoped_ptr.hpp>
> class __attribute__((__visibility__(__"default")))
> AClass { boost::scoped_ptr<int> sp_pointer; };
> int main() { return 0; }
>
> but this code compiles with errors:
>
> #include <boost/scoped_ptr.hpp>
> class __attribute__((dllexport))
> AClass { boost::scoped_ptr<int> sp_pointer; };
> int main() { return 0; }
>
> test_clang_bug.cpp:3:1: error: field of type
> 'boost::scoped_ptr<int>' has private copy constructor
> AClass { boost::scoped_ptr<int> sp_pointer; };
> ^
> ..\..\..\boost/smart_ptr/__scoped_ptr.hpp:47:5: note: declared
> private here
> scoped_ptr(scoped_ptr const &);
> ^
> test_clang_bug.cpp:3:1: note: implicit copy constructor for
> 'AClass' first required here
> AClass { boost::scoped_ptr<int> sp_pointer; };
> ^
> test_clang_bug.cpp:3:1: error: 'operator=' is a private member
> of 'boost::scoped_ptr<int>'
> AClass { boost::scoped_ptr<int> sp_pointer; };
> ^
> ..\..\..\boost/smart_ptr/__scoped_ptr.hpp:48:18: note: declared
> private here
> scoped_ptr & operator=(scoped_ptr const &);
> ^
> test_clang_bug.cpp:3:1: note: implicit copy assignment operator
> for 'AClass' first required here
> AClass { boost::scoped_ptr<int> sp_pointer; };
> ^
> 2 errors generated.
>
>
> Comments ?
>
> Should I file a bug report ?
>
> I do not see why, even "exporting" a class, clang should give an
> error. If I am not copying/assigning an instance of a class I should
> never get a compiler error telling me that some member is not
> copyable or assignable.
>
> _________________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> <mailto:cfe-dev at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/__mailman/listinfo/cfe-dev
> <http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev>
>
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
More information about the cfe-dev
mailing list