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

            Bug ID: 82781
           Summary: Vector extension operators return wrong result in
                    constexpr
           Product: gcc
           Version: 7.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: florent.hivert at lri dot fr
  Target Milestone: ---

The following code shows the expected behavior of the == operator on vector:

    #include<cassert>

    using foo = int __attribute__ ((vector_size (16)));

    int main() {
      const foo b1 = {0, 1, 10, 20};
      const foo b2 = {0, 2, 10, 0};
      const foo b3 = b1 == b2;

      assert (b3[0] == 0xffffffff);
      assert (b3[1] == 0x0);
      assert (b3[2] == 0xffffffff);
      assert (b3[3] == 0x0);
    }

However replacing const by constexpr breaks everything:

    using foo = int __attribute__ ((vector_size (16)));

    constexpr foo b1 = {0, 1, 10, 20};
    constexpr foo b2 = {0, 2, 10, 0};
    constexpr foo b3 = b1 == b2;

    static_assert (b3[0] == 0xffffffff);
    static_assert (b3[1] == 0x0);
    static_assert (b3[2] == 0xffffffff);
    static_assert (b3[3] == 0x0);

When compiled with

    g++-7 -std=c++14 bug-const.cpp

gives

    bug-const.cpp:8:1: error: l'assertion statique a échoué
     static_assert (b3[1] == 0x0);
     ^~~~~~~~~~~~~
    bug-const.cpp:10:1: error: l'assertion statique a échoué
     static_assert (b3[3] == 0x0);
     ^~~~~~~~~~~~~

where is should pass.

Best,

Florent

Reply via email to