> Am 27.04.2022 um 17:46 schrieb Jakub Jelinek <ja...@redhat.com>:
> 
> On Wed, Apr 27, 2022 at 12:02:33PM +0200, Richard Biener wrote:
>>> On Wed, 27 Apr 2022, Jakub Jelinek wrote:
>>> 
>>> On Wed, Apr 27, 2022 at 11:56:55AM +0200, Richard Biener wrote:
>>>> Bootstrapped & tested on x86_64-unknown-linux-gnu.
>>>> 
>>>> OK?
>>> 
>>> I think a testcase from the #c0 of the PR would be nice, but it can
>>> be added incrementally, so ok for trunk and unless somebody beats me
>>> to it, I'll try to reduce the testcase.  With a fixed and unfixed compiler
>>> around it might be easier for reduction.
>> 
>> I did that but the reduction result did not resemble the same failure
>> mode.  I've failed to manually construct a testcase as well.  Possibly
>> a testcase using libstdc++ but less Qt internals might be possible.
> 
> Here is a testcase that I've managed to reduce, FAILs with:
> FAIL: g++.dg/warn/pr104492.C  -std=gnu++14  (test for bogus messages, line 
> 111)
> FAIL: g++.dg/warn/pr104492.C  -std=gnu++17  (test for bogus messages, line 
> 111)
> FAIL: g++.dg/warn/pr104492.C  -std=gnu++20  (test for bogus messages, line 
> 111)
> on both x86_64-linux and i686-linux without your commit and passes with it,
> ok for trunk?

Ok.

Richard 


> 2022-04-27  Jakub Jelinek  <ja...@redhat.com>
> 
>    PR middle-end/104492
>    * g++.dg/warn/pr104492.C: New test.
> 
> --- gcc/testsuite/g++.dg/warn/pr104492.C.jj    2022-04-27 17:40:52.427671414 
> +0200
> +++ gcc/testsuite/g++.dg/warn/pr104492.C    2022-04-27 17:40:12.524214984 
> +0200
> @@ -0,0 +1,115 @@
> +// PR middle-end/104492
> +// { dg-do compile { target c++14 } }
> +// { dg-options "-O3 -Wall" }
> +
> +namespace std {
> +typedef decltype (sizeof 0) size_t;
> +template <typename _Tp, _Tp __v> struct integral_constant {
> +  static constexpr _Tp value = __v;
> +};
> +template <typename _Tp, typename _Up>
> +struct is_same : integral_constant<bool, __is_same(_Tp, _Up)> {};
> +template <bool, typename> struct enable_if;
> +template <typename _Tp> _Tp forward;
> +}
> +class QString;
> +struct random_access_iterator_tag {};
> +template <typename> struct iterator_traits {
> +  typedef random_access_iterator_tag iterator_category;
> +};
> +template <typename _Iter>
> +typename iterator_traits<_Iter>::iterator_category 
> __iterator_category(_Iter);
> +namespace __gnu_cxx {
> +namespace __ops {
> +template <typename> struct _Iter_equals_val {
> +  template <typename _Iterator> bool operator()(_Iterator);
> +};
> +template <typename _Value> _Iter_equals_val<_Value> 
> __iter_equals_val(_Value);
> +}
> +}
> +namespace std {
> +template <typename _RandomAccessIterator, typename _Predicate>
> +_RandomAccessIterator __find_if(_RandomAccessIterator __first,
> +                _RandomAccessIterator __last, _Predicate __pred,
> +                random_access_iterator_tag) {
> +  if (__pred(__first))
> +    return __first;
> +  return __last;
> +}
> +template <typename _Iterator, typename _Predicate>
> +_Iterator __find_if(_Iterator __first, _Iterator __last, _Predicate __pred) {
> +  return __find_if(__first, __last, __pred, __iterator_category(__first));
> +}
> +template <typename _Tp, size_t _Nm> _Tp *begin(_Tp (&__arr)[_Nm]) {
> +  return __arr;
> +}
> +template <typename _Tp, size_t _Nm> _Tp *end(_Tp (&__arr)[_Nm]) {
> +  return __arr + _Nm;
> +}
> +template <typename _InputIterator, typename _Tp>
> +_InputIterator find(_InputIterator __first, _InputIterator __last, _Tp 
> __val) {
> +  return __find_if(__first, __last, 
> __gnu_cxx::__ops::__iter_equals_val(__val));
> +}
> +}
> +struct QStringView {
> +  template <typename T>
> +  using if_compatible_qstring_like = std::enable_if<std::is_same<T, 
> QString>::value, bool>;
> +  template <typename String> QStringView(String);
> +};
> +template <typename Haystack, typename> struct QStringTokenizerBase {
> +  class sentinel {};
> +  struct iterator {
> +    Haystack operator*();
> +    iterator operator++(int);
> +    bool operator!=(sentinel);
> +  };
> +  iterator begin();
> +  template <bool = std::is_same<iterator, sentinel>::value> sentinel end();
> +};
> +namespace QtPrivate {
> +namespace Tok {
> +template <typename Haystack, typename Needle>
> +using TokenizerBase = QStringTokenizerBase<Haystack, Needle>;
> +}
> +}
> +template <typename Haystack, typename Needle>
> +struct QStringTokenizer
> +    : public QtPrivate::Tok::TokenizerBase<Haystack, Needle> {
> +  QStringTokenizer(Haystack, Needle);
> +};
> +namespace QtPrivate {
> +namespace Tok {
> +template <typename Haystack, typename Needle>
> +using TokenizerResult = QStringTokenizer<Haystack, Needle>;
> +}
> +}
> +template <typename Haystack, typename Needle>
> +auto qTokenize(Haystack, Needle)
> +    -> decltype(QtPrivate::Tok::TokenizerResult<Haystack, Needle>{
> +    std::forward<Haystack>, std::forward<Needle>});
> +struct QLatin1String {
> +  QLatin1String(const char *) {}
> +};
> +class QString {};
> +class QLibrary {
> +  bool isLibrary(const QString &);
> +};
> +
> +bool QLibrary::isLibrary(const QString &fileName)
> +{
> +    QString completeSuffix = fileName;
> +    auto isValidSuffix = [](QStringView s) {
> +    const QLatin1String candidates[] = {
> +        QLatin1String("so"),
> +    };
> +    return std::find(std::begin(candidates), std::end(candidates), s) != 
> std::end(candidates);
> +    };
> +    auto suffixes = qTokenize(completeSuffix, u'.');
> +    auto it = suffixes.begin();
> +    const auto end = suffixes.end();
> +    while (it != end) {
> +    if (isValidSuffix(*it++))    // { dg-bogus "dangling pointer to 
> .candidates. may be used" }
> +      return true;
> +    }
> +    return false;
> +}
> 
> 
>    Jakub
> 

Reply via email to