aboutsummaryrefslogtreecommitdiff
path: root/gcc/c
diff options
context:
space:
mode:
authorBernd Edlinger <bernd.edlinger@hotmail.de>2017-06-02 04:06:59 +0000
committerBernd Edlinger <edlinger@gcc.gnu.org>2017-06-02 04:06:59 +0000
commit40ffd95f56ad178148612c19304a4409d0a7ebac (patch)
tree29d5e4f52493dd00dab2bb7847d93038918e9f81 /gcc/c
parent616dbacbac0a0d88551a2acafd0d84cf20f91d17 (diff)
downloadgcc-40ffd95f56ad178148612c19304a4409d0a7ebac.zip
gcc-40ffd95f56ad178148612c19304a4409d0a7ebac.tar.gz
gcc-40ffd95f56ad178148612c19304a4409d0a7ebac.tar.bz2
invoke.texi: Document the -Wsizeof-pointer-div warning.
gcc: 2017-06-02 Bernd Edlinger <bernd.edlinger@hotmail.de> * doc/invoke.texi: Document the -Wsizeof-pointer-div warning. gcc/c-family: 2017-06-02 Bernd Edlinger <bernd.edlinger@hotmail.de> * c.opt (Wsizeof-pointer-div): New warning option. gcc/c: 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. gcc/cp: 2017-06-02 Bernd Edlinger <bernd.edlinger@hotmail.de> * typeck.c (cp_build_binary_op): Implement the -Wsizeof_pointer_div warning. gcc/testsuite: 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. * libgomp.c/pr39591-2.c: Likewise. * libgomp.c/pr39591-3.c: Likewise. From-SVN: r248811
Diffstat (limited to 'gcc/c')
-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
4 files changed, 48 insertions, 14 deletions
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)