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

            Bug ID: 64333
           Summary: C++14 constexpr gives wrong results when a looping
                    constexpr function is evaluated twice
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ville.voutilainen at gmail dot com
                CC: jason at redhat dot com

#include <initializer_list>

constexpr int max(std::initializer_list<int> ints)
{
        int ret = *(ints.begin());
        for (int i = 0; i < ints.size(); ++i) {
                if (*(ints.begin()+i) > ret) {
                        ret = *(ints.begin()+i);
                }
        }
        return ret;
}

int main()
{
        constexpr int z = max({7,6,5,4,3,2,1});
        constexpr int z2 = max({5,4,3,2,1});
        static_assert(z == 7, "");
        static_assert(z2 == 5, "");
}

z2 is 7. There's something fishy going on here. :)

Reply via email to