mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-22 08:59:10 +08:00
revert: re PR c++/35652 (offset warning should be given in the front-end)
Revert: PR c++/35652 2009-03-27 Manuel Lopez-Ibanez <manu@gcc.gnu.org> gcc/ * builtins.c (c_strlen): Do not warn here. * c-typeck.c (build_binary_op): Adjust calls to pointer_int_sum. * c-common.c (pointer_int_sum): Take an explicit location. Warn about offsets out of bounds. * c-common.h (pointer_int_sum): Adjust declaration. cp/ * typeck.c (cp_pointer_sum): Adjust call to pointer_int_sum. testsuite/ * gcc.dg/pr35652.C: New. * g++.dg/warn/pr35652.C: New. * gcc.dg/format/plus-1.c: Adjust message. From-SVN: r146870
This commit is contained in:
parent
903db43579
commit
b2ed71b61a
@ -1,3 +1,16 @@
|
||||
2009-04-28 Ben Elliston <bje@au.ibm.com>
|
||||
|
||||
PR c++/35652
|
||||
Revert:
|
||||
|
||||
2009-03-27 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
|
||||
|
||||
* builtins.c (c_strlen): Do not warn here.
|
||||
* c-typeck.c (build_binary_op): Adjust calls to pointer_int_sum.
|
||||
* c-common.c (pointer_int_sum): Take an explicit location.
|
||||
Warn about offsets out of bounds.
|
||||
* c-common.h (pointer_int_sum): Adjust declaration.
|
||||
|
||||
2009-04-27 Ian Lance Taylor <iant@google.com>
|
||||
|
||||
* collect2.c (is_ctor_dtor): Change type of ret field in struct
|
||||
|
@ -479,13 +479,16 @@ c_strlen (tree src, int only_value)
|
||||
else
|
||||
offset = tree_low_cst (offset_node, 0);
|
||||
|
||||
/* If the offset is known to be out of bounds, the front-end should
|
||||
have warned already. We call strlen at runtime.
|
||||
|
||||
??? Perhaps we should turn this into an assert and force
|
||||
front-ends to define offsets whtin boundaries. */
|
||||
/* If the offset is known to be out of bounds, warn, and call strlen at
|
||||
runtime. */
|
||||
if (offset < 0 || offset > max)
|
||||
{
|
||||
/* Suppress multiple warnings for propagated constant strings. */
|
||||
if (! TREE_NO_WARNING (src))
|
||||
{
|
||||
warning (0, "offset outside bounds of constant string");
|
||||
TREE_NO_WARNING (src) = 1;
|
||||
}
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
|
@ -3767,8 +3767,7 @@ shorten_compare (tree *op0_ptr, tree *op1_ptr, tree *restype_ptr,
|
||||
of pointer PTROP and integer INTOP. */
|
||||
|
||||
tree
|
||||
pointer_int_sum (location_t location, enum tree_code resultcode,
|
||||
tree ptrop, tree intop)
|
||||
pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop)
|
||||
{
|
||||
tree size_exp, ret;
|
||||
|
||||
@ -3777,19 +3776,19 @@ pointer_int_sum (location_t location, enum tree_code resultcode,
|
||||
|
||||
if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE)
|
||||
{
|
||||
pedwarn (location, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
|
||||
pedwarn (input_location, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
|
||||
"pointer of type %<void *%> used in arithmetic");
|
||||
size_exp = integer_one_node;
|
||||
}
|
||||
else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE)
|
||||
{
|
||||
pedwarn (location, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
|
||||
pedwarn (input_location, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
|
||||
"pointer to a function used in arithmetic");
|
||||
size_exp = integer_one_node;
|
||||
}
|
||||
else if (TREE_CODE (TREE_TYPE (result_type)) == METHOD_TYPE)
|
||||
{
|
||||
pedwarn (location, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
|
||||
pedwarn (input_location, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
|
||||
"pointer to member function used in arithmetic");
|
||||
size_exp = integer_one_node;
|
||||
}
|
||||
@ -3852,31 +3851,6 @@ pointer_int_sum (location_t location, enum tree_code resultcode,
|
||||
if (resultcode == MINUS_EXPR)
|
||||
intop = fold_build1 (NEGATE_EXPR, sizetype, intop);
|
||||
|
||||
if (TREE_CODE (intop) == INTEGER_CST)
|
||||
{
|
||||
tree offset_node;
|
||||
tree string_cst = string_constant (ptrop, &offset_node);
|
||||
|
||||
if (string_cst != 0
|
||||
&& !(offset_node && TREE_CODE (offset_node) != INTEGER_CST))
|
||||
{
|
||||
HOST_WIDE_INT max = TREE_STRING_LENGTH (string_cst);
|
||||
HOST_WIDE_INT offset;
|
||||
if (offset_node == 0)
|
||||
offset = 0;
|
||||
else if (! host_integerp (offset_node, 0))
|
||||
offset = -1;
|
||||
else
|
||||
offset = tree_low_cst (offset_node, 0);
|
||||
|
||||
offset = offset + tree_low_cst (intop, 0);
|
||||
if (offset < 0 || offset > max)
|
||||
warning_at (location, 0,
|
||||
"offset %<%wd%> outside bounds of constant string",
|
||||
tree_low_cst (intop, 0));
|
||||
}
|
||||
}
|
||||
|
||||
ret = fold_build2 (POINTER_PLUS_EXPR, result_type, ptrop, intop);
|
||||
|
||||
fold_undefer_and_ignore_overflow_warnings ();
|
||||
|
@ -817,7 +817,7 @@ extern tree shorten_binary_op (tree result_type, tree op0, tree op1, bool bitwis
|
||||
and, if so, perhaps change them both back to their original type. */
|
||||
extern tree shorten_compare (tree *, tree *, tree *, enum tree_code *);
|
||||
|
||||
extern tree pointer_int_sum (location_t, enum tree_code, tree, tree);
|
||||
extern tree pointer_int_sum (enum tree_code, tree, tree);
|
||||
|
||||
/* Add qualifiers to a type, in the fashion for C. */
|
||||
extern tree c_build_qualified_type (tree, int);
|
||||
|
@ -8882,12 +8882,12 @@ build_binary_op (location_t location, enum tree_code code,
|
||||
/* Handle the pointer + int case. */
|
||||
if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
|
||||
{
|
||||
ret = pointer_int_sum (location, PLUS_EXPR, op0, op1);
|
||||
ret = pointer_int_sum (PLUS_EXPR, op0, op1);
|
||||
goto return_build_binary_op;
|
||||
}
|
||||
else if (code1 == POINTER_TYPE && code0 == INTEGER_TYPE)
|
||||
{
|
||||
ret = pointer_int_sum (location, PLUS_EXPR, op1, op0);
|
||||
ret = pointer_int_sum (PLUS_EXPR, op1, op0);
|
||||
goto return_build_binary_op;
|
||||
}
|
||||
else
|
||||
@ -8906,7 +8906,7 @@ build_binary_op (location_t location, enum tree_code code,
|
||||
/* Handle pointer minus int. Just like pointer plus int. */
|
||||
else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
|
||||
{
|
||||
ret = pointer_int_sum (location, MINUS_EXPR, op0, op1);
|
||||
ret = pointer_int_sum (MINUS_EXPR, op0, op1);
|
||||
goto return_build_binary_op;
|
||||
}
|
||||
else
|
||||
|
@ -1,3 +1,12 @@
|
||||
2009-04-28 Ben Elliston <bje@au.ibm.com>
|
||||
|
||||
PR c++/35652
|
||||
Revert:
|
||||
|
||||
2009-03-27 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
|
||||
|
||||
* typeck.c (cp_pointer_sum): Adjust call to pointer_int_sum.
|
||||
|
||||
2009-04-27 Ian Lance Taylor <iant@google.com>
|
||||
|
||||
* semantics.c (finish_omp_clauses): Change type of c_kind to enum
|
||||
|
@ -4054,7 +4054,7 @@ cp_pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop)
|
||||
pointer_int_sum() anyway. */
|
||||
complete_type (TREE_TYPE (res_type));
|
||||
|
||||
return pointer_int_sum (input_location, resultcode, ptrop,
|
||||
return pointer_int_sum (resultcode, ptrop,
|
||||
fold_if_not_in_template (intop));
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,14 @@
|
||||
2009-04-28 Ben Elliston <bje@au.ibm.com>
|
||||
|
||||
PR c++/35652
|
||||
Revert:
|
||||
|
||||
2009-03-27 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
|
||||
|
||||
* gcc.dg/pr35652.C: New.
|
||||
* g++.dg/warn/pr35652.C: New.
|
||||
* gcc.dg/format/plus-1.c: Adjust message.
|
||||
|
||||
2009-04-27 DJ Delorie <dj@redhat.com>
|
||||
|
||||
* lib/target-supports.exp (check_effective_target_double64): New.
|
||||
|
@ -1,30 +0,0 @@
|
||||
// PR c++/35652: wrong location and duplicated warning.
|
||||
// { dg-do compile }
|
||||
// { dg-options "-fshow-column" }
|
||||
#include <string>
|
||||
int foo() {
|
||||
// blank line padding, could also be code...
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
std::string s = "";
|
||||
s += 'x' + "y"; // { dg-warning "14:offset '120' outside bounds of constant string" }
|
||||
// { dg-bogus "offset '120' outside bounds of constant string.*offset '120' outside bounds of constant string" "duplicated" { target *-*-* } 17 }
|
||||
}
|
||||
|
||||
int bar()
|
||||
{
|
||||
const char *s = 'z' + "y"; /* { dg-warning "25:offset '122' outside bounds of constant string" } */
|
||||
}
|
||||
|
||||
int g()
|
||||
{
|
||||
char str[2];
|
||||
const char *p = str + sizeof(str);
|
||||
}
|
@ -15,9 +15,6 @@ foo (int i)
|
||||
printf (3 + "%d\n"); /* { dg-warning "zero-length" "zero-length string" } */
|
||||
printf ("%d\n" + i, i); /* { dg-warning "not a string" "non-constant addend" } */
|
||||
printf ("%d\n" + 10); /* { dg-warning "not a string" "too large addend" } */
|
||||
/* { dg-warning "offset '10' outside bounds of constant string" "offset" { target *-*-* } 17 } */
|
||||
printf ("%d\n" - 1, i); /* { dg-warning "not a string" "minus constant" } */
|
||||
/* { dg-warning "offset '-1' outside bounds of constant string" "offset" { target *-*-* } 19 } */
|
||||
printf ("%d\n" + -1, i); /* { dg-warning "not a string" "negative addend" } */
|
||||
/* { dg-warning "offset '-1' outside bounds of constant string" "offset" { target *-*-* } 21 } */
|
||||
}
|
||||
|
@ -1,13 +0,0 @@
|
||||
/* PR c++/35652: wrong location and duplicated warning.
|
||||
{ dg-do compile }
|
||||
{ dg-options "" } */
|
||||
int bar()
|
||||
{
|
||||
const char *s = 'z' + "y"; /* { dg-warning "offset '122' outside bounds of constant string" } */
|
||||
}
|
||||
|
||||
int g()
|
||||
{
|
||||
char str[2];
|
||||
const char *p = str + sizeof(str);
|
||||
}
|
Loading…
Reference in New Issue
Block a user