From 40ffd95f56ad178148612c19304a4409d0a7ebac Mon Sep 17 00:00:00 2001 From: Bernd Edlinger Date: Fri, 2 Jun 2017 04:06:59 +0000 Subject: [PATCH] invoke.texi: Document the -Wsizeof-pointer-div warning. gcc: 2017-06-02 Bernd Edlinger * doc/invoke.texi: Document the -Wsizeof-pointer-div warning. gcc/c-family: 2017-06-02 Bernd Edlinger * c.opt (Wsizeof-pointer-div): New warning option. gcc/c: 2017-06-02 Bernd Edlinger * c-parser.c (c_parser_binary_expression): Implement the -Wsizeof_pointer_div warning. (c_parser_postfix_expression): Allow SIZEOF_EXPR as expr.original_code from a parenthesized expression. (c_parser_expr_list): Use c_last_sizeof_loc. * c-tree.h (c_last_sizeof_loc): New external. * c-typeck.c (c_last_sizeof_loc): New variable. (c_expr_sizeof_expr, c_expr_sizeof_type): Assign c_last_sizeof_loc. gcc/cp: 2017-06-02 Bernd Edlinger * typeck.c (cp_build_binary_op): Implement the -Wsizeof_pointer_div warning. gcc/testsuite: 2017-06-02 Bernd Edlinger * c-c++-common/Wsizeof-pointer-div.c: New test. * gcc.dg/Wsizeof-pointer-memaccess1.c: Add test cases with parens. * gcc.dg/torture/Wsizeof-pointer-memaccess1.c: Likewise. * gcc.target/i386/sse-init-v4hi-1.c: Fix test case. * gcc.target/i386/sse-init-v4sf-1.c: Likewise. * gcc.target/i386/sse-set-ps-1.c: Likewise. * gcc.target/i386/sse2-init-v16qi-1.c: Likewise. * gcc.target/i386/sse2-init-v2di-1.c: Likewise. * gcc.target/i386/sse2-init-v4si-1.c: Likewise. * gcc.target/i386/sse2-init-v8hi-1.c: Likewise. * gcc.target/i386/sse2-set-epi32-1.c: Likewise. * gcc.target/i386/sse2-set-epi64x-1.c: Likewise. * gcc.target/i386/sse4_1-init-v16qi-1.c: Likewise. * gcc.target/i386/sse4_1-init-v2di-1.c: Likewise. * gcc.target/i386/sse4_1-init-v4sf-1.c: Likewise. * gcc.target/i386/sse4_1-init-v4si-1.c: Likewise. * gcc.target/i386/sse4_1-set-epi32-1.c: Likewise. * gcc.target/i386/sse4_1-set-epi64x-1.c: Likewise. * gcc.target/i386/sse4_1-set-ps-1.c: Likewise. * libgomp.c/pr39591-2.c: Likewise. * libgomp.c/pr39591-3.c: Likewise. From-SVN: r248811 --- gcc/ChangeLog | 4 ++ gcc/c-family/ChangeLog | 4 ++ gcc/c-family/c.opt | 4 ++ gcc/c/ChangeLog | 11 +++++ gcc/c/c-parser.c | 47 +++++++++++++------ gcc/c/c-tree.h | 1 + gcc/c/c-typeck.c | 3 ++ gcc/cp/ChangeLog | 5 ++ gcc/cp/typeck.c | 23 +++++++++ gcc/doc/invoke.texi | 12 ++++- gcc/testsuite/ChangeLog | 22 +++++++++ .../c-c++-common/Wsizeof-pointer-div.c | 42 +++++++++++++++++ .../gcc.dg/Wsizeof-pointer-memaccess1.c | 9 ++++ .../torture/Wsizeof-pointer-memaccess1.c | 9 ++++ .../gcc.target/i386/sse-init-v4hi-1.c | 4 +- .../gcc.target/i386/sse-init-v4sf-1.c | 2 +- gcc/testsuite/gcc.target/i386/sse-set-ps-1.c | 2 +- .../gcc.target/i386/sse2-init-v16qi-1.c | 2 +- .../gcc.target/i386/sse2-init-v2di-1.c | 2 +- .../gcc.target/i386/sse2-init-v4si-1.c | 2 +- .../gcc.target/i386/sse2-init-v8hi-1.c | 2 +- .../gcc.target/i386/sse2-set-epi32-1.c | 2 +- .../gcc.target/i386/sse2-set-epi64x-1.c | 2 +- .../gcc.target/i386/sse4_1-init-v16qi-1.c | 2 +- .../gcc.target/i386/sse4_1-init-v2di-1.c | 2 +- .../gcc.target/i386/sse4_1-init-v4sf-1.c | 2 +- .../gcc.target/i386/sse4_1-init-v4si-1.c | 2 +- .../gcc.target/i386/sse4_1-set-epi32-1.c | 2 +- .../gcc.target/i386/sse4_1-set-epi64x-1.c | 2 +- .../gcc.target/i386/sse4_1-set-ps-1.c | 2 +- libgomp/ChangeLog | 5 ++ libgomp/testsuite/libgomp.c/pr39591-2.c | 2 +- libgomp/testsuite/libgomp.c/pr39591-3.c | 2 +- 33 files changed, 205 insertions(+), 34 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/Wsizeof-pointer-div.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2947735b127..3700ebc087a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2017-06-02 Bernd Edlinger + + * doc/invoke.texi: Document the -Wsizeof-pointer-div warning. + 2017-06-01 Bernd Edlinger * config/i386/i386.c (x86_64_ms_sysv_extra_clobbered_registers): Make diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 8e163cd2f98..0d54c903d6e 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,7 @@ +2017-06-02 Bernd Edlinger + + * c.opt (Wsizeof-pointer-div): New warning option. + 2017-06-01 Volker Reichelt * c.opt (Wcatch-value): New shortcut for Wcatch-value=1. diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index a8543ded091..37bb236eb97 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -710,6 +710,10 @@ Wsized-deallocation C++ ObjC++ Var(warn_sized_deallocation) Warning EnabledBy(Wextra) Warn about missing sized deallocation functions. +Wsizeof-pointer-div +C ObjC C++ ObjC++ Var(warn_sizeof_pointer_div) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall) +Warn about suspicious divisions of two sizeof expressions that don't work correctly with pointers. + Wsizeof-pointer-memaccess C ObjC C++ ObjC++ Var(warn_sizeof_pointer_memaccess) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall) Warn about suspicious length parameters to certain string functions if the argument uses sizeof. diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index c53a4bf9fb2..d849b014fec 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,14 @@ +2017-06-02 Bernd Edlinger + + * c-parser.c (c_parser_binary_expression): Implement the + -Wsizeof_pointer_div warning. + (c_parser_postfix_expression): Allow SIZEOF_EXPR as expr.original_code + from a parenthesized expression. + (c_parser_expr_list): Use c_last_sizeof_loc. + * c-tree.h (c_last_sizeof_loc): New external. + * c-typeck.c (c_last_sizeof_loc): New variable. + (c_expr_sizeof_expr, c_expr_sizeof_type): Assign c_last_sizeof_loc. + 2017-05-31 Mikhail Maltsev PR testsuite/80580 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 03c711bd528..6f954f21fa2 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -6657,6 +6657,8 @@ c_parser_binary_expression (c_parser *parser, struct c_expr *after, enum tree_code op; /* The source location of this operation. */ location_t loc; + /* The sizeof argument if expr.original_code == SIZEOF_EXPR. */ + tree sizeof_arg; } stack[NUM_PRECS]; int sp; /* Location of the binary operator. */ @@ -6673,6 +6675,31 @@ c_parser_binary_expression (c_parser *parser, struct c_expr *after, c_inhibit_evaluation_warnings -= (stack[sp - 1].expr.value \ == truthvalue_true_node); \ break; \ + case TRUNC_DIV_EXPR: \ + if (stack[sp - 1].expr.original_code == SIZEOF_EXPR \ + && stack[sp].expr.original_code == SIZEOF_EXPR) \ + { \ + tree type0 = stack[sp - 1].sizeof_arg; \ + tree type1 = stack[sp].sizeof_arg; \ + tree first_arg = type0; \ + if (!TYPE_P (type0)) \ + type0 = TREE_TYPE (type0); \ + if (!TYPE_P (type1)) \ + type1 = TREE_TYPE (type1); \ + if (POINTER_TYPE_P (type0) \ + && comptypes (TREE_TYPE (type0), type1) \ + && !(TREE_CODE (first_arg) == PARM_DECL \ + && C_ARRAY_PARAMETER (first_arg) \ + && warn_sizeof_array_argument)) \ + if (warning_at (stack[sp].loc, OPT_Wsizeof_pointer_div, \ + "division % does " \ + "not compute the number of array elements", \ + type0, type1)) \ + if (DECL_P (first_arg)) \ + inform (DECL_SOURCE_LOCATION (first_arg), \ + "first % operand was declared here"); \ + } \ + break; \ default: \ break; \ } \ @@ -6706,6 +6733,7 @@ c_parser_binary_expression (c_parser *parser, struct c_expr *after, stack[0].loc = c_parser_peek_token (parser)->location; stack[0].expr = c_parser_cast_expression (parser, after); stack[0].prec = PREC_NONE; + stack[0].sizeof_arg = c_last_sizeof_arg; sp = 0; while (true) { @@ -6829,6 +6857,7 @@ c_parser_binary_expression (c_parser *parser, struct c_expr *after, stack[sp].expr = c_parser_cast_expression (parser, NULL); stack[sp].prec = oprec; stack[sp].op = ocode; + stack[sp].sizeof_arg = c_last_sizeof_arg; } out: while (sp > 0) @@ -7720,7 +7749,8 @@ c_parser_postfix_expression (c_parser *parser) expr = c_parser_expression (parser); if (TREE_CODE (expr.value) == MODIFY_EXPR) TREE_NO_WARNING (expr.value) = 1; - if (expr.original_code != C_MAYBE_CONST_EXPR) + if (expr.original_code != C_MAYBE_CONST_EXPR + && expr.original_code != SIZEOF_EXPR) expr.original_code = ERROR_MARK; /* Don't change EXPR.ORIGINAL_TYPE. */ location_t loc_close_paren = c_parser_peek_token (parser)->location; @@ -8679,7 +8709,6 @@ c_parser_expr_list (c_parser *parser, bool convert_p, bool fold_p, vec *orig_types; struct c_expr expr; location_t loc = c_parser_peek_token (parser)->location; - location_t cur_sizeof_arg_loc = UNKNOWN_LOCATION; unsigned int idx = 0; ret = make_tree_vector (); @@ -8688,9 +8717,6 @@ c_parser_expr_list (c_parser *parser, bool convert_p, bool fold_p, else orig_types = make_tree_vector (); - if (sizeof_arg != NULL - && c_parser_next_token_is_keyword (parser, RID_SIZEOF)) - cur_sizeof_arg_loc = c_parser_peek_2nd_token (parser)->location; if (literal_zero_mask) c_parser_check_literal_zero (parser, literal_zero_mask, 0); expr = c_parser_expr_no_commas (parser, NULL); @@ -8704,21 +8730,15 @@ c_parser_expr_list (c_parser *parser, bool convert_p, bool fold_p, if (locations) locations->safe_push (loc); if (sizeof_arg != NULL - && cur_sizeof_arg_loc != UNKNOWN_LOCATION && expr.original_code == SIZEOF_EXPR) { sizeof_arg[0] = c_last_sizeof_arg; - sizeof_arg_loc[0] = cur_sizeof_arg_loc; + sizeof_arg_loc[0] = c_last_sizeof_loc; } while (c_parser_next_token_is (parser, CPP_COMMA)) { c_parser_consume_token (parser); loc = c_parser_peek_token (parser)->location; - if (sizeof_arg != NULL - && c_parser_next_token_is_keyword (parser, RID_SIZEOF)) - cur_sizeof_arg_loc = c_parser_peek_2nd_token (parser)->location; - else - cur_sizeof_arg_loc = UNKNOWN_LOCATION; if (literal_zero_mask) c_parser_check_literal_zero (parser, literal_zero_mask, idx + 1); expr = c_parser_expr_no_commas (parser, NULL); @@ -8733,11 +8753,10 @@ c_parser_expr_list (c_parser *parser, bool convert_p, bool fold_p, locations->safe_push (loc); if (++idx < 3 && sizeof_arg != NULL - && cur_sizeof_arg_loc != UNKNOWN_LOCATION && expr.original_code == SIZEOF_EXPR) { sizeof_arg[idx] = c_last_sizeof_arg; - sizeof_arg_loc[idx] = cur_sizeof_arg_loc; + sizeof_arg_loc[idx] = c_last_sizeof_loc; } } if (orig_types) diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h index 17a88979bd4..ce25fae0b87 100644 --- a/gcc/c/c-tree.h +++ b/gcc/c/c-tree.h @@ -611,6 +611,7 @@ extern int in_sizeof; extern int in_typeof; extern tree c_last_sizeof_arg; +extern location_t c_last_sizeof_loc; extern struct c_switch *c_switch_stack; diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 95a607a1e76..467552cef4b 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -72,6 +72,7 @@ int in_typeof; /* The argument of last parsed sizeof expression, only to be tested if expr.original_code == SIZEOF_EXPR. */ tree c_last_sizeof_arg; +location_t c_last_sizeof_loc; /* Nonzero if we might need to print a "missing braces around initializer" message within this initializer. */ @@ -2910,6 +2911,7 @@ c_expr_sizeof_expr (location_t loc, struct c_expr expr) &expr_const_operands); ret.value = c_sizeof (loc, TREE_TYPE (folded_expr)); c_last_sizeof_arg = expr.value; + c_last_sizeof_loc = loc; ret.original_code = SIZEOF_EXPR; ret.original_type = NULL; if (c_vla_type_p (TREE_TYPE (folded_expr))) @@ -2939,6 +2941,7 @@ c_expr_sizeof_type (location_t loc, struct c_type_name *t) type = groktypename (t, &type_expr, &type_expr_const); ret.value = c_sizeof (loc, type); c_last_sizeof_arg = type; + c_last_sizeof_loc = loc; ret.original_code = SIZEOF_EXPR; ret.original_type = NULL; if ((type_expr || TREE_CODE (ret.value) == INTEGER_CST) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 64f476a2188..03392caaea1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2017-06-02 Bernd Edlinger + + * typeck.c (cp_build_binary_op): Implement the -Wsizeof_pointer_div + warning. + 2017-06-01 Ville Voutilainen PR c++/80812 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index c657b3b9812..334a6f5938b 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4357,6 +4357,29 @@ cp_build_binary_op (location_t location, case FLOOR_DIV_EXPR: case ROUND_DIV_EXPR: case EXACT_DIV_EXPR: + if (TREE_CODE (op0) == SIZEOF_EXPR && TREE_CODE (op1) == SIZEOF_EXPR) + { + tree type0 = TREE_OPERAND (op0, 0); + tree type1 = TREE_OPERAND (op1, 0); + tree first_arg = type0; + if (!TYPE_P (type0)) + type0 = TREE_TYPE (type0); + if (!TYPE_P (type1)) + type1 = TREE_TYPE (type1); + if (POINTER_TYPE_P (type0) && same_type_p (TREE_TYPE (type0), type1) + && !(TREE_CODE (first_arg) == PARM_DECL + && DECL_ARRAY_PARAMETER_P (first_arg) + && warn_sizeof_array_argument) + && (complain & tf_warning)) + if (warning_at (location, OPT_Wsizeof_pointer_div, + "division % does " + "not compute the number of array elements", + type0, type1)) + if (DECL_P (first_arg)) + inform (DECL_SOURCE_LOCATION (first_arg), + "first % operand was declared here"); + } + if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE || code0 == VECTOR_TYPE) && (code1 == INTEGER_TYPE || code1 == REAL_TYPE diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 59563aa3d94..819e80070cd 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -306,7 +306,7 @@ Objective-C and Objective-C++ Dialects}. -Wshift-overflow -Wshift-overflow=@var{n} @gol -Wshift-count-negative -Wshift-count-overflow -Wshift-negative-value @gol -Wsign-compare -Wsign-conversion -Wfloat-conversion @gol --Wno-scalar-storage-order @gol +-Wno-scalar-storage-order -Wsizeof-pointer-div @gol -Wsizeof-pointer-memaccess -Wsizeof-array-argument @gol -Wstack-protector -Wstack-usage=@var{len} -Wstrict-aliasing @gol -Wstrict-aliasing=n -Wstrict-overflow -Wstrict-overflow=@var{n} @gol @@ -3832,6 +3832,7 @@ Options} and @ref{Objective-C and Objective-C++ Dialect Options}. -Wreturn-type @gol -Wsequence-point @gol -Wsign-compare @r{(only in C++)} @gol +-Wsizeof-pointer-div @gol -Wsizeof-pointer-memaccess @gol -Wstrict-aliasing @gol -Wstrict-overflow=1 @gol @@ -6093,6 +6094,15 @@ void operator delete[] (void *, std::size_t) noexcept; or vice versa. Enabled by @option{-Wextra} along with @option{-fsized-deallocation}. +@item -Wsizeof-pointer-div +@opindex Wsizeof-pointer-div +@opindex Wno-sizeof-pointer-div +Warn for suspicious divisions of two sizeof expressions that divide +the pointer size by the element size, which is the usual way to compute +the array size but won't work out correctly with pointers. This warning +warns e.g.@: about @code{sizeof (ptr) / sizeof (ptr[0])} if @code{ptr} is +not an array, but a pointer. This warning is enabled by @option{-Wall}. + @item -Wsizeof-pointer-memaccess @opindex Wsizeof-pointer-memaccess @opindex Wno-sizeof-pointer-memaccess diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2785850d685..a4f3bc933fb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,25 @@ +2017-06-02 Bernd Edlinger + + * c-c++-common/Wsizeof-pointer-div.c: New test. + * gcc.dg/Wsizeof-pointer-memaccess1.c: Add test cases with parens. + * gcc.dg/torture/Wsizeof-pointer-memaccess1.c: Likewise. + * gcc.target/i386/sse-init-v4hi-1.c: Fix test case. + * gcc.target/i386/sse-init-v4sf-1.c: Likewise. + * gcc.target/i386/sse-set-ps-1.c: Likewise. + * gcc.target/i386/sse2-init-v16qi-1.c: Likewise. + * gcc.target/i386/sse2-init-v2di-1.c: Likewise. + * gcc.target/i386/sse2-init-v4si-1.c: Likewise. + * gcc.target/i386/sse2-init-v8hi-1.c: Likewise. + * gcc.target/i386/sse2-set-epi32-1.c: Likewise. + * gcc.target/i386/sse2-set-epi64x-1.c: Likewise. + * gcc.target/i386/sse4_1-init-v16qi-1.c: Likewise. + * gcc.target/i386/sse4_1-init-v2di-1.c: Likewise. + * gcc.target/i386/sse4_1-init-v4sf-1.c: Likewise. + * gcc.target/i386/sse4_1-init-v4si-1.c: Likewise. + * gcc.target/i386/sse4_1-set-epi32-1.c: Likewise. + * gcc.target/i386/sse4_1-set-epi64x-1.c: Likewise. + * gcc.target/i386/sse4_1-set-ps-1.c: Likewise. + 2017-06-01 Will Schmidt * gcc.target/powerpc/fold-vec-logical-ors-longlong.c: diff --git a/gcc/testsuite/c-c++-common/Wsizeof-pointer-div.c b/gcc/testsuite/c-c++-common/Wsizeof-pointer-div.c new file mode 100644 index 00000000000..83116183902 --- /dev/null +++ b/gcc/testsuite/c-c++-common/Wsizeof-pointer-div.c @@ -0,0 +1,42 @@ +/* Test -Wsizeof-pointer-div warnings. */ +/* { dg-do compile } */ +/* { dg-options "-Wall" } */ + +int +f1 (int *array) +{ + int i; + i = sizeof array / sizeof *array; /* { dg-warning "does not compute the number of array elements" } */ + i += sizeof array / sizeof array[0]; /* { dg-warning "does not compute the number of array elements" } */ + i += sizeof(array) / sizeof(*array); /* { dg-warning "does not compute the number of array elements" } */ + i += sizeof(array) / sizeof(array[0]); /* { dg-warning "does not compute the number of array elements" } */ + i += (sizeof(array)) / (sizeof(array[0])); /* { dg-warning "does not compute the number of array elements" } */ + i += sizeof(array) / sizeof(int); /* { dg-warning "does not compute the number of array elements" } */ + i += sizeof(array) / sizeof(char); + i += sizeof(*array) / sizeof(char); + i += sizeof(array[0]) / sizeof(char); + return i; +} + +int +f2 (void) +{ + int array[10]; + int i; + i = sizeof array / sizeof *array; + i += sizeof array / sizeof array[0]; + i += sizeof(array) / sizeof(*array); + i += sizeof(array) / sizeof(array[0]); + i += (sizeof(array)) / (sizeof(array[0])); + i += sizeof(array) / sizeof(int); + i += sizeof(array) / sizeof(char); + i += sizeof(*array) / sizeof(char); + i += sizeof(array[0]) / sizeof(char); + return i; +} + +int +f3 (int a[]) +{ + return sizeof a / sizeof *a; /* { dg-warning "Wsizeof-array-argument" } */ +} diff --git a/gcc/testsuite/gcc.dg/Wsizeof-pointer-memaccess1.c b/gcc/testsuite/gcc.dg/Wsizeof-pointer-memaccess1.c index ebdef690879..7feb122b553 100644 --- a/gcc/testsuite/gcc.dg/Wsizeof-pointer-memaccess1.c +++ b/gcc/testsuite/gcc.dg/Wsizeof-pointer-memaccess1.c @@ -73,6 +73,15 @@ f1 (void *x, int z) z += bcmp (x, pa2, sizeof (PTA)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" } */ z += bcmp (x, pa3, sizeof (PA)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" } */ + z += bcmp (x, (&a), (sizeof (&a))); /* { dg-warning "call is the same expression as the second source; did you mean to remove the addressof" } */ + z += bcmp (x, (pa1), (sizeof (pa1))); /* { dg-warning "call is the same expression as the second source; did you mean to dereference it" } */ + z += bcmp (x, (pa2), (sizeof pa2)); /* { dg-warning "call is the same expression as the second source; did you mean to dereference it" } */ + z += bcmp (x, (pa3), (sizeof (pa3))); /* { dg-warning "call is the same expression as the second source; did you mean to dereference it" } */ + z += bcmp (x, (pa4), (sizeof pa4)); /* { dg-warning "call is the same expression as the second source; did you mean to dereference it" } */ + z += bcmp (x, (pa1), (sizeof (struct A *)));/* { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" } */ + z += bcmp (x, (pa2), (sizeof (PTA))); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" } */ + z += bcmp (x, (pa3), (sizeof (PA))); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" } */ + /* These are correct, no warning. */ bzero (&a, sizeof a); bzero (&a, sizeof (a)); diff --git a/gcc/testsuite/gcc.dg/torture/Wsizeof-pointer-memaccess1.c b/gcc/testsuite/gcc.dg/torture/Wsizeof-pointer-memaccess1.c index a73e45fb809..f9bc57c4e86 100644 --- a/gcc/testsuite/gcc.dg/torture/Wsizeof-pointer-memaccess1.c +++ b/gcc/testsuite/gcc.dg/torture/Wsizeof-pointer-memaccess1.c @@ -150,6 +150,15 @@ f1 (void *x, int z) z += memcmp (x, pa2, sizeof (PTA)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" } */ z += memcmp (x, pa3, sizeof (PA)); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" } */ + z += memcmp (x, (&a), (sizeof (&a))); /* { dg-warning "call is the same expression as the second source; did you mean to remove the addressof" } */ + z += memcmp (x, (pa1), (sizeof (pa1))); /* { dg-warning "call is the same expression as the second source; did you mean to dereference it" } */ + z += memcmp (x, (pa2), (sizeof pa2)); /* { dg-warning "call is the same expression as the second source; did you mean to dereference it" } */ + z += memcmp (x, (pa3), (sizeof (pa3))); /* { dg-warning "call is the same expression as the second source; did you mean to dereference it" } */ + z += memcmp (x, (pa4), (sizeof pa4)); /* { dg-warning "call is the same expression as the second source; did you mean to dereference it" } */ + z += memcmp (x, (pa1), (sizeof (struct A *)));/* { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" } */ + z += memcmp (x, (pa2), (sizeof (PTA))); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" } */ + z += memcmp (x, (pa3), (sizeof (PA))); /* { dg-warning "call is the same pointer type \[^\n\r\]* as the second source; expected \[^\n\r\]* or an explicit length" } */ + /* These are correct, no warning. */ memset (&a, 0, sizeof a); memset (&a, 0, sizeof (a)); diff --git a/gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c b/gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c index f2513154788..1a9b11f4dd5 100644 --- a/gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c @@ -17,13 +17,13 @@ check (__m64 x, unsigned short *v, int j) union { __m64 x; - unsigned short i[8]; + unsigned short i[4]; } u; unsigned int i; u.x = x; - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (i == j) { if (v[i] != u.i[i]) diff --git a/gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c b/gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c index eea03ecadea..2e9d53e6d75 100644 --- a/gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c @@ -23,7 +23,7 @@ check (__m128 x, float *v, int j) u.x = x; - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (i == j) { if (v[i] != u.f[i]) diff --git a/gcc/testsuite/gcc.target/i386/sse-set-ps-1.c b/gcc/testsuite/gcc.target/i386/sse-set-ps-1.c index 5a0c9b95d66..a14351555f7 100644 --- a/gcc/testsuite/gcc.target/i386/sse-set-ps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse-set-ps-1.c @@ -23,7 +23,7 @@ test (float *v) u.x = _mm_set_ps (v[3], v[2], v[1], v[0]); - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (v[i] != u.f[i]) { #ifdef DEBUG diff --git a/gcc/testsuite/gcc.target/i386/sse2-init-v16qi-1.c b/gcc/testsuite/gcc.target/i386/sse2-init-v16qi-1.c index 6528800462d..6dcb4fffa21 100644 --- a/gcc/testsuite/gcc.target/i386/sse2-init-v16qi-1.c +++ b/gcc/testsuite/gcc.target/i386/sse2-init-v16qi-1.c @@ -23,7 +23,7 @@ check (__m128i x, unsigned char *v, int j) u.x = x; - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (i == j) { if (v[i] != u.i[i]) diff --git a/gcc/testsuite/gcc.target/i386/sse2-init-v2di-1.c b/gcc/testsuite/gcc.target/i386/sse2-init-v2di-1.c index ef1863c57dc..07c625b2e7f 100644 --- a/gcc/testsuite/gcc.target/i386/sse2-init-v2di-1.c +++ b/gcc/testsuite/gcc.target/i386/sse2-init-v2di-1.c @@ -23,7 +23,7 @@ check (__m128i x, unsigned long long *v, int j) u.x = x; - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (i == j) { if (v[i] != u.i[i]) diff --git a/gcc/testsuite/gcc.target/i386/sse2-init-v4si-1.c b/gcc/testsuite/gcc.target/i386/sse2-init-v4si-1.c index bcb94055c41..359744a842a 100644 --- a/gcc/testsuite/gcc.target/i386/sse2-init-v4si-1.c +++ b/gcc/testsuite/gcc.target/i386/sse2-init-v4si-1.c @@ -23,7 +23,7 @@ check (__m128i x, unsigned int *v, int j) u.x = x; - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (i == j) { if (v[i] != u.i[i]) diff --git a/gcc/testsuite/gcc.target/i386/sse2-init-v8hi-1.c b/gcc/testsuite/gcc.target/i386/sse2-init-v8hi-1.c index 62734820d95..cc6ff6840e6 100644 --- a/gcc/testsuite/gcc.target/i386/sse2-init-v8hi-1.c +++ b/gcc/testsuite/gcc.target/i386/sse2-init-v8hi-1.c @@ -23,7 +23,7 @@ check (__m128i x, unsigned short *v, int j) u.x = x; - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (i == j) { if (v[i] != u.i[i]) diff --git a/gcc/testsuite/gcc.target/i386/sse2-set-epi32-1.c b/gcc/testsuite/gcc.target/i386/sse2-set-epi32-1.c index c1f5d0f7434..e7bbe2dfbed 100644 --- a/gcc/testsuite/gcc.target/i386/sse2-set-epi32-1.c +++ b/gcc/testsuite/gcc.target/i386/sse2-set-epi32-1.c @@ -23,7 +23,7 @@ test (unsigned int *v) u.x = _mm_set_epi32 (v[3], v[2], v[1], v[0]); - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (v[i] != u.i[i]) { #ifdef DEBUG diff --git a/gcc/testsuite/gcc.target/i386/sse2-set-epi64x-1.c b/gcc/testsuite/gcc.target/i386/sse2-set-epi64x-1.c index ac32015a72c..0d88f9862bf 100644 --- a/gcc/testsuite/gcc.target/i386/sse2-set-epi64x-1.c +++ b/gcc/testsuite/gcc.target/i386/sse2-set-epi64x-1.c @@ -23,7 +23,7 @@ test (unsigned long long *v) u.x = _mm_set_epi64x (v[1], v[0]); - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (v[i] != u.i[i]) { #ifdef DEBUG diff --git a/gcc/testsuite/gcc.target/i386/sse4_1-init-v16qi-1.c b/gcc/testsuite/gcc.target/i386/sse4_1-init-v16qi-1.c index 6a3ccee583e..43c1d6232d6 100644 --- a/gcc/testsuite/gcc.target/i386/sse4_1-init-v16qi-1.c +++ b/gcc/testsuite/gcc.target/i386/sse4_1-init-v16qi-1.c @@ -23,7 +23,7 @@ check (__m128i x, unsigned char *v, int j) u.x = x; - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (i == j) { if (v[i] != u.i[i]) diff --git a/gcc/testsuite/gcc.target/i386/sse4_1-init-v2di-1.c b/gcc/testsuite/gcc.target/i386/sse4_1-init-v2di-1.c index cd9fa797853..25d9a66167b 100644 --- a/gcc/testsuite/gcc.target/i386/sse4_1-init-v2di-1.c +++ b/gcc/testsuite/gcc.target/i386/sse4_1-init-v2di-1.c @@ -23,7 +23,7 @@ check (__m128i x, unsigned long long *v, int j) u.x = x; - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (i == j) { if (v[i] != u.i[i]) diff --git a/gcc/testsuite/gcc.target/i386/sse4_1-init-v4sf-1.c b/gcc/testsuite/gcc.target/i386/sse4_1-init-v4sf-1.c index f9760423517..1be2e62da14 100644 --- a/gcc/testsuite/gcc.target/i386/sse4_1-init-v4sf-1.c +++ b/gcc/testsuite/gcc.target/i386/sse4_1-init-v4sf-1.c @@ -23,7 +23,7 @@ check (__m128 x, float *v, int j) u.x = x; - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (i == j) { if (v[i] != u.f[i]) diff --git a/gcc/testsuite/gcc.target/i386/sse4_1-init-v4si-1.c b/gcc/testsuite/gcc.target/i386/sse4_1-init-v4si-1.c index 63501b7eebe..ae7142b3ad6 100644 --- a/gcc/testsuite/gcc.target/i386/sse4_1-init-v4si-1.c +++ b/gcc/testsuite/gcc.target/i386/sse4_1-init-v4si-1.c @@ -23,7 +23,7 @@ check (__m128i x, unsigned int *v, int j) u.x = x; - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (i == j) { if (v[i] != u.i[i]) diff --git a/gcc/testsuite/gcc.target/i386/sse4_1-set-epi32-1.c b/gcc/testsuite/gcc.target/i386/sse4_1-set-epi32-1.c index 989e4f7086f..75d7aec85eb 100644 --- a/gcc/testsuite/gcc.target/i386/sse4_1-set-epi32-1.c +++ b/gcc/testsuite/gcc.target/i386/sse4_1-set-epi32-1.c @@ -23,7 +23,7 @@ test (unsigned int *v) u.x = _mm_set_epi32 (v[3], v[2], v[1], v[0]); - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (v[i] != u.i[i]) { #ifdef DEBUG diff --git a/gcc/testsuite/gcc.target/i386/sse4_1-set-epi64x-1.c b/gcc/testsuite/gcc.target/i386/sse4_1-set-epi64x-1.c index 8679f52860f..068d0a79c70 100644 --- a/gcc/testsuite/gcc.target/i386/sse4_1-set-epi64x-1.c +++ b/gcc/testsuite/gcc.target/i386/sse4_1-set-epi64x-1.c @@ -23,7 +23,7 @@ test (unsigned long long *v) u.x = _mm_set_epi64x (v[1], v[0]); - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (v[i] != u.i[i]) { #ifdef DEBUG diff --git a/gcc/testsuite/gcc.target/i386/sse4_1-set-ps-1.c b/gcc/testsuite/gcc.target/i386/sse4_1-set-ps-1.c index fe77d94ad7d..aab1e51a02c 100644 --- a/gcc/testsuite/gcc.target/i386/sse4_1-set-ps-1.c +++ b/gcc/testsuite/gcc.target/i386/sse4_1-set-ps-1.c @@ -23,7 +23,7 @@ test (float *v) u.x = _mm_set_ps (v[3], v[2], v[1], v[0]); - for (i = 0; i < sizeof (v) / sizeof (v[0]); i++) + for (i = 0; i < sizeof (u) / sizeof (v[0]); i++) if (v[i] != u.f[i]) { #ifdef DEBUG diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index a51228b4504..f9f60264af0 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,8 @@ +2017-06-02 Bernd Edlinger + + * testsuite/libgomp.c/pr39591-2.c: Fix test case. + * testsuite/libgomp.c/pr39591-3.c: Likewise. + 2017-05-30 Jakub Jelinek PR libgomp/80822 diff --git a/libgomp/testsuite/libgomp.c/pr39591-2.c b/libgomp/testsuite/libgomp.c/pr39591-2.c index 37428296e53..2fe6421aef4 100644 --- a/libgomp/testsuite/libgomp.c/pr39591-2.c +++ b/libgomp/testsuite/libgomp.c/pr39591-2.c @@ -11,7 +11,7 @@ foo (int *array) #pragma omp task { int j; - for (j = 0; j < sizeof array / sizeof array[0]; j++) + for (j = 0; j < 40; j++) if (array[j] != 0x55555555) #pragma omp atomic err++; diff --git a/libgomp/testsuite/libgomp.c/pr39591-3.c b/libgomp/testsuite/libgomp.c/pr39591-3.c index f09a3890f0d..81e8ca8e497 100644 --- a/libgomp/testsuite/libgomp.c/pr39591-3.c +++ b/libgomp/testsuite/libgomp.c/pr39591-3.c @@ -11,7 +11,7 @@ foo (int *array) #pragma omp task { int j; - for (j = 0; j < sizeof array / sizeof array[0]; j++) + for (j = 0; j < 40; j++) if (array[j] != 0x55555555) #pragma omp atomic err++; -- 2.30.2