Hi,
this is almost obvious, I guess: Manuel kindly explained in the audit
trail of c++/56725 that if a permerror returns false no diagnostic was
actually emitted thus any accompanying inform should not be called,
otherwise with -fpermissive -w only the latter are wrongly emitted.
Tested x86_64-linux.
Thanks,
Paolo.
///////////////////////
2013-03-27 Paolo Carlini <paolo.carl...@oracle.com>
* call.c (joust): Don't call inform for a permerror returning false.
* parser.c (cp_parser_check_class_key): Likewise.
* pt.c (tsubst_copy_and_build): Likewise.
Index: call.c
===================================================================
--- call.c (revision 197184)
+++ call.c (working copy)
@@ -8650,13 +8650,15 @@ joust (struct z_candidate *cand1, struct z_candida
{
if (complain & tf_error)
{
- permerror (input_location,
- "default argument mismatch in "
- "overload resolution");
- inform (input_location,
- " candidate 1: %q+#F", cand1->fn);
- inform (input_location,
- " candidate 2: %q+#F", cand2->fn);
+ if (permerror (input_location,
+ "default argument mismatch in "
+ "overload resolution"))
+ {
+ inform (input_location,
+ " candidate 1: %q+#F", cand1->fn);
+ inform (input_location,
+ " candidate 2: %q+#F", cand2->fn);
+ }
}
else
return 0;
Index: parser.c
===================================================================
--- parser.c (revision 197184)
+++ parser.c (working copy)
@@ -23363,12 +23363,12 @@ cp_parser_check_class_key (enum tag_types class_ke
return;
if ((TREE_CODE (type) == UNION_TYPE) != (class_key == union_type))
{
- permerror (input_location, "%qs tag used in naming %q#T",
- class_key == union_type ? "union"
- : class_key == record_type ? "struct" : "class",
- type);
- inform (DECL_SOURCE_LOCATION (TYPE_NAME (type)),
- "%q#T was previously declared here", type);
+ if (permerror (input_location, "%qs tag used in naming %q#T",
+ class_key == union_type ? "union"
+ : class_key == record_type ? "struct" : "class",
+ type))
+ inform (DECL_SOURCE_LOCATION (TYPE_NAME (type)),
+ "%q#T was previously declared here", type);
}
}
Index: pt.c
===================================================================
--- pt.c (revision 197184)
+++ pt.c (working copy)
@@ -14019,30 +14019,32 @@ tsubst_copy_and_build (tree t,
fn = TREE_OPERAND (fn, 1);
if (is_overloaded_fn (fn))
fn = get_first_fn (fn);
- permerror (EXPR_LOC_OR_HERE (t),
- "%qD was not declared in this scope, "
- "and no declarations were found by "
- "argument-dependent lookup at the point "
- "of instantiation", function);
- if (!DECL_P (fn))
- /* Can't say anything more. */;
- else if (DECL_CLASS_SCOPE_P (fn))
+ if (permerror (EXPR_LOC_OR_HERE (t),
+ "%qD was not declared in this scope, "
+ "and no declarations were found by "
+ "argument-dependent lookup at the point "
+ "of instantiation", function))
{
- inform (EXPR_LOC_OR_HERE (t),
- "declarations in dependent base %qT are "
- "not found by unqualified lookup",
- DECL_CLASS_CONTEXT (fn));
- if (current_class_ptr)
- inform (EXPR_LOC_OR_HERE (t),
- "use %<this->%D%> instead", function);
+ if (!DECL_P (fn))
+ /* Can't say anything more. */;
+ else if (DECL_CLASS_SCOPE_P (fn))
+ {
+ inform (EXPR_LOC_OR_HERE (t),
+ "declarations in dependent base %qT are "
+ "not found by unqualified lookup",
+ DECL_CLASS_CONTEXT (fn));
+ if (current_class_ptr)
+ inform (EXPR_LOC_OR_HERE (t),
+ "use %<this->%D%> instead", function);
+ else
+ inform (EXPR_LOC_OR_HERE (t),
+ "use %<%T::%D%> instead",
+ current_class_name, function);
+ }
else
- inform (EXPR_LOC_OR_HERE (t),
- "use %<%T::%D%> instead",
- current_class_name, function);
+ inform (0, "%q+D declared here, later in the "
+ "translation unit", fn);
}
- else
- inform (0, "%q+D declared here, later in the "
- "translation unit", fn);
function = unq;
}
}