On Wed, Mar 29, 2023 at 04:35:15PM -0400, Jason Merrill wrote: > > On the following testcase we emit notes in > > maybe_inform_about_fndecl_for_bogus_argument_init > > despite no warning/error being printed before it. > > This is for the extended floating point type conversions where pedwarn > > is used, and complained is used there for 2 different purposes, > > one is whether an unspecific error should be emitted if we haven't > > complained otherwise, and one whether > > maybe_inform_about_fndecl_for_bogus_argument_init should be called. > > For the 2 pedwarns, currently it sets complained to true regardless of > > whether pedwarn succeeded, which results in the undesirable notes printed > > with -w. If complained is initialized to result of pedwarn, we would > > emit an error later on. > > > > So, the following patch makes complained a tristate, the additional > > error isn't printed if complained != 0, and > > maybe_inform_about_fndecl_for_bogus_argument_init is called only if > > complained == 1, so if pedwarn returns false, we can use complained = -1 > > to tell later code not to emit an error and not to call > > maybe_inform_about_fndecl_for_bogus_argument_init. > > > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > > > 2023-03-25 Jakub Jelinek <ja...@redhat.com> > > > > PR c++/109278 > > * call.cc (convert_like_internal): If pedwarn for extended float > > type conversions doesn't report anything, avoid calling > > maybe_inform_about_fndecl_for_bogus_argument_init. > > I think we want the same handling for all the complained = permerror cases > as well.
I think it isn't really needed in those cases. If I have say: int foo (int); int a = foo ({ { 1 } }); int bar (bool); decltype (nullptr) n; int b = bar (n); and compile with -fpermissive -w (which is I think the only way how to get permerror return false), then it will later reach that: if (!complained && expr != error_mark_node) { range_label_for_type_mismatch label (TREE_TYPE (expr), totype); gcc_rich_location richloc (loc, &label); complained = permerror (&richloc, "invalid conversion from %qH to %qI", TREE_TYPE (expr), totype); } if (complained) maybe_inform_about_fndecl_for_bogus_argument_init (fn, argnum); in current trunk or complained == 1 in the latter condition with the patch. !complained is true, so it will call permerror, but because of -fpermissive -w neither that permerror will emit anything and will set complained to false, so maybe_inform_about_fndecl_for_bogus_argument_init is not called. If I compile the above just with -fpermissive, it prints the 2 warnings and 2 informs, if without -fpermissive, it prints the 2 errors and 2 informs. If you want, I can add the above snippet as 3 testcases (normal, -fpermissive and -fpermissive -w). Jakub