Patchwork [C++] PR 56725

login
register
mail settings
Submitter Paolo Carlini
Date March 28, 2013, 2:10 p.m.
Message ID <51544F38.9000902@oracle.com>
Download mbox | patch
Permalink /patch/232035/
State New
Headers show

Comments

Paolo Carlini - March 28, 2013, 2:10 p.m.
Hi,

in this PR Tom noticed that we are producing weird extra initial spaces 
in some error messages and Manuel replied that in fact those messages 
should rather be inform. Per Manuel suggestion, I therefore adjusted 
call.c in that sense but then noticed that eg, across rv1n.C, we were 
producing inconsistent diagnostics, only the errors toward the end of 
the file transformed to inform. I changed therefore 
convert_for_initialization too, and that led to the consistent behavior 
I was looking for (clang behaves very similarly, by the way).

One last point. In convert_like_real we have now:


       /* Call build_user_type_conversion again for the error.  */
       build_user_type_conversion (totype, convs->u.expr, LOOKUP_NORMAL,
                       complain);
       if (fn)
         inform (input_location, "initializing argument %P of %q+D",
             argnum, fn);

(we used to have an unconditional additional error). I suppose that's 
fine. But if there is the risk that build_user_type_conversion only 
produces permerrors, I suppose I have to add the slightly ugly mechanism 
used in convert_for_initialization, saving and reading the counters 
around the call.

Tested x86_654-linux.

Thanks,
Paolo.

//////////////////////////////
/cp
2013-03-28  Paolo Carlini  <paolo.carlini@oracle.com>
	    Manuel Lopez-Ibanez  <manu@gcc.gnu.org>

	PR c++/56725
	* call.c (convert_like_real): Change series of two permerrors
	to permerror + inform (and likewise for two errors).
	(build_new_method_call_1): Likewise.
	* typeck.c (convert_for_initialization): Change additional
	warning or error to inform.

/testsuite
2013-03-28  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/56725
	* g++.dg/conversion/op4.C: Adjust.
	* g++.dg/cpp0x/rv1n.C: Likewise.
	* g++.dg/cpp0x/rv2n.C: Likewise.
	* g++.dg/cpp0x/template_deduction.C: Likewise.
	* g++.dg/expr/cond8.C: Likewise.
	* g++.dg/other/error4.C: Likewise.
	* g++.old-deja/g++.bugs/900514_03.C: Likewise.
	* g++.old-deja/g++.bugs/900519_02.C: Likewise.
	* g++.old-deja/g++.bugs/900519_03.C: Likewise.
	* g++.old-deja/g++.bugs/900520_02.C: Likewise.
	* g++.old-deja/g++.jason/conversion2.C: Likewise.
	* g++.old-deja/g++.law/cvt20.C: Likewise.
	* g++.old-deja/g++.law/cvt8.C: Likewise.
	* g++.old-deja/g++.law/init8.C: Likewise.
	* g++.old-deja/g++.mike/net12.C: Likewise.
	* g++.old-deja/g++.mike/net8.C: Likewise.
	* g++.old-deja/g++.mike/p2793.C: Likewise.
	* g++.old-deja/g++.mike/p3836.C: Likewise.
	* g++.old-deja/g++.mike/p418.C: Likewise.
	* g++.old-deja/g++.mike/p701.C: Likewise.
	* g++.old-deja/g++.mike/p807.C: Likewise.

Patch

Index: cp/call.c
===================================================================
--- cp/call.c	(revision 197190)
+++ cp/call.c	(working copy)
@@ -5836,11 +5836,11 @@  convert_like_real (conversion *convs, tree expr, t
 	    break;
 	}
 
-      permerror (loc, "invalid conversion from %qT to %qT",
-		 TREE_TYPE (expr), totype);
-      if (fn)
-	permerror (DECL_SOURCE_LOCATION (fn),
-		   "  initializing argument %P of %qD", argnum, fn);
+      if (permerror (loc, "invalid conversion from %qT to %qT",
+		     TREE_TYPE (expr), totype)
+	  && fn)
+	inform (DECL_SOURCE_LOCATION (fn),
+		"initializing argument %P of %qD", argnum, fn);
 
       return cp_convert (totype, expr, complain);
     }
@@ -5943,7 +5943,8 @@  convert_like_real (conversion *convs, tree expr, t
 	  build_user_type_conversion (totype, convs->u.expr, LOOKUP_NORMAL,
 				      complain);
 	  if (fn)
-	    error ("  initializing argument %P of %q+D", argnum, fn);
+	    inform (input_location, "initializing argument %P of %q+D",
+		    argnum, fn);
 	}
       return error_mark_node;
 
@@ -6074,7 +6075,7 @@  convert_like_real (conversion *convs, tree expr, t
 	    error_at (loc, "cannot bind %qT lvalue to %qT",
 		      TREE_TYPE (expr), totype);
 	    if (fn)
-	      error ("  initializing argument %P of %q+D", argnum, fn);
+	      inform (loc, "initializing argument %P of %q+D", argnum, fn);
 	    return error_mark_node;
 	  }
 
@@ -7467,11 +7468,11 @@  build_new_method_call_1 (tree instance, tree fns,
       if (! (complain & tf_error))
 	return error_mark_node;
 
-      permerror (input_location,
-		 "cannot call constructor %<%T::%D%> directly",
-		 basetype, name);
-      permerror (input_location, "  for a function-style cast, remove the "
-		 "redundant %<::%D%>", name);
+      if (permerror (input_location,
+		     "cannot call constructor %<%T::%D%> directly",
+		     basetype, name))
+	inform (input_location, "for a function-style cast, remove the "
+		"redundant %<::%D%>", name);
       call = build_functional_cast (basetype, build_tree_list_vec (user_args),
 				    complain);
       return call;
Index: cp/typeck.c
===================================================================
--- cp/typeck.c	(revision 197190)
+++ cp/typeck.c	(working copy)
@@ -7984,13 +7984,12 @@  convert_for_initialization (tree exp, tree type, t
       if (fndecl)
 	savew = warningcount + werrorcount, savee = errorcount;
       rhs = initialize_reference (type, rhs, flags, complain);
-      if (fndecl)
-	{
-	  if (warningcount + werrorcount > savew)
-	    warning (0, "in passing argument %P of %q+D", parmnum, fndecl);
-	  else if (errorcount > savee)
-	    error ("in passing argument %P of %q+D", parmnum, fndecl);
-	}
+
+      if (fndecl
+	  && (warningcount + werrorcount > savew || errorcount > savee))
+	inform (input_location,
+		"in passing argument %P of %q+D", parmnum, fndecl);
+
       return rhs;
     }
 
Index: testsuite/g++.dg/conversion/op4.C
===================================================================
--- testsuite/g++.dg/conversion/op4.C	(revision 197190)
+++ testsuite/g++.dg/conversion/op4.C	(working copy)
@@ -9,7 +9,7 @@  struct X {
   }
 };
 
-void add_one (X & ref) { /* { dg-error "in passing argument" } */
+void add_one (X & ref) { /* { dg-message "in passing argument" } */
   ++ ref.x;
 }
 
Index: testsuite/g++.dg/cpp0x/rv1n.C
===================================================================
--- testsuite/g++.dg/cpp0x/rv1n.C	(revision 197190)
+++ testsuite/g++.dg/cpp0x/rv1n.C	(working copy)
@@ -30,7 +30,7 @@  const volatile A cv_source();
 
 // 1 at a time
 
-one   sink_1_1(               A&);  // { dg-error "" }
+one   sink_1_1(               A&);  // { dg-message "" }
 
 int test1_1()
 {
@@ -48,7 +48,7 @@  int test1_1()
     return 0;
 }
 
-two   sink_1_2(const          A&);  // { dg-error "" }
+two   sink_1_2(const          A&);  // { dg-message "" }
 
 int test1_2()
 {
@@ -63,7 +63,7 @@  int test1_2()
     return 0;
 }
 
-three sink_1_3(volatile       A&);  // { dg-error "" }
+three sink_1_3(volatile       A&);  // { dg-message "" }
 
 int test1_3()
 {
@@ -80,7 +80,7 @@  int test1_3()
     return 0;
 }
 
-four  sink_1_4(const volatile A&);  // { dg-error "" }
+four  sink_1_4(const volatile A&);  // { dg-message "" }
 
 int test1_4()
 {
@@ -95,7 +95,7 @@  int test1_4()
     return 0;
 }
 
-five  sink_1_5(               A&&);  // { dg-error "" }
+five  sink_1_5(               A&&);  // { dg-message "" }
 
 int test1_5()
 {
@@ -113,7 +113,7 @@  int test1_5()
     return 0;
 }
 
-six   sink_1_6(const          A&&);  // { dg-error "" }
+six   sink_1_6(const          A&&);  // { dg-message "" }
 
 int test1_6()
 {
@@ -130,7 +130,7 @@  int test1_6()
     return 0;
 }
 
-seven sink_1_7(volatile       A&&);  // { dg-error "" }
+seven sink_1_7(volatile       A&&);  // { dg-message "" }
 
 int test1_7()
 {
@@ -147,7 +147,7 @@  int test1_7()
     return 0;
 }
 
-eight sink_1_8(const volatile A&&); // { dg-error "" }
+eight sink_1_8(const volatile A&&); // { dg-message "" }
 
 int test1_8()
 {
Index: testsuite/g++.dg/cpp0x/rv2n.C
===================================================================
--- testsuite/g++.dg/cpp0x/rv2n.C	(revision 197190)
+++ testsuite/g++.dg/cpp0x/rv2n.C	(working copy)
@@ -161,7 +161,7 @@  int test2_17()
 }
 
 one   sink_2_18(               A&);
-eight sink_2_18(const volatile A&&); // { dg-error "argument" }
+eight sink_2_18(const volatile A&&); // { dg-message "argument" }
 
 int test2_18()
 {
@@ -288,7 +288,7 @@  int test2_27()
 }
 
 two   sink_2_28(const          A&);
-eight sink_2_28(const volatile A&&); // { dg-error "argument" }
+eight sink_2_28(const volatile A&&); // { dg-message "argument" }
 
 int test2_28()
 {
@@ -362,7 +362,7 @@  int test2_37()
 }
 
 three sink_2_38(volatile       A&);
-eight sink_2_38(const volatile A&&); // { dg-error "argument" }
+eight sink_2_38(const volatile A&&); // { dg-message "argument" }
 
 int test2_38()
 {
@@ -468,8 +468,8 @@  int test2_57()
     return 0;
 }
 
-five  sink_2_58(               A&&); // { dg-error "argument" }
-eight sink_2_58(const volatile A&&); // { dg-error "argument" }
+five  sink_2_58(               A&&); // { dg-message "argument" }
+eight sink_2_58(const volatile A&&); // { dg-message "argument" }
 
 int test2_58()
 {
@@ -505,8 +505,8 @@  int test2_67()
     return 0;
 }
 
-six   sink_2_68(const          A&&); // { dg-error "argument" }
-eight sink_2_68(const volatile A&&); // { dg-error "argument" }
+six   sink_2_68(const          A&&); // { dg-message "argument" }
+eight sink_2_68(const volatile A&&); // { dg-message "argument" }
 
 int test2_68()
 {
@@ -520,8 +520,8 @@  int test2_68()
     sink_2_68(cva);		// { dg-error "lvalue" }
 }
 
-seven sink_2_78(volatile       A&&); // { dg-error "argument" }
-eight sink_2_78(const volatile A&&); // { dg-error "argument" }
+seven sink_2_78(volatile       A&&); // { dg-message "argument" }
+eight sink_2_78(const volatile A&&); // { dg-message "argument" }
 
 int test2_78()
 {
Index: testsuite/g++.dg/cpp0x/template_deduction.C
===================================================================
--- testsuite/g++.dg/cpp0x/template_deduction.C	(revision 197190)
+++ testsuite/g++.dg/cpp0x/template_deduction.C	(working copy)
@@ -35,7 +35,7 @@  test1(T&&)
 
 template <bool is_lvalue_ref, bool is_rvalue_ref, class T>
 void
-test2(const T&&)		// { dg-error "argument" }
+test2(const T&&)		// { dg-message "argument" }
 {
     sa<is_lvalue_reference<const T&&>::value == is_lvalue_ref> t1;
     sa<is_rvalue_reference<const T&&>::value == is_rvalue_ref> t2;
Index: testsuite/g++.dg/expr/cond8.C
===================================================================
--- testsuite/g++.dg/expr/cond8.C	(revision 197190)
+++ testsuite/g++.dg/expr/cond8.C	(working copy)
@@ -3,7 +3,7 @@ 
 
 struct A
 {
-  A(void*);			// { dg-error "initializing" }
+  A(void*);			// { dg-message "initializing" }
   ~A();
 };
 
Index: testsuite/g++.dg/other/error4.C
===================================================================
--- testsuite/g++.dg/other/error4.C	(revision 197190)
+++ testsuite/g++.dg/other/error4.C	(working copy)
@@ -7,7 +7,7 @@ 
 
 struct Wrapper {};
 
-void Foo(int const &); // { dg-error "in passing" "" }
+void Foo(int const &); // { dg-message "in passing" "" }
 
 void Baz ()
 {
Index: testsuite/g++.old-deja/g++.bugs/900514_03.C
===================================================================
--- testsuite/g++.old-deja/g++.bugs/900514_03.C	(revision 197190)
+++ testsuite/g++.old-deja/g++.bugs/900514_03.C	(working copy)
@@ -16,7 +16,7 @@ 
 
 struct t_0_st_0;
 
-struct t_0_st_1 {		// { dg-error "initializing" }
+struct t_0_st_1 {		// { dg-message "initializing" }
   int member;
 
   t_0_st_1 (t_0_st_0&);// { dg-message "note" } 
@@ -85,7 +85,7 @@  void t_1_local_init ()
 
 struct t_2_st_0;
 
-struct t_2_st_1 {		// { dg-error "initializing" }
+struct t_2_st_1 {		// { dg-message "initializing" }
   int member;
 
   t_2_st_1 (t_2_st_0);		// { dg-message "note" }
Index: testsuite/g++.old-deja/g++.bugs/900519_02.C
===================================================================
--- testsuite/g++.old-deja/g++.bugs/900519_02.C	(revision 197190)
+++ testsuite/g++.old-deja/g++.bugs/900519_02.C	(working copy)
@@ -10,7 +10,7 @@ 
 extern const int cint_obj = 9;
 volatile int vint_obj = 9;
 
-void take_int_ref (int& arg) { } // { dg-error "" } referenced by errors below
+void take_int_ref (int& arg) { } // { dg-message "" } referenced by errors below
 
 int& global_int_ref0 = cint_obj;		// { dg-error "" } 
 int& global_int_ref1 = vint_obj;		// { dg-error "" } 
Index: testsuite/g++.old-deja/g++.bugs/900519_03.C
===================================================================
--- testsuite/g++.old-deja/g++.bugs/900519_03.C	(revision 197190)
+++ testsuite/g++.old-deja/g++.bugs/900519_03.C	(working copy)
@@ -14,8 +14,8 @@ 
 extern const int cint_obj;
 extern volatile int vint_obj;
 
-void take_cint_ref (const int& arg) { }	// { dg-error "" } 
-void take_vint_ref (volatile int& arg) { } // { dg-error "" } 
+void take_cint_ref (const int& arg) { }	// { dg-message "" } 
+void take_vint_ref (volatile int& arg) { } // { dg-message "" } 
 
 const int& global_cint_ref2 = vint_obj;		// { dg-error "" } 
 
Index: testsuite/g++.old-deja/g++.bugs/900520_02.C
===================================================================
--- testsuite/g++.old-deja/g++.bugs/900520_02.C	(revision 197190)
+++ testsuite/g++.old-deja/g++.bugs/900520_02.C	(working copy)
@@ -9,7 +9,7 @@  typedef int u_array[];
 typedef b_array &b_array_ref;
 typedef u_array &u_array_ref;
 
-void take_b_array_ref (b_array_ref arg) { } // { dg-error "" } passed to here
+void take_b_array_ref (b_array_ref arg) { } // { dg-message "" } passed to here
 
 extern u_array u_array_gbl_obj;
 
Index: testsuite/g++.old-deja/g++.jason/conversion2.C
===================================================================
--- testsuite/g++.old-deja/g++.jason/conversion2.C	(revision 197190)
+++ testsuite/g++.old-deja/g++.jason/conversion2.C	(working copy)
@@ -1,7 +1,7 @@ 
 // { dg-do assemble  }
 // PRMS Id: 3069
 
-void f(int&);			// { dg-error "" } referenced by error below
+void f(int&);			// { dg-message "" } referenced by error below
 void g(const int& i) {
   f(i);				// { dg-error "" } discarding const
 }
Index: testsuite/g++.old-deja/g++.law/cvt20.C
===================================================================
--- testsuite/g++.old-deja/g++.law/cvt20.C	(revision 197190)
+++ testsuite/g++.old-deja/g++.law/cvt20.C	(working copy)
@@ -9,7 +9,7 @@ 
 
 // Compiles fine with Sun CC 2.1
 
-void f(char *& x) // { dg-error "passing argument" }
+void f(char *& x) // { dg-message "passing argument" }
 {
   x++;
 }
Index: testsuite/g++.old-deja/g++.law/cvt8.C
===================================================================
--- testsuite/g++.old-deja/g++.law/cvt8.C	(revision 197190)
+++ testsuite/g++.old-deja/g++.law/cvt8.C	(working copy)
@@ -24,7 +24,7 @@  B::operator const A&() const {
         return a;
 }
 
-void f(A &a) { // { dg-error "" } in passing argument
+void f(A &a) { // { dg-message "" } in passing argument
         printf("A at %x is %d\n", &a, a.i);
 }
 
Index: testsuite/g++.old-deja/g++.law/init8.C
===================================================================
--- testsuite/g++.old-deja/g++.law/init8.C	(revision 197190)
+++ testsuite/g++.old-deja/g++.law/init8.C	(working copy)
@@ -8,7 +8,7 @@ 
 
 
 const int ic = 1;
-void f(int& arg)  // { dg-error "passing argument 1" }
+void f(int& arg)  // { dg-message "passing argument 1" }
 {
         if (arg) ;
 }
Index: testsuite/g++.old-deja/g++.mike/net12.C
===================================================================
--- testsuite/g++.old-deja/g++.mike/net12.C	(revision 197190)
+++ testsuite/g++.old-deja/g++.mike/net12.C	(working copy)
@@ -7,7 +7,7 @@  struct Foo {
   void m() const;
 };
 
-void other(char &x);	// { dg-error "" } reference below
+void other(char &x);	// { dg-message "" } reference below
 
 void
 Foo::m() const
Index: testsuite/g++.old-deja/g++.mike/net8.C
===================================================================
--- testsuite/g++.old-deja/g++.mike/net8.C	(revision 197190)
+++ testsuite/g++.old-deja/g++.mike/net8.C	(working copy)
@@ -11,14 +11,14 @@  class Derived : public Base {
   int bar;
 };
 
-void func(Base&);			// { dg-error "passing argument 1" } 
+void func(Base&);			// { dg-message "passing argument 1" } 
 
 void func2(const Derived& d) {
   func(d);				// { dg-error "invalid initialization" }
 }
 
 void
-foo (int& a)				// { dg-error "in passing argument 1" } 
+foo (int& a)				// { dg-message "in passing argument 1" } 
 {
 }
 
Index: testsuite/g++.old-deja/g++.mike/p2793.C
===================================================================
--- testsuite/g++.old-deja/g++.mike/p2793.C	(revision 197190)
+++ testsuite/g++.old-deja/g++.mike/p2793.C	(working copy)
@@ -1,6 +1,6 @@ 
 // { dg-do assemble  }
 // prms-id: 2793
 
-void f(char&) {			// { dg-error "" } referenced by error below
+void f(char&) {			// { dg-message "" } referenced by error below
   f('c');			// { dg-error "" } 
 }
Index: testsuite/g++.old-deja/g++.mike/p3836.C
===================================================================
--- testsuite/g++.old-deja/g++.mike/p3836.C	(revision 197190)
+++ testsuite/g++.old-deja/g++.mike/p3836.C	(working copy)
@@ -1,7 +1,7 @@ 
 // { dg-do assemble  }
 // prms-id: 3836
 
-void f(int &i) {	// { dg-error "" } ref line
+void f(int &i) {	// { dg-message "" } ref line
   i = 10;
 }
 
Index: testsuite/g++.old-deja/g++.mike/p418.C
===================================================================
--- testsuite/g++.old-deja/g++.mike/p418.C	(revision 197190)
+++ testsuite/g++.old-deja/g++.mike/p418.C	(working copy)
@@ -11,7 +11,7 @@  class Derived : public Base {
 	int bar;
 };
 
-void func(Base&);		// { dg-error "" } referenced by error below
+void func(Base&);		// { dg-message "" } referenced by error below
 
 void func2(const Derived& d) {
 	func(d);		// { dg-error "" } should be error because of const
Index: testsuite/g++.old-deja/g++.mike/p701.C
===================================================================
--- testsuite/g++.old-deja/g++.mike/p701.C	(revision 197190)
+++ testsuite/g++.old-deja/g++.mike/p701.C	(working copy)
@@ -7,7 +7,7 @@  extern "C"
 }
 
 
-void Munge(int& x) 	// { dg-error "passing argument 1" }
+void Munge(int& x) 	// { dg-message "passing argument 1" }
 {
    x = 2;
 }
Index: testsuite/g++.old-deja/g++.mike/p807.C
===================================================================
--- testsuite/g++.old-deja/g++.mike/p807.C	(revision 197190)
+++ testsuite/g++.old-deja/g++.mike/p807.C	(working copy)
@@ -24,7 +24,7 @@  class B
 };
 
 
-int foo(B& b);			// { dg-error "" } referenced below
+int foo(B& b);			// { dg-message "" } referenced below
 
 
 int main()