From 3039f6d3b7a73c961794f21572c9fd6081b43b9b Mon Sep 17 00:00:00 2001 From: sayle Date: Tue, 6 Dec 2005 14:05:58 +0000 Subject: [PATCH] * typeck.c (build_binary_op): Issue warning if either operand of a comparison operator is a string literal, except for testing equality or inequality against NULL. * g++.dg/warn/Wstring-literal-comparison-1.C: New test case. * g++.dg/warn/Wstring-literal-comparison-2.C: Likewise. * g++.dg/warn/Wstring-literal-comparison-3.C: Likewise. * g++.dg/warn/Wstring-literal-comparison-4.C: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@108120 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 +++++ gcc/cp/typeck.c | 9 +++++++ gcc/testsuite/ChangeLog | 7 ++++++ .../g++.dg/warn/Wstring-literal-comparison-1.C | 29 ++++++++++++++++++++++ .../g++.dg/warn/Wstring-literal-comparison-2.C | 29 ++++++++++++++++++++++ .../g++.dg/warn/Wstring-literal-comparison-3.C | 29 ++++++++++++++++++++++ .../g++.dg/warn/Wstring-literal-comparison-4.C | 29 ++++++++++++++++++++++ 7 files changed, 138 insertions(+) create mode 100644 gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C create mode 100644 gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C create mode 100644 gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C create mode 100644 gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 82b99cb..d133d8b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2005-12-06 Roger Sayle + * typeck.c (build_binary_op): Issue warning if either operand of a + comparison operator is a string literal, except for testing equality + or inequality against NULL. + +2005-12-06 Roger Sayle + PR c++/25263 * decl.c (compute_array_index_type): Check that itype is an INTEGER_CST node before testing/clearing TREE_OVERFLOW. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 0ee630a..0cae938 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -3089,6 +3089,10 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1, case NE_EXPR: if (warn_float_equal && (code0 == REAL_TYPE || code1 == REAL_TYPE)) warning (0, "comparing floating point with == or != is unsafe"); + if ((TREE_CODE (orig_op0) == STRING_CST && !integer_zerop (op1)) + || (TREE_CODE (orig_op1) == STRING_CST && !integer_zerop (op0))) + warning (OPT_Wstring_literal_comparison, + "comparison with string literal"); build_type = boolean_type_node; if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE @@ -3194,6 +3198,11 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1, case GE_EXPR: case LT_EXPR: case GT_EXPR: + if (TREE_CODE (orig_op0) == STRING_CST + || TREE_CODE (orig_op1) == STRING_CST) + warning (OPT_Wstring_literal_comparison, + "comparison with string literal"); + build_type = boolean_type_node; if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE) && (code1 == INTEGER_TYPE || code1 == REAL_TYPE)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6c16c7d..35f45ea 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,12 @@ 2005-12-06 Roger Sayle + * g++.dg/warn/Wstring-literal-comparison-1.C: New test case. + * g++.dg/warn/Wstring-literal-comparison-2.C: Likewise. + * g++.dg/warn/Wstring-literal-comparison-3.C: Likewise. + * g++.dg/warn/Wstring-literal-comparison-4.C: Likewise. + +2005-12-06 Roger Sayle + PR c++/25263 * g++.dg/other/array2.C: New test case. diff --git a/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C new file mode 100644 index 0000000..c5dea46 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C @@ -0,0 +1,29 @@ +/* PR c/7776 */ +/* { dg-do compile } */ +/* { dg-options "-Wstring-literal-comparison" } */ + +int test1(char *ptr) +{ + return ptr == "foo"; /* { dg-warning "comparison with string" } */ +} + +int test2() +{ + return "foo" != (const char*)0; +} + +int test3() +{ + return "foo" == (const char*)0; +} + +int test4() +{ + return (const char*)0 != "foo"; +} + +int test5() +{ + return (const char*)0 == "foo"; +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C new file mode 100644 index 0000000..3eb91ee --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C @@ -0,0 +1,29 @@ +/* PR c/7776 */ +/* { dg-do compile } */ +/* { dg-options "-Wall" } */ + +int test1(char *ptr) +{ + return ptr == "foo"; /* { dg-warning "comparison with string" } */ +} + +int test2() +{ + return "foo" != (const char*)0; +} + +int test3() +{ + return "foo" == (const char*)0; +} + +int test4() +{ + return (const char*)0 != "foo"; +} + +int test5() +{ + return (const char*)0 == "foo"; +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C new file mode 100644 index 0000000..f700a51 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C @@ -0,0 +1,29 @@ +/* PR c/7776 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +int test1(char *ptr) +{ + return ptr == "foo"; +} + +int test2() +{ + return "foo" != (const char*)0; +} + +int test3() +{ + return "foo" == (const char*)0; +} + +int test4() +{ + return (const char*)0 != "foo"; +} + +int test5() +{ + return (const char*)0 == "foo"; +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C new file mode 100644 index 0000000..27f25f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C @@ -0,0 +1,29 @@ +/* PR c/7776 */ +/* { dg-do compile } */ +/* { dg-options "-Wall -Wno-string-literal-comparison" } */ + +int test1(char *ptr) +{ + return ptr == "foo"; +} + +int test2() +{ + return "foo" != (const char*)0; +} + +int test3() +{ + return "foo" == (const char*)0; +} + +int test4() +{ + return (const char*)0 != "foo"; +} + +int test5() +{ + return (const char*)0 == "foo"; +} + -- 2.7.4