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

Reply via email to