OK.
On Wed, Jan 17, 2018 at 11:16 AM, Paolo Carlini <paolo.carl...@oracle.com> wrote: > Hi, > > On 17/01/2018 15:58, Jason Merrill wrote: >> >> On Tue, Jan 16, 2018 at 4:40 PM, Paolo Carlini <paolo.carl...@oracle.com> >> wrote: >>> >>> On 16/01/2018 22:35, Jason Merrill wrote: >>>> >>>> On Tue, Jan 16, 2018 at 3:32 PM, Paolo Carlini >>>> <paolo.carl...@oracle.com> >>>> wrote: >>>>> >>>>> thus I figured out what was badly wrong in my first try: I misread >>>>> ensure_literal_type_for_constexpr_object and missed that it can return >>>>> NULL_TREE without emitting an hard error. Thus my first try even caused >>>>> miscompilations :( Anyway, when DECL_DECLARED_CONSTEXPR_P is true we >>>>> are >>>>> safe and indeed we want to clear it as matter of error recovery. Then, >>>>> in >>>>> this safe case the only change in the below is returning early, thus >>>>> avoiding any internal inconsistencies later and also the redundant / >>>>> misleading diagnostic which I already mentioned. >>>> >>>> I can't see how this could be right. In the cases where we don't give >>>> an error (e.g. because we're dealing with an instantiation of a >>>> variable template) there is no error, so we need to proceed with the >>>> rest of cp_finish_decl as normal. >>> >>> The cases where we don't give an error all fall under >>> DECL_DECLARED_CONSTEXPR_P == false, thus aren't affected at all. >> >> Ah, true. Though that's a bit subtle; maybe change ensure_... to >> return error_mark_node in the error case? > > Agreed. The below does that and I'm finishing testing it (in libstdc++ at > the moment, so far so good and I checked separately for those nasty > breakages I had yesterday). Note, however, this isn't exactly equivalent to > my previous patch: it's definitely cleaner and less subtle IMO but more > aggressive because we immediately bail out of cp_finish_decl in all cases of > error, not just when DECL_DECLARED_CONSTEXPR_P == true. Ok if it passes? > > Thanks! > Paolo. > > //////////////////////// > >