diff options
author | Roger Sayle <roger@eyesopen.com> | 2005-12-06 14:05:58 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2005-12-06 14:05:58 +0000 |
commit | eda0cd9827081b8c628a2a162321342ebc76eba9 (patch) | |
tree | c85b88f8c548c77130388b41db29f251d86d0a69 | |
parent | 9116d529f6d79990fc5b7315f9f905f9d2ec6fb7 (diff) | |
download | gcc-eda0cd9827081b8c628a2a162321342ebc76eba9.zip gcc-eda0cd9827081b8c628a2a162321342ebc76eba9.tar.gz gcc-eda0cd9827081b8c628a2a162321342ebc76eba9.tar.bz2 |
typeck.c (build_binary_op): Issue warning if either operand of a comparison operator is a string literal...
* 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.
From-SVN: r108120
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C | 29 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C | 29 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C | 29 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C | 29 |
7 files changed, 138 insertions, 0 deletions
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 <roger@eyesopen.com> + * 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 <roger@eyesopen.com> + 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 <roger@eyesopen.com> + * 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 <roger@eyesopen.com> + 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"; +} + |