From 89ad54f3ab7c28320645167c3733aec7da3e014c Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Tue, 12 Nov 2019 15:19:21 +0100 Subject: [PATCH] fix unsilenceable warnings on GCC 9 See issue https://github.com/rust-lang/rust/issues/69078 for details --- [cmake] Disable GCC 9's -Winit-list-lifetime warning in ArrayRef Summary: This is a new warning which fires when one stores a reference to the initializer_list contents in a way which may outlive the initializer_list which it came from. In llvm this warning is triggered whenever someone uses the initializer_list ArrayRef constructor. This is indeed a dangerous thing to do (I myself was bitten by that at least once), but it is not more dangerous than calling other ArrayRef constructors with temporary objects -- something which we are used to and have accepted as a tradeoff for ArrayRef's efficiency. Currently, this warnings generates so much output that it completely obscures any actionable warnings, so this patch disables it. Reviewers: rnk, aaron.ballman Subscribers: mgorny, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D70122 (cherry picked from commit 6c2151bf4c829958891e65a4cc396daa6d308eb0) --- llvm/include/llvm/ADT/ArrayRef.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/llvm/include/llvm/ADT/ArrayRef.h b/llvm/include/llvm/ADT/ArrayRef.h index 773c88f7c9f99..db1ff3b748ff0 100644 --- a/llvm/include/llvm/ADT/ArrayRef.h +++ b/llvm/include/llvm/ADT/ArrayRef.h @@ -97,9 +97,19 @@ namespace llvm { /*implicit*/ constexpr ArrayRef(const T (&Arr)[N]) : Data(Arr), Length(N) {} /// Construct an ArrayRef from a std::initializer_list. +#if LLVM_GNUC_PREREQ(9, 0, 0) +// Disable gcc's warning in this constructor as it generates an enormous amount +// of messages. Anyone using ArrayRef should already be aware of the fact that +// it does not do lifetime extension. +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Winit-list-lifetime" +#endif /*implicit*/ ArrayRef(const std::initializer_list &Vec) : Data(Vec.begin() == Vec.end() ? (T*)nullptr : Vec.begin()), Length(Vec.size()) {} +#if LLVM_GNUC_PREREQ(9, 0, 0) +#pragma GCC diagnostic pop +#endif /// Construct an ArrayRef from ArrayRef. This uses SFINAE to /// ensure that only ArrayRefs of pointers can be converted.