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

--- Comment #6 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Marek Polacek <mpola...@gcc.gnu.org>:

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

commit r13-6525-ge09bc034d1b4d692b409fa5af52ae34480a6f4dc
Author: Marek Polacek <pola...@redhat.com>
Date:   Fri Mar 3 11:24:24 2023 -0500

    c++: error with constexpr operator() [PR107939]

    Similarly to PR107938, this also started with r11-557, whereby
cp_finish_decl
    can call check_initializer even in a template for a constexpr initializer.

    Here we are rejecting

      extern const Q q;

      template<int>
      constexpr auto p = q(0);

    even though q has a constexpr operator().  It's deemed non-const by
    decl_maybe_constant_var_p because even though 'q' is const it is not
    of integral/enum type.

    If fun is not a function pointer, we don't know if we're using it as an
    lvalue or rvalue, so with this patch we pass 'any' for want_rval.  With
    that, p_c_e/VAR_DECL doesn't flat out reject the underlying VAR_DECL.

            PR c++/107939

    gcc/cp/ChangeLog:

            * constexpr.cc (potential_constant_expression_1) <case CALL_EXPR>:
Pass
            'any' when recursing on a VAR_DECL and not a pointer to function.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp1y/var-templ74.C: Remove dg-error.
            * g++.dg/cpp1y/var-templ77.C: New test.

Reply via email to