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

            Bug ID: 94511
           Summary: User-defined type in non-type template parameter
                    yields an incorrect value
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pacoarjonilla at yahoo dot es
  Target Milestone: ---

g++ --std=c++2a code.cc && ./a.out

The following snippet misbehaves with GCC9 and GCC10 master

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

#include <cstddef>
#include <iostream>

struct A {
    std::byte data [6] {static_cast<std::byte>(0x00)};

    constexpr A(char ch) {
        data[ch/8] |= static_cast<std::byte>(0x01 << (ch % 8));
    }
};

template <A chars> struct B { char ch; };

void print(A a) {
    for (int i = 0; i < 6; i++)
        std::cout << (unsigned)a.data[i] << ' ';
    std::cout << std::endl;
}

using Bn = B<{'\n'}>; // XXX Replacing \n by any other character less than 48
corrects the issue XXX
using Ba = B<{'.'}>;

template <A T> void foo () {
    print(T);
}

int main() {
    foo<'*'>(); // XXX Replacing the * also corrects the issue XXX
    print(A{'*'});
}

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Expected output

0 0 0 0 0 4 
0 0 0 0 0 4 

Actual output

0 4 0 0 0 0 
0 0 0 0 0 4

Reply via email to