https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91693
Bug ID: 91693 Summary: Comparing addresses of templated inline vars gets bogus "not a constant expression" error Product: gcc Version: 9.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: jorg.brown at gmail dot com Target Milestone: --- This code works just fine: inline int inline1 = 0; inline int inline2 = 0; static_assert(&inline1 == &inline1); static_assert(&inline1 != &inline2); But this code doesn't: template<typename T> inline int NullT = 0; struct A1; struct A2; static_assert(&NullT<A1> == &NullT<A1>); static_assert(&NullT<A1> != &NullT<A2>); Specifically, it produces this incorrect error: <source>:13:26: error: non-constant condition for static assertion 13 | static_assert(&NullT<A1> != &NullT<A2>); | ~~~~~~~~~~~^~~~~~~~~~~~~ <source>:13:26: error: '((& NullT<A1>) != (& NullT<A2>))' is not a constant expression = = = Problem reproduces in gcc 7.1 through 9.2; this code works in clang (tested as far back as 5.0) as well as MSVC (tested as far back as v19.14) See https://godbolt.org/z/njyH5d