https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92576
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org, | |jason at gcc dot gnu.org, | |mpolacek at gcc dot gnu.org --- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- I think there are multiple issues. One is the lack of diagnostic for missing initializer. I've tried to do: --- gcc/cp/decl.c.jj 2019-11-16 18:13:28.806818043 +0100 +++ gcc/cp/decl.c 2019-11-19 11:13:03.058266394 +0100 @@ -7500,11 +7500,12 @@ cp_finish_decl (tree decl, tree init, bo error ("variable concept has no initializer"); init = boolean_true_node; } - else if (init - && init_const_expr_p - && !TYPE_REF_P (type) - && decl_maybe_constant_var_p (decl) - && !(dep_init = value_dependent_init_p (init))) + else if ((init + && init_const_expr_p + && !TYPE_REF_P (type) + && decl_maybe_constant_var_p (decl) + && !(dep_init = value_dependent_init_p (init))) + || (!init && !DECL_EXTERNAL (decl))) { /* This variable seems to be a non-dependent constant, so process its initializer. If check_initializer returns non-null the but that resulted in FAIL: g++.dg/cpp2a/concepts-friend3.C -std=c++17 -fconcepts (test for excess errors) FAIL: g++.dg/other/crash-9.C -std=c++17 -fconcepts (test for excess errors) FAIL: g++.dg/eh/pr84968.C -std=gnu++11 (test for errors, line 12) FAIL: g++.dg/eh/pr84968.C -std=gnu++11 (test for excess errors) FAIL: g++.dg/eh/pr84968.C -std=gnu++14 (test for errors, line 12) FAIL: g++.dg/eh/pr84968.C -std=gnu++14 (test for excess errors) FAIL: g++.dg/eh/pr84968.C -std=gnu++17 (test for errors, line 12) FAIL: g++.dg/eh/pr84968.C -std=gnu++17 (test for excess errors) FAIL: g++.dg/eh/pr84968.C -std=gnu++2a (test for errors, line 12) FAIL: g++.dg/eh/pr84968.C -std=gnu++2a (test for excess errors) FAIL: g++.dg/eh/pr84968.C -std=gnu++17 -fconcepts (test for errors, line 12) FAIL: g++.dg/eh/pr84968.C -std=gnu++17 -fconcepts (test for excess errors) FAIL: g++.dg/cpp2a/consteval14.C (internal compiler error) FAIL: g++.dg/cpp2a/consteval14.C (test for excess errors) FAIL: g++.dg/cpp1y/pr68578.C -std=c++14 (test for excess errors) FAIL: g++.dg/cpp1y/pr68578.C -std=c++17 (test for excess errors) FAIL: g++.dg/cpp1y/pr68578.C -std=c++2a (test for excess errors) FAIL: g++.dg/cpp1y/pr68578.C -std=c++17 -fconcepts (test for excess errors) so maybe we'll need something more similar to the present: if (!VAR_P (decl) || type_dependent_p) /* We can't do anything if the decl has dependent type. */; else if (!init && is_concept_var (decl)) { error ("variable concept has no initializer"); init = boolean_true_node; } and for !init do parts of grok_reference_init if TYPE_REF_P or call check_for_uninitialized_const_var. Another thing is we don't diagnose redefinitions, like: template <int N> constexpr bool a = false; template <int N> constexpr bool a = true; //auto b = a<2>;