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

Richard Trieu via llvm-dev llvm-dev at lists.llvm.org
Wed Oct 3 19:07:52 PDT 2018


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/5141ab70/attachment.html>


More information about the llvm-dev mailing list