On Fri, Aug 09, 2024 at 11:03:24AM +1000, Nathaniel Shead wrote: > On Thu, Aug 08, 2024 at 03:16:24PM -0400, Marek Polacek wrote: > > On Thu, Aug 08, 2024 at 09:13:05AM +1000, Nathaniel Shead wrote: > > > diff --git a/gcc/cp/error.cc b/gcc/cp/error.cc > > > index 6c22ff55b46..03c19e4a7e4 100644 > > > --- a/gcc/cp/error.cc > > > +++ b/gcc/cp/error.cc > > > @@ -4782,12 +4782,14 @@ qualified_name_lookup_error (tree scope, tree > > > name, > > > scope); > > > else if (TREE_CODE (decl) == TREE_LIST) > > > { > > > + auto_diagnostic_group d; > > > error_at (location, "reference to %<%T::%D%> is ambiguous", > > > scope, name); > > > print_candidates (decl); > > > } > > > else > > > { > > > + auto_diagnostic_group d; > > > name_hint hint; > > > if (SCOPED_ENUM_P (scope) && TREE_CODE (name) == IDENTIFIER_NODE) > > > hint = suggest_alternative_in_scoped_enum (name, scope); > > > > I don't see why we need the second a_d_d here. > > > > The 'suggest_alternative_in_scoped_enum' call can register an 'inform' > to be called in 'name_hint's destructor, specifically contained within > name_hint::m_deferred (a deferred_diagnostic). > > Most other uses of 'name_hint' that I could find seemed to be correctly > grouped already.
Ah okay. > > > @@ -3534,6 +3536,7 @@ finish_class_member_access_expr (cp_expr object, > > > tree name, bool template_p, > > > else > > > { > > > /* Look up the member. */ > > > + auto_diagnostic_group d; > > > access_failure_info afi; > > > if (processing_template_decl) > > > /* Even though this class member access expression is at this > > > > I don't quite see why we need it here, either. > > > > A little later on in this block there's afi.maybe_suggest_accessor, > which emits an 'inform' with a fixit suggesting how to access the > member, which I feel should probably be part of the same group as the > error emitted from the 'lookup_member' call. Interesting. > But I suppose this should be grouped more clearly, e.g. > > --- a/gcc/cp/typeck.cc > +++ b/gcc/cp/typeck.cc > @@ -3534,7 +3536,6 @@ finish_class_member_access_expr (cp_expr object, tree > name, bool template_p, > else > { > /* Look up the member. */ > - access_failure_info afi; > if (processing_template_decl) > /* Even though this class member access expression is at this > point not dependent, the member itself may be dependent, and > @@ -3543,12 +3544,18 @@ finish_class_member_access_expr (cp_expr object, tree > name, bool template_p, > ahead of time here; we're going to redo this member lookup at > instantiation time anyway. */ > push_deferring_access_checks (dk_no_check); > - member = lookup_member (access_path, name, /*protect=*/1, > - /*want_type=*/false, complain, > - &afi); > - if (processing_template_decl) > - pop_deferring_access_checks (); > - afi.maybe_suggest_accessor (TYPE_READONLY (object_type)); > + > + { > + auto_diagnostic_group d; > + access_failure_info afi; > + member = lookup_member (access_path, name, /*protect=*/1, > + /*want_type=*/false, complain, > + &afi); > + if (processing_template_decl) > + pop_deferring_access_checks (); > + afi.maybe_suggest_accessor (TYPE_READONLY (object_type)); > + } > + > if (member == NULL_TREE) > { > if (dependentish_scope_p (object_type)) > > > > @@ -10384,6 +10401,8 @@ convert_for_assignment (tree type, tree rhs, > > > { > > > if (complain & tf_error) > > > { > > > + auto_diagnostic_group d; > > > + > > > /* If the right-hand side has unknown type, then it is an > > > overloaded function. Call instantiate_type to get error > > > messages. */ > > > @@ -10406,7 +10425,6 @@ convert_for_assignment (tree type, tree rhs, > > > (rhs_loc, > > > has_loc ? &label : NULL, > > > has_loc ? highlight_colors::percent_h : NULL); > > > - auto_diagnostic_group d; > > > > Oh I see, it was supposed to be in the outer block. OK. > > > > The patch looks good to me, thanks. > > > > Marek > > > > Thanks, I'll wait for final approval from someone for once I've finished > bootstrap+regtest with the above adjustment. Nice. Thanks for cleaning this up! Marek