public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "miro.palmu at helsinki dot fi" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/113407] New: internal_error with const char* as non-type template parameter with index parameter pack in fold expression
Date: Mon, 15 Jan 2024 20:25:04 +0000	[thread overview]
Message-ID: <bug-113407-4@http.gcc.gnu.org/bugzilla/> (raw)

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

            Bug ID: 113407
           Summary: internal_error with const char* as non-type template
                    parameter with index parameter pack in fold expression
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: miro.palmu at helsinki dot fi
  Target Milestone: ---

Created attachment 57093
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=57093&action=edit
The preprocessed source from -freport-bug

I have piece of code that should not compile due to parameter pack not located
at the end of template parameter list. However gcc 14.0.1 20240115 gives
internal compiler error while gcc 13 and earlier do not give internal errors
and the compilation fails gracefully.

Here is the code:

```
// index_sequence implementation:
template <int...> struct index_sequence;

template <int... I>
struct index_sequence{ };

template <int... I>
struct index_sequence_helper;

template <int... I>
struct index_sequence_helper <0, I...> {
    using type = index_sequence<I...>;
};

template <int n, int... I>
struct index_sequence_helper <n, I...> : public index_sequence_helper<n - 1, n
- 1, I...> { };

template <int n>
auto make_index_sequence() -> index_sequence_helper<n>::type {};

// Helpers:

template <typename... T, int I>
void inner_func(char) {}

template <typename... T, int I>
struct Foo {};

constexpr char global_string[] = "abc";

template<const char * C, typename... A>
bool func() {

    return []<int... I>(index_sequence<I...>) {
        return (inner_func<Foo<A..., I>>(C[I]), ...);
    }(make_index_sequence<sizeof...(A)>{});
}

int main() {
    func<global_string>();
}
```

It also seems that the const char* being non-type template parameter and not a
normal function parameter is important for the internal_error.

Here is the error message (compile command: g++ error.cpp):

```
error.cpp:19:31: error: need ‘typename’ before ‘index_sequence_helper<n>::type’
because ‘index_sequence_helper<n>’ is a dependent scope
   19 | auto make_index_sequence() -> index_sequence_helper<n>::type {};
      |                               ^~~~~~~~~~~~~~~~~~~~~~~~
      |                               typename 
error.cpp:26:11: error: parameter pack ‘T’ must be at the end of the template
parameter list
   26 | template <typename... T, int I>
      |           ^~~~~~~~
error.cpp: In lambda function:
error.cpp:35:38: note: so any instantiation with a non-empty parameter pack
would be ill-formed
   35 |         return (inner_func<Foo<A..., I>>(C[I]), ...);
      |                                      ^
error.cpp: In function ‘bool func()’:
error.cpp:36:7: error: ‘make_index_sequence’ was not declared in this scope;
did you mean ‘index_sequence’?
   36 |     }(make_index_sequence<sizeof...(A)>{});
      |       ^~~~~~~~~~~~~~~~~~~
      |       index_sequence
error.cpp:36:40: error: expected primary-expression before ‘{’ token
   36 |     }(make_index_sequence<sizeof...(A)>{});
      |                                        ^
error.cpp: In instantiation of ‘bool func() [with const char* C = (&
global_string); A = {}]’:
error.cpp:40:24:   required from here
error.cpp:36:40: error:    40 |     func<global_string>();
error.cpp:36:40: error:       |     ~~~~~~~~~~~~~~~~~~~^~
error.cpp:35:47: internal compiler error: tree check: expected
type_pack_expansion or expr_pack_expansion, have error_mark in
tsubst_pack_expansion, at cp/pt.cc:13632
   35 |         return (inner_func<Foo<A..., I>>(C[I]), ...);
      |                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
0x951506 tree_check_failed(tree_node const*, char const*, int, char const*,
...)
        .././../gcc/tree.cc:8952
0x7edbaf tree_check2(tree_node*, char const*, int, char const*, tree_code,
tree_code)
        .././../gcc/tree.h:3631
0x7edbaf tsubst_pack_expansion(tree_node*, tree_node*, int, tree_node*)
        .././../gcc/cp/pt.cc:13632
0xc784c4 tsubst_fold_expr_pack
        .././../gcc/cp/pt.cc:13043
0xc784c4 tsubst_unary_right_fold
        .././../gcc/cp/pt.cc:13159
0xc5994a tsubst_expr(tree_node*, tree_node*, int, tree_node*)
        .././../gcc/cp/pt.cc:21547
0xc68147 tsubst_stmt
        .././../gcc/cp/pt.cc:19384
0xc69108 tsubst_stmt
        .././../gcc/cp/pt.cc:18351
0xc68d72 tsubst_stmt
        .././../gcc/cp/pt.cc:18714
0xc7e4d0 tsubst_stmt
        .././../gcc/cp/pt.cc:18327
0xc7e4d0 tsubst_lambda_expr(tree_node*, tree_node*, int, tree_node*)
        .././../gcc/cp/pt.cc:19732
0xc5b944 tsubst_expr(tree_node*, tree_node*, int, tree_node*)
        .././../gcc/cp/pt.cc:21629
0xc58482 tsubst_expr(tree_node*, tree_node*, int, tree_node*)
        .././../gcc/cp/pt.cc:20670
0xc68147 tsubst_stmt
        .././../gcc/cp/pt.cc:19384
0xc69108 tsubst_stmt
        .././../gcc/cp/pt.cc:18351
0xc6918f tsubst_stmt
        .././../gcc/cp/pt.cc:18327
0xc6918f tsubst_stmt
        .././../gcc/cp/pt.cc:18341
0xc68d72 tsubst_stmt
        .././../gcc/cp/pt.cc:18714
0xc66ea2 tsubst_stmt
        .././../gcc/cp/pt.cc:18327
0xc66ea2 instantiate_body
        .././../gcc/cp/pt.cc:26974
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.
```

             reply	other threads:[~2024-01-15 20:25 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-15 20:25 miro.palmu at helsinki dot fi [this message]
2024-01-15 20:33 ` [Bug c++/113407] [11/12/13/14 Regression] " pinskia at gcc dot gnu.org
2024-01-16  8:05 ` rguenth at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-113407-4@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).