[llvm-dev] New warnings when building trunk with GCC 9

Richard Trieu via llvm-dev llvm-dev at lists.llvm.org
Wed Oct 3 22:38:50 PDT 2018


https://reviews.llvm.org/D52863 - LLVM cleanup
https://reviews.llvm.org/D52864 - Clang cleanup

These are the needed cleanup for the new -Wdeprecated-copy warning.
LatticeCell seems to be the only interesting case, with logic in the copy
assignment operator not being used in the copy constructor.  The rest are
pretty straight forward.

On Wed, Oct 3, 2018 at 7:07 PM Richard Trieu <rtrieu at google.com> wrote:

> So, Clang does have a warning for deprecated copy, except that it's buried
> in -Wdeprecated without its own flag.  There's a few other differences
> too.  GCC will warn once per call to the deprecated function while Clang
> will warn once per deprecated function.  GCC will not consider functions
> that are "= default" or "= delete" while Clang will.  That means for
> "struct S { ~S() = default; };" using S's implicit copy constructor will
> cause Clang to warn while GCC does not.  GCC uses "user-provided" while
> Clang says "user-declared"
>
> $ cat test.cc
> struct S {
>   ~S();
> };
>
> S s = s;
>
> $ gcc test.cc -Wdeprecated-copy
> test.cc:5:7: warning: implicitly-declared 'constexpr S::S(const S&)' is
> deprecated [-Wdeprecated-copy]
> 5 | S s = s;
>   |       ^
> test.cc:2:3: note: because 'S' has user-provided 'S::~S()'
> 2 |   ~S();
>   |   ^
>
> $ clang test.cc -Wdeprecated
> test:2:3: warning: definition of implicit copy constructor for 'S' is
> deprecated because it has a user-declared destructor [-Wdeprecated]
>   ~S();
>   ^
> test:5:7: note: in implicit copy constructor for 'S' first required here
> S s = s;
>       ^
>
> This is a patch to give Clang a -Wdeprecated-copy, which also ignores
> explicitly defaulted/deleted functions like GCC.
> https://reviews.llvm.org/D52860
>
> On Thu, Sep 13, 2018 at 9:22 AM David Blaikie <dblaikie at gmail.com> wrote:
>
>> Great to see GCC catching the deprecated ctor case - would be great to
>> get that implemented in Clang at some point (& enabled for LLVM builds).
>> (rtrieu@)
>> The vector one looks like a false positive? You're allowed to form a
>> pointer to an element one past the end of a singular object but it looks
>> like that's what GCC's warning on.
>> Initializer list - maybe a false positive too, given ArrayRef is intended
>> to refer to a temporary object - I think the initializer_list's lifetime is
>> to teh end of the full expression where it was written, so this can still
>> be OK.
>> The ORC/redundant-move one looks correct - I wonder why Clang didn't
>> diagnose that (rtrieu@)?
>>
>> On Thu, Sep 13, 2018 at 12:13 AM Dávid Bolvanský via llvm-dev <
>> llvm-dev at lists.llvm.org> wrote:
>>
>>> Hello,
>>>
>>> GCC 9.0 introduces a new warning checkers and some of them found
>>> possible issues in LLVM.
>>>
>>> In file included from
>>> /home/davidbolvansky/trunk/llvm/include/llvm/Analysis/LazyCallGraph.h:38,
>>>                  from
>>> /home/davidbolvansky/trunk/llvm/unittests/Analysis/LazyCallGraphTest.cpp:10:
>>> /home/davidbolvansky/trunk/llvm/include/llvm/ADT/ArrayRef.h: In
>>> instantiation of ‘llvm::ArrayRef<T>::ArrayRef(const
>>> std::initializer_list<_Tp>&) [with T = llvm::LazyCallGraph::Node*]’:
>>> /home/davidbolvansky/trunk/llvm/unittests/Analysis/LazyCallGraphTest.cpp:1169:52:
>>>  required from here
>>> /home/davidbolvansky/trunk/llvm/include/llvm/ADT/ArrayRef.h:102:37:
>>> warning: initializing ‘llvm::ArrayRef<llvm::LazyCallGraph::Node*>::Data’
>>> from ‘std::initializer_list<llvm::LazyCallGraph::Node*>::begin’ does not
>>> extend the lifetime of the underlying array [-Winit-list-lifetime]
>>>
>>> In file included from
>>> /home/davidbolvansky/trunk/llvm/unittests/ADT/SmallVectorTest.cpp:14:
>>> /home/davidbolvansky/trunk/llvm/include/llvm/ADT/SmallVector.h: In
>>> member function ‘virtual void
>>> {anonymous}::SmallVectorTest_InitializerList_Test::TestBody()’:
>>> /home/davidbolvansky/trunk/llvm/include/llvm/ADT/SmallVector.h:502:7:
>>> warning: array subscript 1 is outside array bounds of ‘int [1]’
>>> [-Warray-bounds]
>>> 502 |       ++EltPtr;
>>> /home/davidbolvansky/trunk/llvm/unittests/ADT/SmallVectorTest.cpp:994:30:
>>> note: while referencing ‘<anonymous>’
>>> 994 |   V2.insert(V2.begin() + 1, 5);
>>>
>>> /home/davidbolvansky/trunk/llvm/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp:79:40:
>>>  required from here
>>> /home/davidbolvansky/trunk/llvm/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h:314:29:
>>> warning: redundant move in return statement [-Wredundant-move]
>>> 314 |         return std::move(Err);
>>>
>>> In file included from
>>> /home/davidbolvansky/trunk/llvm/utils/unittest/googlemock/include/gmock/gmock-spec-builders.h:75,
>>>                  from
>>> /home/davidbolvansky/trunk/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-function-mockers.h:43,
>>>                  from
>>> /home/davidbolvansky/trunk/llvm/utils/unittest/googlemock/include/gmock/gmock.h:61,
>>>                  from
>>> /home/davidbolvansky/trunk/llvm/include/llvm/Testing/Support/Error.h:17,
>>>                  from
>>> /home/davidbolvansky/trunk/llvm/unittests/DebugInfo/MSF/MappedBlockStreamTest.cpp:15:
>>> /home/davidbolvansky/trunk/llvm/utils/unittest/googlemock/include/gmock/gmock-matchers.h:
>>> In instantiation of
>>> ‘testing::internal::PredicateFormatterFromMatcher<M>::PredicateFormatterFromMatcher(M)
>>> [with M = llvm::FailedMatcher]’:
>>> /home/davidbolvansky/trunk/llvm/utils/unittest/googlemock/include/gmock/gmock-matchers.h:1880:10:
>>>  required from ‘testing::internal::PredicateFormatterFromMatcher<M>
>>> testing::internal::MakePredicateFormatterFromMatcher(M) [with M =
>>> llvm::FailedMatcher]’
>>> /home/davidbolvansky/trunk/llvm/unittests/DebugInfo/MSF/MappedBlockStreamTest.cpp:96:3:
>>>  required from here
>>> /home/davidbolvansky/trunk/llvm/utils/unittest/googlemock/include/gmock/gmock-matchers.h:1836:75:
>>> warning: implicitly-declared ‘constexpr
>>> llvm::FailedMatcher::FailedMatcher(const llvm::FailedMatcher&)’ is
>>> deprecated [-Wdeprecated-copy]
>>> 1836 |   explicit PredicateFormatterFromMatcher(M m) :
>>> matcher_(internal::move(m)) {}
>>>      |
>>>          ^
>>> In file included from
>>> /home/davidbolvansky/trunk/llvm/utils/unittest/googletest/include/gtest/gtest-printers.h:103,
>>>                  from
>>> /home/davidbolvansky/trunk/llvm/include/llvm/Testing/Support/SupportHelpers.h:16,
>>>                  from
>>> /home/davidbolvansky/trunk/llvm/include/llvm/Testing/Support/Error.h:15,
>>>                  from
>>> /home/davidbolvansky/trunk/llvm/unittests/DebugInfo/MSF/MappedBlockStreamTest.cpp:15:
>>> /home/davidbolvansky/trunk/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port.h:873:8:
>>> note: because ‘llvm::FailedMatcher’ has user-provided ‘void
>>> llvm::FailedMatcher::operator=(const llvm::FailedMatcher&)’
>>> 873 |   void operator=(type const &)
>>>     |        ^~~~~~~~
>>> /home/davidbolvansky/trunk/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h:1417:5:
>>> note: in expansion of macro ‘GTEST_DISALLOW_ASSIGN_’
>>> 1417 |     GTEST_DISALLOW_ASSIGN_(name##Matcher);\
>>>      |     ^~~~~~~~~~~~~~~~~~~~~~
>>> /home/davidbolvansky/trunk/llvm/include/llvm/Testing/Support/Error.h:145:1:
>>> note: in expansion of macro ‘MATCHER’
>>> 145 | MATCHER(Failed, "") { return !arg.Success(); }
>>>
>>>
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181003/03ee63b4/attachment.html>


More information about the llvm-dev mailing list