mirror of git://gcc.gnu.org/git/gcc.git
re PR c++/49152 (pretty printer cannot handle iterators and other complex expressions)
/cp 2012-04-16 Paolo Carlini <paolo.carlini@oracle.com> PR c++/49152 * call.c (op_error): Print types; when flag_diagnostics_show_caret is false print expressions too. (op_error_string): Add. /testsuite 2012-04-16 Paolo Carlini <paolo.carlini@oracle.com> PR c++/49152 * g++.dg/diagnostic/operator1.C: New. * g++.dg/ext/label5.C: Adjust. * g++.dg/ext/va-arg1.C: Likewise. * g++.dg/other/error20.C: Likewise. * g++.dg/other/error20.C: Likewise. * g++.dg/other/error16.C: Likewise. * g++.dg/other/error10.C: Likewise. * g++.dg/parse/error30.C: Likewise. * g++.dg/cpp0x/lambda/lambda-err1.C: Likewise. From-SVN: r186499
This commit is contained in:
parent
d6cb05db2e
commit
051b40ff6b
|
@ -1,3 +1,10 @@
|
|||
2012-04-16 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/49152
|
||||
* call.c (op_error): Print types; when flag_diagnostics_show_caret
|
||||
is false print expressions too.
|
||||
(op_error_string): Add.
|
||||
|
||||
2012-04-16 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/51148
|
||||
|
|
|
@ -4149,6 +4149,28 @@ build_op_call (tree obj, VEC(tree,gc) **args, tsubst_flags_t complain)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Called by op_error to prepare format strings suitable for the error
|
||||
function. It concatenates a prefix (controlled by MATCH), ERRMSG,
|
||||
and a suffix (controlled by NTYPES). */
|
||||
|
||||
static const char *
|
||||
op_error_string (const char *errmsg, int ntypes, bool match)
|
||||
{
|
||||
const char *msg;
|
||||
|
||||
const char *msgp = concat (match ? G_("ambiguous overload for ")
|
||||
: G_("no match for "), errmsg, NULL);
|
||||
|
||||
if (ntypes == 3)
|
||||
msg = concat (msgp, G_(" (operand types are %qT, %qT, and %qT)"), NULL);
|
||||
else if (ntypes == 2)
|
||||
msg = concat (msgp, G_(" (operand types are %qT and %qT)"), NULL);
|
||||
else
|
||||
msg = concat (msgp, G_(" (operand type is %qT)"), NULL);
|
||||
|
||||
return msg;
|
||||
}
|
||||
|
||||
static void
|
||||
op_error (enum tree_code code, enum tree_code code2,
|
||||
tree arg1, tree arg2, tree arg3, bool match)
|
||||
|
@ -4163,58 +4185,63 @@ op_error (enum tree_code code, enum tree_code code2,
|
|||
switch (code)
|
||||
{
|
||||
case COND_EXPR:
|
||||
if (match)
|
||||
error ("ambiguous overload for ternary %<operator?:%> "
|
||||
"in %<%E ? %E : %E%>", arg1, arg2, arg3);
|
||||
if (flag_diagnostics_show_caret)
|
||||
error (op_error_string (G_("ternary %<operator?:%>"), 3, match),
|
||||
TREE_TYPE (arg1), TREE_TYPE (arg2), TREE_TYPE (arg3));
|
||||
else
|
||||
error ("no match for ternary %<operator?:%> "
|
||||
"in %<%E ? %E : %E%>", arg1, arg2, arg3);
|
||||
error (op_error_string (G_("ternary %<operator?:%> "
|
||||
"in %<%E ? %E : %E%>"), 3, match),
|
||||
arg1, arg2, arg3,
|
||||
TREE_TYPE (arg1), TREE_TYPE (arg2), TREE_TYPE (arg3));
|
||||
break;
|
||||
|
||||
case POSTINCREMENT_EXPR:
|
||||
case POSTDECREMENT_EXPR:
|
||||
if (match)
|
||||
error ("ambiguous overload for %<operator%s%> in %<%E%s%>",
|
||||
opname, arg1, opname);
|
||||
if (flag_diagnostics_show_caret)
|
||||
error (op_error_string (G_("%<operator%s%>"), 1, match),
|
||||
opname, TREE_TYPE (arg1));
|
||||
else
|
||||
error ("no match for %<operator%s%> in %<%E%s%>",
|
||||
opname, arg1, opname);
|
||||
error (op_error_string (G_("%<operator%s%> in %<%E%s%>"), 1, match),
|
||||
opname, arg1, opname, TREE_TYPE (arg1));
|
||||
break;
|
||||
|
||||
case ARRAY_REF:
|
||||
if (match)
|
||||
error ("ambiguous overload for %<operator[]%> in %<%E[%E]%>",
|
||||
arg1, arg2);
|
||||
if (flag_diagnostics_show_caret)
|
||||
error (op_error_string (G_("%<operator[]%>"), 2, match),
|
||||
TREE_TYPE (arg1), TREE_TYPE (arg2));
|
||||
else
|
||||
error ("no match for %<operator[]%> in %<%E[%E]%>",
|
||||
arg1, arg2);
|
||||
error (op_error_string (G_("%<operator[]%> in %<%E[%E]%>"), 2, match),
|
||||
arg1, arg2, TREE_TYPE (arg1), TREE_TYPE (arg2));
|
||||
break;
|
||||
|
||||
case REALPART_EXPR:
|
||||
case IMAGPART_EXPR:
|
||||
if (match)
|
||||
error ("ambiguous overload for %qs in %<%s %E%>",
|
||||
opname, opname, arg1);
|
||||
if (flag_diagnostics_show_caret)
|
||||
error (op_error_string (G_("%qs"), 1, match),
|
||||
opname, TREE_TYPE (arg1));
|
||||
else
|
||||
error ("no match for %qs in %<%s %E%>",
|
||||
opname, opname, arg1);
|
||||
error (op_error_string (G_("%qs in %<%s %E%>"), 1, match),
|
||||
opname, opname, arg1, TREE_TYPE (arg1));
|
||||
break;
|
||||
|
||||
default:
|
||||
if (arg2)
|
||||
if (match)
|
||||
error ("ambiguous overload for %<operator%s%> in %<%E %s %E%>",
|
||||
opname, arg1, opname, arg2);
|
||||
else
|
||||
error ("no match for %<operator%s%> in %<%E %s %E%>",
|
||||
opname, arg1, opname, arg2);
|
||||
if (flag_diagnostics_show_caret)
|
||||
error (op_error_string (G_("%<operator%s%>"), 2, match),
|
||||
opname, TREE_TYPE (arg1), TREE_TYPE (arg2));
|
||||
else
|
||||
error (op_error_string (G_("%<operator%s%> in %<%E %s %E%>"),
|
||||
2, match),
|
||||
opname, arg1, opname, arg2,
|
||||
TREE_TYPE (arg1), TREE_TYPE (arg2));
|
||||
else
|
||||
if (match)
|
||||
error ("ambiguous overload for %<operator%s%> in %<%s%E%>",
|
||||
opname, opname, arg1);
|
||||
else
|
||||
error ("no match for %<operator%s%> in %<%s%E%>",
|
||||
opname, opname, arg1);
|
||||
if (flag_diagnostics_show_caret)
|
||||
error (op_error_string (G_("%<operator%s%>"), 1, match),
|
||||
opname, TREE_TYPE (arg1));
|
||||
else
|
||||
error (op_error_string (G_("%<operator%s%> in %<%s%E%>"),
|
||||
1, match),
|
||||
opname, opname, arg1, TREE_TYPE (arg1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,16 @@
|
|||
2012-04-16 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/49152
|
||||
* g++.dg/diagnostic/operator1.C: New.
|
||||
* g++.dg/ext/label5.C: Adjust.
|
||||
* g++.dg/ext/va-arg1.C: Likewise.
|
||||
* g++.dg/other/error20.C: Likewise.
|
||||
* g++.dg/other/error20.C: Likewise.
|
||||
* g++.dg/other/error16.C: Likewise.
|
||||
* g++.dg/other/error10.C: Likewise.
|
||||
* g++.dg/parse/error30.C: Likewise.
|
||||
* g++.dg/cpp0x/lambda/lambda-err1.C: Likewise.
|
||||
|
||||
2012-04-16 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/51148
|
||||
|
|
|
@ -4,5 +4,5 @@
|
|||
void foo()
|
||||
{
|
||||
int x[1];
|
||||
[x]{} = 0; // { dg-error "lambda closure" }
|
||||
[x]{} = 0; // { dg-error "lambda" }
|
||||
}
|
||||
|
|
|
@ -2,5 +2,5 @@
|
|||
// PR c++/24052
|
||||
|
||||
struct A { };
|
||||
int main() { b: A() && && b; } // { dg-error "A\\(\\) && && *b" }
|
||||
int main() { b: A() && && b; } // { dg-error "operand types are 'A' and 'void\\*'" }
|
||||
// { dg-message "candidate|operator&&|no known conversion" "additional" { target *-*-* } 5 }
|
||||
|
|
|
@ -4,5 +4,5 @@ struct A {};
|
|||
|
||||
void foo()
|
||||
{
|
||||
++__builtin_va_arg(0, A); // { dg-error "'\\+\\+va_arg\\(0, A\\)'" }
|
||||
++__builtin_va_arg(0, A); // { dg-error "operand type is 'A'" }
|
||||
}
|
||||
|
|
|
@ -6,10 +6,9 @@ template<int> struct A {};
|
|||
|
||||
template<int N>
|
||||
void foo(const A<N> &a)
|
||||
{ -A<N>(a); } // { dg-error "\\(\\* & a\\)" "" }
|
||||
{ -A<N>(a); } // { dg-error "operand type is 'A<0>'" }
|
||||
|
||||
void bar()
|
||||
{
|
||||
foo(A<0>()); // { dg-message "required from here" "" }
|
||||
}
|
||||
|
||||
|
|
|
@ -10,5 +10,5 @@ typedef Outer<X> XOuter;
|
|||
|
||||
int main() {
|
||||
Outer<int> ab;
|
||||
ab.foo() == 1; // { dg-error "ab.Outer" }
|
||||
ab.foo() == 1; // { dg-error "operand types are 'Outer<int>::Inner' and 'int'" }
|
||||
}
|
||||
|
|
|
@ -8,6 +8,6 @@ struct A // { dg-message "operator=|no known conversion" }
|
|||
|
||||
void bar (A& a)
|
||||
{
|
||||
a.foo () = 0; // { dg-error "A::foo\\(\\) = 0" }
|
||||
a.foo () = 0; // { dg-error "operand types are 'A' and 'int'" }
|
||||
// { dg-message "candidate" "candidate note" { target *-*-* } 11 }
|
||||
}
|
||||
|
|
|
@ -8,5 +8,5 @@ struct A
|
|||
A(int);
|
||||
};
|
||||
|
||||
A a = -A(); // { dg-error "10:no match for.*operator-.*in.*-A\\(\\)" }
|
||||
A b = -A(5); // { dg-error "11:no match for.*operator-.*in.*-A\\(5\\)" }
|
||||
A a = -A(); // { dg-error "operand type is 'A'" }
|
||||
A b = -A(5); // { dg-error "operand type is 'A'" }
|
||||
|
|
Loading…
Reference in New Issue