RFR: 8258010: Debug build failure with clang-10 due to -Wdeprecated-copy and -Wimplicit-int-float-conversion [v2]
Xin Liu
xliu at openjdk.java.net
Mon Jan 4 19:36:55 UTC 2021
On Mon, 4 Jan 2021 04:31:02 GMT, Hao Sun <github.com+16932759+shqking at openjdk.org> wrote:
>>> _Mailing list message from [Kim Barrett](mailto:kim.barrett at oracle.com) on [build-dev](mailto:build-dev at openjdk.java.net):_
>>>
>>> > On Dec 24, 2020, at 3:44 PM, Xin Liu <xliu at openjdk.java.net> wrote:
>>> > On Thu, 24 Dec 2020 17:27:39 GMT, Kim Barrett <kbarrett at openjdk.org> wrote:
>>> > > [?]
>>> > > 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.
>>> >
>>> >
>>> > Agree. c2 actually never uses the assignment operator of DUIterator_Last. It needs the copy constructor in this line.
>>> > https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/node.hpp#L1499
>>> > you can delete the following code or leave it =default.
>>> > - void operator=(const DUIterator_Last& that)
>>> > - { DUIterator_Fast::operator=(that); }
>>>
>>> DUIterator_Last::operator= *is* used, for example:
>>> https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/node.hpp#L1473
>>>
>>> That doesn't change whether defaulting DUIIterator_Last's copy constructor
>>> and copy assign works though (whether implicit or explicit). So making it
>>> implicit does work.
>>>
>>> I think making it explicitly defaulted might be better though, to make it
>>> clear the default behavior is intentional and it wasn't accidentally left as
>>> the implicit default. This is because the default isn't right for the other
>>> related classes.
>>
>> Yes. You're right. It's much better to make it explicitly defaulted.
>> May I have your opinion @navyxliu ?
>
>> _Mailing list message from [Kim Barrett](mailto:kim.barrett at oracle.com) on [build-dev](mailto:build-dev at openjdk.java.net):_
>>
>> > On Dec 29, 2020, at 10:33 PM, Hao Sun <github.com+16932759+shqking at openjdk.java.net> wrote:
>> > > _Mailing list message from [Kim Barrett](mailto:kim.barrett at oracle.com) on [build-dev](mailto:build-dev at openjdk.java.net):_
>> > > C++17 "guaranteed copy elision" is implemented in gcc7.
>> > > http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0135r1.html
>> >
>> >
>> > Thanks for your comment.
>> > Initially we only suspected it might be copy elision that made gcc and clang to behave differently on this warning, and we were not aware of this flag '-fno-elide-constructors'.
>> > Thank you for pointing it out.
>> > > Using -fno-elide-constructors makes it obvious that the deprecated
>> > > implicit copy constructors are indeed being elided, so no deprecation
>> > > warning.
>> >
>> >
>> > I suppose you want to express 'Using -**felide-constructors**' here.
>> > gcc with '-fno-elide-constructos' would produce derepcated warnings for this issue as clang-10 does.
>>
>> I really did mean "-fno-elide-constructors". The idea is that having the
>> normally working build fail with "-fno-elide-constructors" provides evidence
>> for the "working because of copy elision" conjecture.
>>
>> clang has supported -f[no-]elide-constructors for a while.
>>
>> It appears that either clang is different from gcc for -felide-constructors
>> (which seems unlikely), or clang (clang-10) is doing the deprecation warning
>> at a different point from gcc (quite plausible). That is, clang could be
>> checking for the deprecated case before eliding the call, while gcc is
>> checking for the deprecated case after copy elision has been applied.
>
> Thanks for your reply.
> I checked the source code of clang-10 and gcc-9 and found that:
>
> 1) for clang-10,
> 'Wdeprecated-copy' is implemented at the 'Sema' module of clang. See https://github.com/llvm/llvm-project/blob/release/10.x/clang/lib/Sema/SemaDeclCXX.cpp#L13585
>
> Flag 'felide-constructors' would enable 'felide_constructors' and flag 'fno-elide-constructors' would enables 'fno_elide_constructors'. (See https://github.com/llvm/llvm-project/blob/release/10.x/clang/include/clang/Driver/Options.td).
> Then 'ElideConstructors' will be set (See https://github.com/llvm/llvm-project/blob/release/10.x/clang/lib/Frontend/CompilerInvocation.cpp#L2863)
> Finally, constructors might be elided in several spots in 'CodeGen' module.
> See:
> https://github.com/llvm/llvm-project/blob/release/10.x/clang/lib/CodeGen/CGStmt.cpp#L1094
> https://github.com/llvm/llvm-project/blob/release/10.x/clang/lib/CodeGen/CGExprCXX.cpp#L611
> https://github.com/llvm/llvm-project/blob/release/10.x/clang/lib/CodeGen/CGDecl.cpp#L1405
>
> As far as I know, 'Sema' module is conducted to check semantics errors before 'CodeGen' module.
> That verified your conjecture, i.e. 'clang could be checking for the derepcated case before eliding the call'.
>
> 2) for gcc-9,
> 'felide-constructors' and 'Wdeprecated-copy' are implemented in a number of spots in gcc. I currently didn't figure out their execution order clearly.
>
> But in one of the use points at function build_over_call(), 'flag_elide_constructors' (See https://github.com/gcc-mirror/gcc/blob/releases/gcc-9/gcc/cp/call.c#L8538) is handled **before** 'warn_deprecated_copy' (See https://github.com/gcc-mirror/gcc/blob/releases/gcc-9/gcc/cp/call.c#L8608 and https://github.com/gcc-mirror/gcc/blob/releases/gcc-9/gcc/cp/call.c#L8679)
>
> Hope that my finding is helpful. Thanks.
> > _Mailing list message from [Kim Barrett](mailto:kim.barrett at oracle.com) on [build-dev](mailto:build-dev at openjdk.java.net):_
> > > On Dec 24, 2020, at 3:44 PM, Xin Liu wrote:
> > > On Thu, 24 Dec 2020 17:27:39 GMT, Kim Barrett wrote:
> > > > [?]
> > > > 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.
> > >
> > >
> > > Agree. c2 actually never uses the assignment operator of DUIterator_Last. It needs the copy constructor in this line.
> > > https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/node.hpp#L1499
> > > you can delete the following code or leave it =default.
> > >
> > > * void operator=(const DUIterator_Last& that)
> > > * { DUIterator_Fast::operator=(that); }
> >
> >
> > DUIterator_Last::operator= _is_ used, for example:
> > https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/node.hpp#L1473
> > That doesn't change whether defaulting DUIIterator_Last's copy constructor
> > and copy assign works though (whether implicit or explicit). So making it
> > implicit does work.
> > I think making it explicitly defaulted might be better though, to make it
> > clear the default behavior is intentional and it wasn't accidentally left as
> > the implicit default. This is because the default isn't right for the other
> > related classes.
>
> Yes. You're right. It's much better to make it explicitly defaulted.
> May I have your opinion @navyxliu ?
Sorry, I overlooked that copy assignment case.
Making it explicitly default is better to me too. no objection!
-------------
PR: https://git.openjdk.java.net/jdk/pull/1874
More information about the build-dev
mailing list