Patchwork [C++] Fix some informs following permerror

login
register
mail settings
Submitter Paolo Carlini
Date March 28, 2013, 1:09 a.m.
Message ID <5153985B.4040105@oracle.com>
Download mbox | patch
Permalink /patch/231862/
State New
Headers show

Comments

Paolo Carlini - March 28, 2013, 1:09 a.m.
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.carlini@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.
Jason Merrill - March 28, 2013, 1:38 a.m.
OK.

Jason

Patch

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