https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105436
--- Comment #2 from Marek Polacek <mpolacek at gcc dot gnu.org> --- The C++14 vs C++17 difference is due to: /* It must be a non-type argument. In C++17 any constant-expression is allowed. */ if (cxx_dialect > cxx14) goto general_expr; in cp_parser_template_argument. So in C++14 we get "N" as the targ but in C++17 it is the whole "N >= 5" expression.