This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug middle-end/71177] New: [6 Regression] Spurious -Waggressive-loop-optimizations warning


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71177

            Bug ID: 71177
           Summary: [6 Regression] Spurious
                    -Waggressive-loop-optimizations warning
           Product: gcc
           Version: 6.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tavianator at gmail dot com
  Target Milestone: ---

Created attachment 38516
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=38516&action=edit
Reduced testcase

The following use of boost::container::string gives a warning since GCC 6:

$ cat stringbug.cpp
#include <boost/container/string.hpp>

using boost::container::string;

string normalize(string token)
{
  if (token.length() >= 2) {
    token.resize(token.length() - 2);
  }
  return token;
}
$ g++ -Wall -O3 -c stringbug.cpp
In function âboost::container::string normalize(boost::container::string)â:
cc1plus: warning: iteration 9223372036854775807 invokes undefined behavior
[-Waggressive-loop-optimizations]
In file included from stringbug.cpp:1:0:
/usr/include/boost/container/string.hpp:2608:10: note: within this loop
          for (; first != last; ++dest, ++first, ++constructed){
          ^~~
cc1plus: warning: iteration 9223372036854775807 invokes undefined behavior
[-Waggressive-loop-optimizations]
/usr/include/boost/container/string.hpp:2626:7: note: within this loop
       for ( ; first != last; ++first, ++result)
       ^~~

What's happening is that resize() is implemented like this:

   void resize(size_type n, CharT c)
   {
      if (n <= this->size())
         this->erase(this->begin() + n, this->end());
      else
         this->append(n - this->size(), c);
   }

After inlining/constant propagation, the else block contains undefined
behaviour for resize(length - 2).  But the else block is also unreachable due
to the if (length >= 2) check.

Reduced testcase attached.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]