https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83258
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- With this patch: --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -6259,7 +6259,8 @@ convert_nontype_argument_function (tree type, tree expr, } linkage = decl_linkage (fn_no_ptr); - if (cxx_dialect >= cxx11 ? linkage == lk_none : linkage != lk_external) + if ((cxx_dialect < cxx11 && linkage != lk_external) + || (cxx_dialect < cxx17 && linkage == lk_none)) { if (complain & tf_error) { We accept Barry's testcase in C++17 mode. I think we also need this for some non-type arguments without linkage: @@ -6979,7 +6980,8 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) /* DR 1155 allows internal linkage in C++11 and up. */ linkage_kind linkage = decl_linkage (expr); - if (linkage < (cxx_dialect >= cxx11 ? lk_internal : lk_external)) + if ((cxx_dialect < cxx11 && linkage < lk_external) + || (cxx_dialect < cxx17 && linkage < lk_internal)) { if (complain & tf_error) error ("%qE is not a valid template argument for type %qT " but that second change causes a new ice-on-invalid for this in C++17 mode (but seems to correctly compile it when VALID is defined): template <typename T, const T &val> struct TestClass { TestClass() : _val(val) { } T _val; }; extern constexpr float e = 2.72; // external linkage static constexpr float pi = 3.14; // internal linkage int main() { #ifdef VALID static #endif constexpr float one = 1; // no linkage TestClass<float, e> test1; TestClass<float, pi> test2; TestClass<float, one> test3; } linkage.cc: In constructor 'TestClass<T, val>::TestClass() [with T = float; const T& val = one]': linkage.cc:3:3: error: Local declaration from a different function TestClass() : _val(val) { } ^~~~~~~~~ one linkage.cc:3:25: note: in statement TestClass() : _val(val) { } ^ one.2_1 = one; during GIMPLE pass: cfg linkage.cc:3:3: internal compiler error: verify_gimple failed TestClass() : _val(val) { } ^~~~~~~~~ 0xdfad0d verify_gimple_in_cfg(function*, bool) /home/jwakely/src/gcc/gcc/gcc/tree-cfg.c:5579 0xcc6956 execute_function_todo /home/jwakely/src/gcc/gcc/gcc/passes.c:1994 0xcc79d2 execute_todo /home/jwakely/src/gcc/gcc/gcc/passes.c:2048 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.