https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92576
Bug ID: 92576 Summary: Definition of variable template without initializer is treated as declaration Product: gcc Version: 10.0 Status: UNCONFIRMED Keywords: accepts-invalid Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- GCC accepts this as a declaration followed by a definition, but it should be two definitions (with the first being ill-formed): template<typename T> constexpr bool var; template<typename T> constexpr bool var = false; Clang says: inline.cc:1:37: error: default initialization of an object of const type 'const bool' template<typename T> constexpr bool var; ^ = false inline.cc:2:37: error: redefinition of 'var' template<typename T> constexpr bool var = false; ^ inline.cc:1:37: note: previous definition is here template<typename T> constexpr bool var; ^ 2 errors generated. EDG says: "inline.cc", line 1: error: missing initializer for constexpr variable template<typename T> constexpr bool var; ^ "inline.cc", line 2: error: variable template "var" has already been defined template<typename T> constexpr bool var = false; ^ "inline.cc", line 2: error: "constexpr" is not valid here template<typename T> constexpr bool var = false; ^ 3 errors detected in the compilation of "inline.cc". MSVC says: example.cpp <source>(1): error C2737: 'var': 'constexpr' object must be initialized <source>(2): error C2086: 'const bool var': redefinition <source>(1): note: see declaration of 'var' Compiler returned: 2 I think 'extern' is needed to stop the first line being a definition: template<typename T> extern constexpr bool var; template<typename T> constexpr bool var = false; G++ correctly rejects it for a non-template inline variable: constexpr bool var; constexpr bool var = false; inline.cc:1:16: error: uninitialized const ‘var’ [-fpermissive] constexpr bool var; ^~~ inline.cc:2:16: error: redefinition of ‘constexpr const bool var’ constexpr bool var = false; ^~~ inline.cc:1:16: note: ‘constexpr const bool var’ previously declared here constexpr bool var; ^~~