[Bug c++/96497] Compare std::variant with int using C++20 <=> is not a constant expression

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Aug 25 17:45:07 GMT 2020


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96497

--- Comment #5 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-10 branch has been updated by Jakub Jelinek
<jakub@gcc.gnu.org>:

https://gcc.gnu.org/g:aaac798d29acb61ab510c6106d10fc641becfcb7

commit r10-8664-gaaac798d29acb61ab510c6106d10fc641becfcb7
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Mon Aug 10 17:53:46 2020 +0200

    c++: Fix constexpr evaluation of SPACESHIP_EXPR [PR96497]

    The following valid testcase is rejected, because
cxx_eval_binary_expression
    is called on the SPACESHIP_EXPR with lval = true, as the address of the
    spaceship needs to be passed to a method call.
    After recursing on the operands and calling genericize_spaceship which
turns
    it into a TARGET_EXPR with initialization, we call
cxx_eval_constant_expression
    on it which succeeds, but then we fall through into code that will
    VERIFY_CONSTANT (r) which FAILs because it is an address of a variable. 
Rather
    than avoiding that for lval = true and SPACESHIP_EXPR, the patch just tail
    calls cxx_eval_constant_expression - I believe that call should perform all
    the needed verifications.

    2020-08-10  Jakub Jelinek  <jakub@redhat.com>

            PR c++/96497
            * constexpr.c (cxx_eval_binary_expression): For SPACESHIP_EXPR,
tail
            call cxx_eval_constant_expression after genericize_spaceship to
avoid
            undesirable further VERIFY_CONSTANT.

            * g++.dg/cpp2a/spaceship-constexpr3.C: New test.

    (cherry picked from commit 5c64df80df274c753bfc8415bd902e1180e76f6a)


More information about the Gcc-bugs mailing list