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

            Bug ID: 91747
           Summary: Using a type alias leads to wrong static values.
           Product: gcc
           Version: 9.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: d.frey at gmx dot de
  Target Milestone: ---

Sorry for the title, I have no idea how to describe the problem in any better
way :-/

The following program fails, the static_assert() is (wrongly) triggered:

#include <utility>

template< typename T, typename = std::make_index_sequence< T::size() > >
struct inclusive_scan;

template< std::size_t... Ns, std::size_t... Is >
struct inclusive_scan< std::index_sequence< Ns... >, std::index_sequence< Is...
> >
{
    template< std::size_t I >
    using part = std::integral_constant< std::size_t, ( 0 + ... + ( ( Is <= I )
? Ns : 0 ) ) >;

    using type = std::index_sequence< part< Is >::value... >;
};

int main()
{
    using S = std::index_sequence<3,1,2,1,3>;

    using IS = inclusive_scan<S>::type;
    static_assert( std::is_same_v<IS, std::index_sequence<3,4,6,7,10>> );
}

Clang and MSVC accept the code.

If you change

    template< std::size_t I >
    using part = std::integral_constant< std::size_t, ( 0 + ... + ( ( Is <= I )
? Ns : 0 ) ) >;

into

    template< std::size_t I >
    struct part : std::integral_constant< std::size_t, ( 0 + ... + ( ( Is <= I
) ? Ns : 0 ) ) >{};

the code is also compiled correctly with GCC. This problem is present in GCC 7,
8, 9 and trunk, see Compiler Explorer https://godbolt.org/z/KOdhTV

Reply via email to