Currently the restrictions on a default argument are checked with the visitor
CheckDefaultArgumentVisitor in ActOnParamDefaultArgument before
performing the conversion to the parameter type in SetParamDefaultArgument.
This was fine before the previous patch but now some valid code post-CWG 2346
is rejected:
void test() { const int i2 = 0; extern void h2a(int x = i2); // FIXME: ok, not odr-use extern void h2b(int x = i2 + 0); // ok, not odr-use }
This is because the reference to i2 in h2a has not been marked yet with NOUR_Constant.
i2 is marked NOUR_Constant when the conversion to the parameter type is done, which is
done just after.
The solution is to do the conversion to the parameter type before checking the restrictions on
default arguments with CheckDefaultArgumentVisitor. This has the side-benefit of improving
some diagnostics.