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.carl...@oracle.com>
Manuel Lopez-Ibanez <m...@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.carl...@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.
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()