[Bug libstdc++/77303] New: std::max_element not constexpr with -D_GLIBCXX_DEBUG

lukibartl at gmail dot com gcc-bugzilla@gcc.gnu.org
Fri Aug 19 22:20:00 GMT 2016


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

            Bug ID: 77303
           Summary: std::max_element not constexpr with -D_GLIBCXX_DEBUG
           Product: gcc
           Version: 6.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: lukibartl at gmail dot com
  Target Milestone: ---

Created attachment 39476
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=39476&action=edit
The preprocessed file

When compiling with -D_GLIBCXX_DEBUG, std::max_element is not constexpr:

Code:

#include <algorithm>

int main() {
    constexpr size_t max = std::max({1, 2, 3});
    return max;
}

Compiled with:

g++ -v -save-temps -std=c++14 -D_GLIBCXX_DEBUG gcc_error.cpp

Output:

Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/6.1.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap
--enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr
--mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared
--enable-threads=posix --enable-checking=release --enable-multilib
--with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions
--enable-gnu-unique-object --enable-linker-build-id
--with-linker-hash-style=gnu --enable-plugin --enable-initfini-array
--disable-libgcj --with-isl --enable-libmpx --enable-gnu-indirect-function
--with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 6.1.1 20160621 (Red Hat 6.1.1-3) (GCC) 
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-std=c++14' '-D' '_GLIBCXX_DEBUG'
'-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/6.1.1/cc1plus -E -quiet -v -D_GNU_SOURCE
-D _GLIBCXX_DEBUG gcc_error.cpp -mtune=generic -march=x86-64 -std=c++14
-fpch-preprocess -o gcc_error.ii
ignoring nonexistent directory
"/usr/lib/gcc/x86_64-redhat-linux/6.1.1/include-fixed"
ignoring nonexistent directory
"/usr/lib/gcc/x86_64-redhat-linux/6.1.1/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-redhat-linux/6.1.1/../../../../include/c++/6.1.1

/usr/lib/gcc/x86_64-redhat-linux/6.1.1/../../../../include/c++/6.1.1/x86_64-redhat-linux
 /usr/lib/gcc/x86_64-redhat-linux/6.1.1/../../../../include/c++/6.1.1/backward
 /usr/lib/gcc/x86_64-redhat-linux/6.1.1/include
 /usr/local/include
 /usr/include
End of search list.
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-std=c++14' '-D' '_GLIBCXX_DEBUG'
'-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/libexec/gcc/x86_64-redhat-linux/6.1.1/cc1plus -fpreprocessed gcc_error.ii
-quiet -dumpbase gcc_error.cpp -mtune=generic -march=x86-64 -auxbase gcc_error
-std=c++14 -version -o gcc_error.s
GNU C++14 (GCC) version 6.1.1 20160621 (Red Hat 6.1.1-3) (x86_64-redhat-linux)
        compiled by GNU C version 6.1.1 20160621 (Red Hat 6.1.1-3), GMP version
6.1.0, MPFR version 3.1.4, MPC version 1.0.2, isl version 0.14 or 0.13
warning: GMP header version 6.1.0 differs from library version 6.1.1.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU C++14 (GCC) version 6.1.1 20160621 (Red Hat 6.1.1-3) (x86_64-redhat-linux)
        compiled by GNU C version 6.1.1 20160621 (Red Hat 6.1.1-3), GMP version
6.1.0, MPFR version 3.1.4, MPC version 1.0.2, isl version 0.14 or 0.13
warning: GMP header version 6.1.0 differs from library version 6.1.1.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 8e1af9556445b8cc2090cc3ce62d071f
In file included from /usr/include/c++/6.1.1/algorithm:62:0,
                 from gcc_error.cpp:1:
/usr/include/c++/6.1.1/bits/stl_algo.h: In function 'int main()':
gcc_error.cpp:4:36:   in constexpr expansion of
'std::max<int>(std::initializer_list<int>{((const int*)(& ._65)), 3u})'
/usr/include/c++/6.1.1/bits/stl_algo.h:3460:31: error: 'constexpr _FIter
std::max_element(_FIter, _FIter) [with _FIter = const int*]' called in a
constant expression
     { return *std::max_element(__l.begin(), __l.end()); }
               ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/6.1.1/algorithm:62:0,
                 from gcc_error.cpp:1:
/usr/include/c++/6.1.1/bits/stl_algo.h:5539:5: note: 'constexpr _FIter
std::max_element(_FIter, _FIter) [with _FIter = const int*]' is not usable as a
constexpr function because:
     max_element(_ForwardIterator __first, _ForwardIterator __last)
     ^~~~~~~~~~~
/usr/include/c++/6.1.1/bits/stl_algo.h:5545:45: error: call to non-constexpr
function 'bool __gnu_debug::__valid_range(const _InputIterator&, const
_InputIterator&) [with _InputIterator = const int*]'
       __glibcxx_requires_valid_range(__first, __last);
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~


More information about the Gcc-bugs mailing list