On 12/31/2015 11:04 AM, Nathan Sidwell wrote:
Jason,
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58583
It's noticed that the testcase passes with enable-checking build but
fails with enable-checking=release. Looking at what is happening, I
think the checking build is changing the instantiation point of a template.
The failure manifests in this snippet:
template<int> struct A // { dg-error "has been parsed" }
{
int i = (A<0>(), 0); // { dg-error "has been parsed" }
};
with a checking build we get the two diagnostics. That's due to the
following bit of build_non_dependent_expr (pt.c)
/* Try to get a constant value for all non-dependent expressions in
order to expose bugs in *_dependent_expression_p and constexpr. */
if (flag_checking && cxx_dialect >= cxx11)
fold_non_dependent_expr (expr);
Notice the 'flag_checking' check. It's trying to fold the functional
cast 'A<0> ()'. That is a non-dependent expression, because 'A<0>' is
non-dependent (no no bug in *_D_E_p). The instantiation fails though,
because we want the default ctor, but that requires a completed NSDMI.
Requiring an instantiation (for instance, declaring a global var of
type 'A<0>') causes the release build to issue a 'recursive
instantiation' diagnostic (on the NSDMI line). I suppose I can add
dg-bogus and/or xfails to get the testcase to not fail on either build,
but the change in instantiation point worries me.
thoughts?
Maybe disable the fold if parsing_nsdmi()?
Jason