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;
                  }
              }

Reply via email to