Re: [PATCH] c++, contracts: Only defer contracts that use an undeduced result binding [PR125537]
Wang Jinghao <[email protected]>
| Newsgroups | gmane.comp.gcc.patches |
|---|---|
| Message-ID | <[email protected]> |
On 2026/8/19 14:46, Iain Sandoe wrote: > Hi Folks, > >> On 19 Aug 2026, at 00:33, Wang Jinghao <[email protected]> wrote: >> >> Hi Jason, >> >> Thanks for the review. >> >> On Tue, Aug 18, 2026 at 3:39 AM Jason Merrill <[email protected]> wrote: >>> >>> On 8/14/26 4:33 PM, Wang Jinghao wrote: >>>> For precondition and postcondition without a result binding, whether >>>> the return type is auto is irrelevant to the condition expression, so >>>> type conversions should be completed immediately. >>>> >>>> PR c++/125537 >>>> >>>> gcc/cp/ChangeLog: >>>> >>>> * pt.cc (tsubst_contract): Keep template processing enabled >>>> only for postconditions with an undeduced result binding. >>> >>> Hmm, I notice this is still a different condition from >>> cp_parser_late_contract_condition and rebuild_postconditions, which only >>> check whether there's a result binding, not whether it's auto. They >>> ought to agree on the condition for treating the postcondition as a >>> pseudo-template. >> >> If we also make the condition in cp_parser_late_contract_condition >> consistent, we could even remove its call to rebuild_postconditions, since >> the known-type path would no longer create pseudo-templates that require >> this compensating step. > > During the implementation, we discussed uniformly deferring contract parsing > (but did not manage to implement it during that phase of the work), > > I think that there are two places that cannot avoid it (lambdas and contracts on > functions with auto return). > > We also took on the (ab)use of the substitution code to deal with postcondition > placeholders (from the cxxa2 implementation) without fully appreciating the > consequences: The tsubst code is not really designed to operate without a > current function decl and there is some sleight-of-hand done to make the > postcondition placeholder a PARM_DECL instead of a VAR_DECL to make use > of some special rules that apply to PARM_DELCs; unfortunately those special > rules also contradict some cases that entities are allowed to be visible to the > contract - and I was getting concerned that we were growing more and more > special cases gated on “processing contract condition" We already have > a deferred parse in the class processing (which itself also produces some > issues when we have in-class redeclared friends). > > So, I drafted a patch that defers parsing of contract conditions uniformly but > unfortunately, I don’t have cycles to do much re-work at present … I do keep > it rebased onto trunk - and it is here (in case either of you wants to look at > the tradeoff between approaches). I think that, although its an initial step > it would simplify things going forward. > > https://github.com/iains/gcc-git/tree/master-wip-contracts-deferred-parses > > or > > https://forge.sourceware.org/iains/gcc-TEST/src/branch/master-wip-contracts-deferred-parses > > thanks > Iain > > P.S. Here is a branch that re-works the postcondition placeholder to be a VAR_DECL > which helps with fixing some of the visibility constraints > > https://github.com/iains/gcc-git/tree/master-wip-contracts-postcond-rework > > https://forge.sourceware.org/iains/gcc-TEST/src/branch/master-wip-contracts-postcond-rework > Hi Iain, I’d be happy to help. I implemented a few patches, but reworking this to use deferred parsing uniformly is clearly the better approach. Maybe some of my patches can still be useful :D Regards Jinghao