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?
nathan