c++: Avoid informs without a warning [PR109278]
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. 2023-03-30 Jakub Jelinek <jakub@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. * g++.dg/cpp23/ext-floating15.C: New test.
This commit is contained in:
parent
a7df3bea9c
commit
ee6ae8cb47
2 changed files with 23 additions and 8 deletions
|
@ -8296,7 +8296,7 @@ convert_like_internal (conversion *convs, tree expr, tree fn, int argnum,
|
|||
|| SCALAR_TYPE_P (totype))
|
||||
&& convs->kind != ck_base)
|
||||
{
|
||||
bool complained = false;
|
||||
int complained = 0;
|
||||
conversion *t = convs;
|
||||
|
||||
/* Give a helpful error if this is bad because of excess braces. */
|
||||
|
@ -8328,14 +8328,18 @@ convert_like_internal (conversion *convs, tree expr, tree fn, int argnum,
|
|||
totype))
|
||||
{
|
||||
case 2:
|
||||
pedwarn (loc, 0, "converting to %qH from %qI with greater "
|
||||
"conversion rank", totype, TREE_TYPE (expr));
|
||||
complained = true;
|
||||
if (pedwarn (loc, 0, "converting to %qH from %qI with greater "
|
||||
"conversion rank", totype, TREE_TYPE (expr)))
|
||||
complained = 1;
|
||||
else if (!complained)
|
||||
complained = -1;
|
||||
break;
|
||||
case 3:
|
||||
pedwarn (loc, 0, "converting to %qH from %qI with unordered "
|
||||
"conversion ranks", totype, TREE_TYPE (expr));
|
||||
complained = true;
|
||||
if (pedwarn (loc, 0, "converting to %qH from %qI with unordered "
|
||||
"conversion ranks", totype, TREE_TYPE (expr)))
|
||||
complained = 1;
|
||||
else if (!complained)
|
||||
complained = -1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -8389,7 +8393,7 @@ convert_like_internal (conversion *convs, tree expr, tree fn, int argnum,
|
|||
"invalid conversion from %qH to %qI",
|
||||
TREE_TYPE (expr), totype);
|
||||
}
|
||||
if (complained)
|
||||
if (complained == 1)
|
||||
maybe_inform_about_fndecl_for_bogus_argument_init (fn, argnum);
|
||||
|
||||
return cp_convert (totype, expr, complain);
|
||||
|
|
11
gcc/testsuite/g++.dg/cpp23/ext-floating15.C
Normal file
11
gcc/testsuite/g++.dg/cpp23/ext-floating15.C
Normal file
|
@ -0,0 +1,11 @@
|
|||
// PR c++/109278
|
||||
// { dg-do compile { target float128 } }
|
||||
// { dg-options "-w" }
|
||||
|
||||
void foo (long double); // { dg-bogus "initializing argument 1 of" }
|
||||
|
||||
void
|
||||
bar (_Float128 x)
|
||||
{
|
||||
foo (x);
|
||||
}
|
Loading…
Add table
Reference in a new issue