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

            Bug ID: 119447
           Summary: ICE Segmentation fault with incorrect template class
                    declaration syntax and varadic parameter
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Keywords: ice-checking, ice-on-invalid-code
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rush102333 at gmail dot com
  Target Milestone: ---

Simplified test input:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#include <utility>

template< typename T, typename U >
struct template <typename> 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... >;
};

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Stack Dump:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

<source>:4:17: error: 'template' must follow a nested-name-specifier before '<'
token
    4 | struct template <typename> inclusive_scan{
      |                 ^
<source>:4:17: error: expected unqualified-id before '<' token
<source>:8:8: error: 'inclusive_scan' is not a class template
    8 | struct inclusive_scan< std::index_sequence< Ns... >,
std::index_sequence< Is... > >
      |        ^~~~~~~~~~~~~~
<source>:7:26: error: parameter pack 'Ns' must be at the end of the template
parameter list
    7 | template< std::size_t... Ns, std::size_t... Is >
      |                          ^~
<source>: In substitution of 'template<<declaration error>, long unsigned int
...Is> template<long unsigned int I> using inclusive_scan<<declaration error>,
Is>::part = std::integral_constant<long unsigned int, (Is <= I ?  Ns 0 + ...
+0)> [with long unsigned int I = Is; <declaration error> = <expression error>;
long unsigned int ...Is = {Is ...}]':
<source>:13:48:   required from here
   13 |     using type = std::index_sequence< part< Is >::value... >;
      |                                                ^
<source>:13:48: internal compiler error: Segmentation fault
0x291f775 diagnostic_context::diagnostic_impl(rich_location*,
diagnostic_metadata const*, diagnostic_option_id, char const*, __va_list_tag
(*) [1], diagnostic_t)
        ???:0
0x2936746 internal_error(char const*, ...)
        ???:0
0xb19080 pop_nested_class()
        ???:0
0xd467a3 instantiate_template(tree_node*, tree_node*, int)
        ???:0
0xd277b2 lookup_template_class(tree_node*, tree_node*, tree_node*, tree_node*,
int)
        ???:0
0xd71dbc finish_template_type(tree_node*, tree_node*, int)
        ???:0
0xcf2203 c_parse_file()
        ???:0
0xe545e9 c_common_parse_file()
        ???:0
Please submit a full bug report, with preprocessed source (by using
-freport-bug).
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Please see https://godbolt.org/z/4sKcdh7Ee

Reply via email to