The code: template <auto> struct a {}; template <int i, const a <i> s = a <i> {}> using b = a <s>; template <int i> constexpr auto g (const b <i> &) { return true; }; compiled with 'g++ -std=c++20 -c bug-13.cpp' (g++ (GCC) 11.0.0 20210123 (experimental)), produces: ug-13.cpp: In substitution of ‘template<int i, a<i> s> using b = a<((const a<i>)s)> [with int i = i; a<i> s = a<i>{}]’: bug-13.cpp:4:46: required from here bug-13.cpp:3:57: internal compiler error: in tsubst_copy, at cp/pt.c:16771 3 | template <int i, const a <i> s = a <i> {}> using b = a <s>; | ^ 0x6cb940 tsubst_copy ../../src/gcc/cp/pt.c:16771 0xac3c42 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../src/gcc/cp/pt.c:20766 0xacee68 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../src/gcc/cp/pt.c:19019 0xae1a4e tsubst_template_args(tree_node*, tree_node*, int, tree_node*) ../../src/gcc/cp/pt.c:13322 0xaecf83 tsubst_aggr_type ../../src/gcc/cp/pt.c:13525 0xacbed0 tsubst_decl ../../src/gcc/cp/pt.c:14763 0xade475 instantiate_template_1 ../../src/gcc/cp/pt.c:21016 0xadf76f instantiate_template(tree_node*, tree_node*, int) ../../src/gcc/cp/pt.c:21075 0xadf76f instantiate_alias_template ../../src/gcc/cp/pt.c:21113 0xadf76f tsubst(tree_node*, tree_node*, int, tree_node*) ../../src/gcc/cp/pt.c:15394 0xaeb4ff lookup_template_class_1 ../../src/gcc/cp/pt.c:9937 0xaec8dc lookup_template_class(tree_node*, tree_node*, tree_node*, tree_node*, int, int) ../../src/gcc/cp/pt.c:10226 0xb1431b finish_template_type(tree_node*, tree_node*, int) ../../src/gcc/cp/semantics.c:3464 0xa87531 cp_parser_template_id ../../src/gcc/cp/parser.c:17406 0xa8771b cp_parser_class_name ../../src/gcc/cp/parser.c:24631 0xa7ecba cp_parser_qualifying_entity ../../src/gcc/cp/parser.c:6994 0xa7ecba cp_parser_nested_name_specifier_opt ../../src/gcc/cp/parser.c:6676 0xa94234 cp_parser_simple_type_specifier ../../src/gcc/cp/parser.c:18799 0xa7332d cp_parser_type_specifier ../../src/gcc/cp/parser.c:18457 0xa74329 cp_parser_decl_specifier_seq ../../src/gcc/cp/parser.c:15003 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions.
clang accepts it with -std=c++17, GCC rejects it there with t.C:2:41: error: non-type template parameters of class type only available with '-std=c++20' or '-std=gnu++20'
r273592
The master branch has been updated by Jason Merrill <jason@gcc.gnu.org>: https://gcc.gnu.org/g:7c657339d6a4a671b4cd8bc62ba4e0df6bfc7c72 commit r11-7416-g7c657339d6a4a671b4cd8bc62ba4e0df6bfc7c72 Author: Jason Merrill <jason@redhat.com> Date: Thu Feb 25 16:47:53 2021 -0500 c++: Fix class NTTP constness handling [PR98810] Here, when substituting still-dependent args into an alias template, we see a non-const type because the default argument is non-const, and is not a template parm object because it's still dependent. gcc/cp/ChangeLog: PR c++/98810 * pt.c (tsubst_copy) [VIEW_CONVERT_EXPR]: Add const to a class non-type template argument that needs it. gcc/testsuite/ChangeLog: PR c++/98810 * g++.dg/cpp2a/nontype-class-defarg1.C: New test.
Fixed for GCC 11 so far.
The releases/gcc-10 branch has been updated by Jason Merrill <jason@gcc.gnu.org>: https://gcc.gnu.org/g:bf49d83570ddb4df7893c3d605f7fc89db13792d commit r10-9412-gbf49d83570ddb4df7893c3d605f7fc89db13792d Author: Jason Merrill <jason@redhat.com> Date: Thu Feb 25 16:47:53 2021 -0500 c++: Fix class NTTP constness handling [PR98810] Here, when substituting still-dependent args into an alias template, we see a non-const type because the default argument is non-const, and is not a template parm object because it's still dependent. gcc/cp/ChangeLog: PR c++/98810 * pt.c (tsubst_copy) [VIEW_CONVERT_EXPR]: Add const to a class non-type template argument that needs it. gcc/testsuite/ChangeLog: PR c++/98810 * g++.dg/cpp2a/nontype-class-defarg1.C: New test.
The releases/gcc-9 branch has been updated by Jason Merrill <jason@gcc.gnu.org>: https://gcc.gnu.org/g:89896df2cbfa52940c81858d9c4111633b533d25 commit r9-9265-g89896df2cbfa52940c81858d9c4111633b533d25 Author: Jason Merrill <jason@redhat.com> Date: Thu Feb 25 16:47:53 2021 -0500 c++: Fix class NTTP constness handling [PR98810] Here, when substituting still-dependent args into an alias template, we see a non-const type because the default argument is non-const, and is not a template parm object because it's still dependent. gcc/cp/ChangeLog: PR c++/98810 * pt.c (tsubst_copy) [VIEW_CONVERT_EXPR]: Add const to a class non-type template argument that needs it. gcc/testsuite/ChangeLog: PR c++/98810 * g++.dg/cpp2a/nontype-class-defarg1.C: New test.
Hi, the backport in gcc-9 branch is causing errors: ERROR: g++.dg/cpp2a/nontype-class-defarg1.C -std=c++14: syntax error in target selector "target c++20" for " dg-do 2 compile { target c++20 } "
It probably needs target c++2a instead.
Fixed for 9.4/10.3/11.