The following code does not compile in GCC trunk: ----- template <typename T> inline constexpr char test_impl = 0; template <typename T> inline constexpr auto *id = &test_impl<T>; int main() { static_assert(id<int> != id<float>, "should not be equal"); } ----- The error message: ----- <source>: In function 'int main()': <source>:8:27: error: non-constant condition for static assertion 8 | static_assert(id<int> != id<float>, "should not be equal"); | ~~~~~~~~^~~~~~~~~~~~ <source>:8:27: error: '((& test_impl<int>) != (& test_impl<float>))' is not a constant expression Compiler returned: 1 ----- See on godbolt: https://godbolt.org/z/CS4D8B Clang and MSVC accept the code.
Confirmed, ale GCC versions suffer.
Reduced testcase: template <int> char test_impl = 0; static_assert(&test_impl<0> != &test_impl<1>, "should not be equal");
*** Bug 102267 has been marked as a duplicate of this bug. ***
Dup of bug 91693. *** This bug has been marked as a duplicate of bug 91693 ***
The master branch has been updated by Jakub Jelinek <jakub@gcc.gnu.org>: https://gcc.gnu.org/g:91031bffa42fdea3c985727d042cd1882a64be9c commit r12-6188-g91031bffa42fdea3c985727d042cd1882a64be9c Author: Jakub Jelinek <jakub@redhat.com> Date: Mon Jan 3 13:47:53 2022 +0100 symtab: Fold &a == &b to 0 if folding_initializer [PR94716] On Thu, Dec 09, 2021 at 06:09:12PM -0500, Jason Merrill wrote: > For the more general comparison of decls like your a != b example above I > think clang is in the right; in manifestly constant-evaluated context > (folding_initializer) we should return that they are unequal and prevent a > later alias declaration, like we do for comparison to 0 in > maybe_nonzero_address. It's possible that this gives a wrong answer based > on something in another translation unit, but that's unlikely, and taking > that chance seems better than rejecting code that needs a constant answer. I agree. This is an incremental patch to do that. 2022-01-03 Jakub Jelinek <jakub@redhat.com> PR c++/94716 gcc/ * symtab.c: Include fold-const.h. (symtab_node::equal_address_to): If folding_initializer is true, handle it like memory_accessed. Simplify. gcc/testsuite/ * gcc.dg/init-compare-1.c: New test. * g++.dg/cpp0x/constexpr-compare1.C: New test. * g++.dg/cpp1y/constexpr-94716.C: New test. * g++.dg/cpp1z/constexpr-compare1.C: New test.
*** Bug 101622 has been marked as a duplicate of this bug. ***
*** Bug 86354 has been marked as a duplicate of this bug. ***