This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: C++ PATCH for c++/87567, constexpr rejects call to non-constexpr function


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]