RFR: 8258010: Debug build failure with clang-10 due to -Wdeprecated-copy and -Wimplicit-int-float-conversion
Kim Barrett
kbarrett at openjdk.java.net
Thu Dec 24 17:29:56 UTC 2020
On Wed, 23 Dec 2020 01:45:58 GMT, Hao Sun <github.com+16932759+shqking at openjdk.org> wrote:
> 1. '-Wdeprecated-copy'
> As specified in C++11 [1], "the generation of the implicitly-defined
> copy constructor is deprecated if T has a user-defined destructor or
> user-defined copy assignment operator". The rationale behind is the
> well-known Rule of Three [2].
>
> Introduced since gcc-9 [3] and clang-10 [4], flag '-Wdeprecated-copy'
> warns about the C++11 deprecation of implicitly declared copy
> constructor and assignment operator if one of them is user-provided.
> Defining an explicit copy constructor would suppress this warning.
>
> The main reason why debug build with gcc-9 or higher succeeds lies in
> the inconsistent warning behaviors between gcc and clang. See the
> reduced code example [5]. We suspect it might be return value
> optimization/copy elision [6] that drives gcc not to declare implicit
> copy constructor for this case.
>
> Note that flag '-Wdeprecated' in clang-8 and clang-9 would also raise
> warnings for deprecated defintions of copy constructors. However,
> '-Wdeprecated' is not enabled by '-Wall' or '-Wextra'. Hence, clang-8
> and clang-9 are not affected.
>
> 2. '-Wimplicit-int-float-conversion'
> Making the conversion explicit would fix it.
>
> Flag '-Wimplicit-int-float-conversion' is first introduced in clang-10.
> Therefore clang-8 and clang-9 are not affected. The flag with similar
> functionality in gcc is '-Wfloat-conversion', but it is not enabled by
> '-Wall' or '-Wextra'. That's why this warning does not apprear when
> building with gcc.
>
> [1] https://en.cppreference.com/w/cpp/language/copy_constructor
> [2] https://en.cppreference.com/w/cpp/language/rule_of_three
> [3] https://www.gnu.org/software/gcc/gcc-9/changes.html
> [4] https://releases.llvm.org/10.0.0/tools/clang/docs/ReleaseNotes.html
> [5] https://godbolt.org/z/err4jM
> [6] https://en.wikipedia.org/wiki/Copy_elision#Return_value_optimization
>
>
> Note that we have tested with this patch, debug build succeeded with clang-10 on Linux X86/AArch64 machines.
src/hotspot/share/opto/node.hpp line 1458:
> 1456: // initialize to garbage
> 1457:
> 1458: DUIterator_Last (const DUIterator_Last& that) : DUIterator_Fast(that) {}
Since DUIterator_Last is just delegating both the copy constructor and
assignment operator to the base class, their copy constructor and
assignment operator would be better as the default (either implicit or
explicit using `=default`) rather than explicit code.
-------------
PR: https://git.openjdk.java.net/jdk/pull/1874
More information about the hotspot-dev
mailing list