Commit 6f536f74 by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/34965 (Broken diagnostic: 'truth_and_expr' not supported by dump_expr)

	PR c++/34965
	* c-pretty-print.c (pp_c_exclusive_or_expression): Handle
	TRUTH_XOR_EXPR.
	(pp_c_logical_and_expression): Handle TRUTH_AND_EXPR.
	(pp_c_logical_or_expression): Handle TRUTH_OR_EXPR.
	(pp_c_expression): Handle TRUTH_AND_EXPR, TRUTH_OR_EXPR
	and TRUTH_XOR_EXPR.

	* error.c (dump_expr): Handle TRUTH_AND_EXPR, TRUTH_OR_EXPR
	and TRUTH_XOR_EXPR.

	* gcc.dg/pr34965.c: New test.
	* g++.dg/other/error24.C: New test.

From-SVN: r131868
parent 680f02e4
2008-01-26 Jakub Jelinek <jakub@redhat.com>
PR c++/34965
* c-pretty-print.c (pp_c_exclusive_or_expression): Handle
TRUTH_XOR_EXPR.
(pp_c_logical_and_expression): Handle TRUTH_AND_EXPR.
(pp_c_logical_or_expression): Handle TRUTH_OR_EXPR.
(pp_c_expression): Handle TRUTH_AND_EXPR, TRUTH_OR_EXPR
and TRUTH_XOR_EXPR.
2008-01-26 David Edelsohn <edelsohn@gnu.org>
PR target/34794
......
/* Subroutines common to both C and C++ pretty-printers.
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008
Free Software Foundation, Inc.
Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
This file is part of GCC.
......@@ -1737,10 +1738,14 @@ pp_c_and_expression (c_pretty_printer *pp, tree e)
static void
pp_c_exclusive_or_expression (c_pretty_printer *pp, tree e)
{
if (TREE_CODE (e) == BIT_XOR_EXPR)
if (TREE_CODE (e) == BIT_XOR_EXPR
|| TREE_CODE (e) == TRUTH_XOR_EXPR)
{
pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
pp_c_maybe_whitespace (pp);
if (TREE_CODE (e) == BIT_XOR_EXPR)
pp_c_maybe_whitespace (pp);
else
pp_c_whitespace (pp);
pp_carret (pp);
pp_c_whitespace (pp);
pp_c_and_expression (pp, TREE_OPERAND (e, 1));
......@@ -1775,7 +1780,8 @@ pp_c_inclusive_or_expression (c_pretty_printer *pp, tree e)
static void
pp_c_logical_and_expression (c_pretty_printer *pp, tree e)
{
if (TREE_CODE (e) == TRUTH_ANDIF_EXPR)
if (TREE_CODE (e) == TRUTH_ANDIF_EXPR
|| TREE_CODE (e) == TRUTH_AND_EXPR)
{
pp_c_logical_and_expression (pp, TREE_OPERAND (e, 0));
pp_c_whitespace (pp);
......@@ -1794,7 +1800,8 @@ pp_c_logical_and_expression (c_pretty_printer *pp, tree e)
void
pp_c_logical_or_expression (c_pretty_printer *pp, tree e)
{
if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
if (TREE_CODE (e) == TRUTH_ORIF_EXPR
|| TREE_CODE (e) == TRUTH_OR_EXPR)
{
pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
pp_c_whitespace (pp);
......@@ -1963,6 +1970,7 @@ pp_c_expression (c_pretty_printer *pp, tree e)
break;
case BIT_XOR_EXPR:
case TRUTH_XOR_EXPR:
pp_c_exclusive_or_expression (pp, e);
break;
......@@ -1971,10 +1979,12 @@ pp_c_expression (c_pretty_printer *pp, tree e)
break;
case TRUTH_ANDIF_EXPR:
case TRUTH_AND_EXPR:
pp_c_logical_and_expression (pp, e);
break;
case TRUTH_ORIF_EXPR:
case TRUTH_OR_EXPR:
pp_c_logical_or_expression (pp, e);
break;
......
2008-01-26 Jakub Jelinek <jakub@redhat.com>
PR c++/34965
* error.c (dump_expr): Handle TRUTH_AND_EXPR, TRUTH_OR_EXPR
and TRUTH_XOR_EXPR.
2008-01-26 Richard Guenther <rguenther@suse.de>
PR c++/34235
......
......@@ -2083,6 +2083,16 @@ dump_expr (tree t, int flags)
pp_expression (cxx_pp, t);
break;
case TRUTH_AND_EXPR:
case TRUTH_OR_EXPR:
case TRUTH_XOR_EXPR:
if (flags & TFF_EXPR_IN_PARENS)
pp_cxx_left_paren (cxx_pp);
pp_expression (cxx_pp, t);
if (flags & TFF_EXPR_IN_PARENS)
pp_cxx_right_paren (cxx_pp);
break;
case OBJ_TYPE_REF:
dump_expr (resolve_virtual_fun_from_obj_type_ref (t), flags);
break;
......
......@@ -3,6 +3,10 @@
* gcc.c-torture/compile/pr34966.c (atan): Only use asm
on i?86/x86_64.
PR c++/34965
* gcc.dg/pr34965.c: New test.
* g++.dg/other/error24.C: New test.
2008-01-26 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfofortran/34887
// PR c++/34965
// { dg-do compile }
// { dg-options "-O" }
int foo (int);
void
bar (int i, int j, double k)
{
foo (i && j) (); // { dg-error "\\(\\(?i != 0\\)? \\&\\& \\(?j != 0\\)?\\)" }
foo (!i || !j) (); // { dg-error "\\(\\(?i == 0\\)? \\|\\| \\(?j == 0\\)?\\)" }
foo (!i == !j) (); // { dg-error "\\(\\(?i != 0\\)? \\^ \\(?j == 0\\)?\\)" }
}
/* PR c++/34965 */
/* { dg-do compile } */
/* { dg-options "-O" } */
int foo (int);
void
bar (int i, int j, double k)
{
foo (i && j) (); /* { dg-error "\\(i != 0 \\&\\& j != 0\\)" } */
foo (!i || !j) (); /* { dg-error "\\(i == 0 \\|\\| j == 0\\)" } */
foo (!i == !j) (); /* { dg-error "\\(i != 0 \\^ j == 0\\)" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment