aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/c-family/ChangeLog4
-rw-r--r--gcc/c-family/c.opt4
-rw-r--r--gcc/c/ChangeLog11
-rw-r--r--gcc/c/c-parser.c47
-rw-r--r--gcc/c/c-tree.h1
-rw-r--r--gcc/c/c-typeck.c3
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/typeck.c23
-rw-r--r--gcc/doc/invoke.texi12
-rw-r--r--gcc/testsuite/ChangeLog22
-rw-r--r--gcc/testsuite/c-c++-common/Wsizeof-pointer-div.c42
-rw-r--r--gcc/testsuite/gcc.dg/Wsizeof-pointer-memaccess1.c9
-rw-r--r--gcc/testsuite/gcc.dg/torture/Wsizeof-pointer-memaccess1.c9
-rw-r--r--gcc/testsuite/gcc.target/i386/sse-init-v4hi-1.c4
-rw-r--r--gcc/testsuite/gcc.target/i386/sse-init-v4sf-1.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/sse-set-ps-1.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/sse2-init-v16qi-1.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/sse2-init-v2di-1.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/sse2-init-v4si-1.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/sse2-init-v8hi-1.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/sse2-set-epi32-1.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/sse2-set-epi64x-1.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/sse4_1-init-v16qi-1.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/sse4_1-init-v2di-1.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/sse4_1-init-v4sf-1.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/sse4_1-init-v4si-1.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/sse4_1-set-epi32-1.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/sse4_1-set-epi64x-1.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/sse4_1-set-ps-1.c2
-rw-r--r--libgomp/ChangeLog5
-rw-r--r--libgomp/testsuite/libgomp.c/pr39591-2.c2
-rw-r--r--libgomp/testsuite/libgomp.c/pr39591-3.c2
33 files changed, 205 insertions, 34 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2947735..3700ebc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2017-06-02 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ * doc/invoke.texi: Document the -Wsizeof-pointer-div warning.
+
2017-06-01 Bernd Edlinger <bernd.edlinger@hotmail.de>
* 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 8e163cd..0d54c90 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,7 @@
+2017-06-02 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ * c.opt (Wsizeof-pointer-div): New warning option.
+
2017-06-01 Volker Reichelt <v.reichelt@netcologne.de>
* 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 a8543de..37bb236 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 c53a4bf..d849b01 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,14 @@
+2017-06-02 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ * 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 <maltsevm@gmail.com>
PR testsuite/80580
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index 03c711b..6f954f2 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 %<sizeof (%T) / sizeof (%T)%> does " \
+ "not compute the number of array elements", \
+ type0, type1)) \
+ if (DECL_P (first_arg)) \
+ inform (DECL_SOURCE_LOCATION (first_arg), \
+ "first %<sizeof%> 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<tree, va_gc> *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 17a8897..ce25fae 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 95a607a..467552ce 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 64f476a..03392ca 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2017-06-02 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ * typeck.c (cp_build_binary_op): Implement the -Wsizeof_pointer_div
+ warning.
+
2017-06-01 Ville Voutilainen <ville.voutilainen@gmail.com>
PR c++/80812
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index c657b3b..334a6f5 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 %<sizeof (%T) / sizeof (%T)%> does "
+ "not compute the number of array elements",
+ type0, type1))
+ if (DECL_P (first_arg))
+ inform (DECL_SOURCE_LOCATION (first_arg),
+ "first %<sizeof%> 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 59563aa..819e800 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 2785850..a4f3bc9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,25 @@
+2017-06-02 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ * 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 <will_schmidt@vnet.ibm.com>
* 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 0000000..8311618
--- /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 ebdef69..7feb122 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 a73e45f..f9bc57c 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 f251315..1a9b11f 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 eea03ec..2e9d53e 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 5a0c9b9..a143515 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 6528800..6dcb4ff 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 ef1863c..07c625b 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 bcb9405..359744a 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 6273482..cc6ff68 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 c1f5d0f..e7bbe2d 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 ac32015..0d88f98 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 6a3ccee..43c1d62 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 cd9fa79..25d9a66 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 f976042..1be2e62 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 63501b7..ae7142b 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 989e4f7..75d7aec 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 8679f528..068d0a7 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 fe77d94..aab1e51 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 a51228b..f9f6026 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,8 @@
+2017-06-02 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ * testsuite/libgomp.c/pr39591-2.c: Fix test case.
+ * testsuite/libgomp.c/pr39591-3.c: Likewise.
+
2017-05-30 Jakub Jelinek <jakub@redhat.com>
PR libgomp/80822
diff --git a/libgomp/testsuite/libgomp.c/pr39591-2.c b/libgomp/testsuite/libgomp.c/pr39591-2.c
index 3742829..2fe6421 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 f09a389..81e8ca8 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++;