* c-typeck.c (build_unary_op): Don't call get_unwidened. Use
argtype instead of result_type.
* typeck.c (cp_build_unary_op): Don't call get_unwidened. Use
argtype instead of result_type.
* gcc.dg/pr37561.c: New test.
* g++.dg/other/increment1.C: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@141881
138bc75d-0d04-0410-961f-
82ee72b054a4
+2008-11-15 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/37561
+ * c-typeck.c (build_unary_op): Don't call get_unwidened. Use
+ argtype instead of result_type.
+
2008-11-14 Adam Nemet <anemet@caviumnetworks.com>
* ira-int.h (struct ira_loop_tree_node): Improve comments for
{
tree inc;
- tree result_type = TREE_TYPE (arg);
- arg = get_unwidened (arg, 0);
argtype = TREE_TYPE (arg);
/* Compute the increment. */
{
/* If pointer target is an undefined struct,
we just cannot know how to do the arithmetic. */
- if (!COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (result_type)))
+ if (!COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (argtype)))
{
if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
error_at (location,
error_at (location,
"decrement of pointer to unknown structure");
}
- else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE
- || TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE)
+ else if (TREE_CODE (TREE_TYPE (argtype)) == FUNCTION_TYPE
+ || TREE_CODE (TREE_TYPE (argtype)) == VOID_TYPE)
{
if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
pedwarn (location, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
"wrong type argument to decrement");
}
- inc = c_size_in_bytes (TREE_TYPE (result_type));
+ inc = c_size_in_bytes (TREE_TYPE (argtype));
inc = fold_convert (sizetype, inc);
}
- else if (FRACT_MODE_P (TYPE_MODE (result_type)))
+ else if (FRACT_MODE_P (TYPE_MODE (argtype)))
{
/* For signed fract types, we invert ++ to -- or
-- to ++, and change inc from 1 to -1, because
else
val = build2 (code, TREE_TYPE (arg), arg, inc);
TREE_SIDE_EFFECTS (val) = 1;
- val = convert (result_type, val);
if (TREE_CODE (val) != code)
TREE_NO_WARNING (val) = 1;
ret = val;
+2008-11-15 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/37561
+ * typeck.c (cp_build_unary_op): Don't call get_unwidened. Use
+ argtype instead of result_type.
+
2008-11-14 Jason Merrill <jason@redhat.com>
PR c++/38030
{
tree inc;
- tree declared_type;
- tree result_type = TREE_TYPE (arg);
+ tree declared_type = unlowered_expr_type (arg);
- declared_type = unlowered_expr_type (arg);
-
- arg = get_unwidened (arg, 0);
argtype = TREE_TYPE (arg);
/* ARM $5.2.5 last annotation says this should be forbidden. */
val = build2 (code, TREE_TYPE (arg), arg, inc);
TREE_SIDE_EFFECTS (val) = 1;
- return cp_convert (result_type, val);
+ return val;
}
case ADDR_EXPR:
+2008-11-15 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/37561
+ * gcc.dg/pr37561.c: New test.
+ * g++.dg/other/increment1.C: New test.
+
2008-11-14 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/37988
--- /dev/null
+// PR c++/37561
+// { dg-do compile }
+
+__PTRDIFF_TYPE__ p;
+char q;
+
+void
+foo ()
+{
+ ((char *) p)++; // { dg-error "lvalue" }
+ ((char *) q)++; // { dg-error "lvalue" }
+ ((char *) p)--; // { dg-error "lvalue" }
+ ((char *) q)--; // { dg-error "lvalue" }
+ ++(char *) p; // { dg-error "lvalue" }
+ ++(char *) q; // { dg-error "lvalue" }
+ --(char *) p; // { dg-error "lvalue" }
+ --(char *) q; // { dg-error "lvalue" }
+}
--- /dev/null
+/* PR c++/37561 */
+/* { dg-do compile } */
+
+__PTRDIFF_TYPE__ p;
+char q;
+
+void
+foo ()
+{
+ ((char *) p)++; /* { dg-error "lvalue" } */
+ ((char *) q)++; /* { dg-error "lvalue" } */
+ ((char *) p)--; /* { dg-error "lvalue" } */
+ ((char *) q)--; /* { dg-error "lvalue" } */
+ ++(char *) p; /* { dg-error "lvalue" } */
+ ++(char *) q; /* { dg-error "lvalue" } */
+ --(char *) p; /* { dg-error "lvalue" } */
+ --(char *) q; /* { dg-error "lvalue" } */
+}
+
+/* { dg-warning "cast to pointer from integer of different size" "" { target *-*-* } 11 } */
+/* { dg-warning "cast to pointer from integer of different size" "" { target *-*-* } 13 } */
+/* { dg-warning "cast to pointer from integer of different size" "" { target *-*-* } 15 } */
+/* { dg-warning "cast to pointer from integer of different size" "" { target *-*-* } 17 } */