This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: C++ PATCH for c++/87567, constexpr rejects call to non-constexpr function
- From: Marek Polacek <polacek at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>
- Cc: gcc-patches List <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 10 Oct 2018 17:06:48 -0400
- Subject: Re: C++ PATCH for c++/87567, constexpr rejects call to non-constexpr function
- References: <20181010155850.GD19003@redhat.com> <CADzB+2mKT=jgkgNEXhQQ0feTCFjm+EwJvZEXgwxcdhR8BZJNgQ@mail.gmail.com>
On Wed, Oct 10, 2018 at 03:48:34PM -0400, Jason Merrill wrote:
> On Wed, Oct 10, 2018 at 11:58 AM Marek Polacek <polacek@redhat.com> wrote:
> >
> > In this testcase, the call to f() can never be a constant expression, but
> > that's not a problem because it is never reached. We handle a similar scenario
> > for IF_STMT, so we can just do the same. The RANGE_FOR_STMT case seems to
> > never be reached in the whole testsuite, so I didn't change that.
>
> That seems like a hole in the testsuite. How about this?
>
> constexpr int
> fn3()
> {
> struct empty_range {
> constexpr int* begin() { return 0; }
> constexpr int* end() { return 0; }
> } e;
> for (auto x : e)
> f();
> return 0;
> }
>
> The patch is OK; you can address fn3 in a follow-up patch.
Thanks. fn3() still only triggers case FOR_STMT, because RANGE_FOR_STMT are
only created in templates, and are converted to FOR_STMTs in tsubst_expr.
But I've now found a testcase that triggers the RANGE_FOR_STMT case:
int f() { return 1; }
template<typename>
constexpr void
fn4 ()
{
struct empty_range {
constexpr int* begin() { return 0; }
constexpr int* end() { return 0; }
} e;
constexpr int j = ({ for (auto x : e) f(); 1; });
}
void
fn5 ()
{
fn4<int>();
}
However, we fail to compile both fn3 and fn4, because we're unable to evaluate
__for_begin != __for_end. I'm going to try to figure out why.
Marek