From 6dd536b9916f8e66cd1e6c29b2f18942f30d9f2d Mon Sep 17 00:00:00 2001 From: ian Date: Thu, 25 Jun 2009 19:03:28 +0000 Subject: [PATCH] cp/: * parser.c (cp_parser_binary_expression): Increment c_inhibit_evaluation_warnings while parsing the right hand side of "true || x" or "false && x". * typeck.c (cp_build_binary_op): Only call warn_for_sign_compare if c_inhibit_evaluation_warnings is zero. testsuite/: * g++.dg/warn/skip-2.C: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@148949 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/parser.c | 13 +++++++++++++ gcc/cp/typeck.c | 3 ++- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/warn/skip-2.C | 37 +++++++++++++++++++++++++++++++++++++ 5 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/warn/skip-2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fc9de2dbf7a..4e1f61080c5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2009-06-25 Ian Lance Taylor + + * parser.c (cp_parser_binary_expression): Increment + c_inhibit_evaluation_warnings while parsing the right hand side of + "true || x" or "false && x". + * typeck.c (cp_build_binary_op): Only call warn_for_sign_compare + if c_inhibit_evaluation_warnings is zero. + 2009-06-24 Jason Merrill * error.c (dump_decl): Do say "typedef" for the injected class name. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index bdf305827f0..f71ea46f8cb 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -6287,6 +6287,13 @@ cp_parser_binary_expression (cp_parser* parser, bool cast_p, /* We used the operator token. */ cp_lexer_consume_token (parser->lexer); + /* For "false && x" or "true || x", x will never be executed; + disable warnings while evaluating it. */ + if (tree_type == TRUTH_ANDIF_EXPR) + c_inhibit_evaluation_warnings += lhs == truthvalue_false_node; + else if (tree_type == TRUTH_ORIF_EXPR) + c_inhibit_evaluation_warnings += lhs == truthvalue_true_node; + /* Extract another operand. It may be the RHS of this expression or the LHS of a new, higher priority expression. */ rhs = cp_parser_simple_cast_expression (parser); @@ -6332,6 +6339,12 @@ cp_parser_binary_expression (cp_parser* parser, bool cast_p, lhs_type = sp->lhs_type; } + /* Undo the disabling of warnings done above. */ + if (tree_type == TRUTH_ANDIF_EXPR) + c_inhibit_evaluation_warnings -= lhs == truthvalue_false_node; + else if (tree_type == TRUTH_ORIF_EXPR) + c_inhibit_evaluation_warnings -= lhs == truthvalue_true_node; + overloaded_p = false; /* ??? Currently we pass lhs_type == ERROR_MARK and rhs_type == ERROR_MARK for everything that is not a binary expression. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index e3ed871f718..0799db318d1 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4021,7 +4021,8 @@ cp_build_binary_op (location_t location, /* Do not warn until the template is instantiated; we cannot bound the ranges of the arguments until that point. */ && !processing_template_decl - && (complain & tf_warning)) + && (complain & tf_warning) + && c_inhibit_evaluation_warnings == 0) { warn_for_sign_compare (location, orig_op0, orig_op1, op0, op1, result_type, resultcode); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 88ea4f5a649..cf0a4d9cccc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-06-25 Ian Lance Taylor + + * g++.dg/warn/skip-2.C: New testcase. + 2009-06-25 Steve Ellcey * gcc.c-torture/execute/20090618-1.c: add dg-run and diff --git a/gcc/testsuite/g++.dg/warn/skip-2.C b/gcc/testsuite/g++.dg/warn/skip-2.C new file mode 100644 index 00000000000..28f9049a9ad --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/skip-2.C @@ -0,0 +1,37 @@ +// { dg-do compile } +// { dg-options "-Wall" } + +extern int f2(int); +extern void f3(); +void +f1(int i) +{ + if (1 == 1 || f2(i >> -10)) + f3(); + if (1 == 1 || f2(i >> 128)) + f3(); + if (1 == 1 || f2(i << -10)) + f3(); + if (1 == 1 || f2(i << 128)) + f3(); + if (1 == 1 || i < 0xffffffff) + f3(); + if (1 == 1 || i >= -0x80000000) + f3(); + if (1 == 0 && f2(i >> -10)) + f3(); + if (1 == 0 && f2(i >> 128)) + f3(); + if (1 == 0 && f2(i << -10)) + f3(); + if (1 == 0 && f2(i << 128)) + f3(); + if (1 == 0 && i < 0xffffffff) + f3(); + if (1 == 0 && i >= -0x80000000) + f3(); + if (1 == 1 && f2(i >> -10)) /* { dg-warning "shift count is negative" } */ + f3(); + if (1 == 0 || f2(i << -10)) /* { dg-warning "shift count is negative" } */ + f3(); +} -- 2.11.0