From: Jakub Jelinek Date: Sat, 15 Nov 2008 09:53:02 +0000 (+0100) Subject: re PR c++/37561 (Revision 140405 caused g++.old-deja/g++.mike/warn1.C) X-Git-Tag: releases/gcc-4.4.0~1655 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b70cef5d743a294b00b863f8caf80342f33f8100;p=thirdparty%2Fgcc.git re PR c++/37561 (Revision 140405 caused g++.old-deja/g++.mike/warn1.C) PR c++/37561 * 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. From-SVN: r141881 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 34a5dc778ac6..4c8b9a1dae03 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-11-15 Jakub Jelinek + + 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 * ira-int.h (struct ira_loop_tree_node): Improve comments for diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index b322db4ea519..c751b4f0e917 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -3080,9 +3080,7 @@ build_unary_op (location_t location, { tree inc; - tree result_type = TREE_TYPE (arg); - arg = get_unwidened (arg, 0); argtype = TREE_TYPE (arg); /* Compute the increment. */ @@ -3091,7 +3089,7 @@ build_unary_op (location_t location, { /* 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, @@ -3100,8 +3098,8 @@ build_unary_op (location_t 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, @@ -3111,10 +3109,10 @@ build_unary_op (location_t location, "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 @@ -3161,7 +3159,6 @@ build_unary_op (location_t location, 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; diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a4dbc86f8bc0..e6fbdfbd2913 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2008-11-15 Jakub Jelinek + + 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 PR c++/38030 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 321f76b32702..7595b58da72e 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4348,12 +4348,8 @@ cp_build_unary_op (enum tree_code code, tree xarg, int noconvert, { 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. */ @@ -4427,7 +4423,7 @@ cp_build_unary_op (enum tree_code code, tree xarg, int noconvert, val = build2 (code, TREE_TYPE (arg), arg, inc); TREE_SIDE_EFFECTS (val) = 1; - return cp_convert (result_type, val); + return val; } case ADDR_EXPR: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 51bb931672ec..b64bf6356f78 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2008-11-15 Jakub Jelinek + + PR c++/37561 + * gcc.dg/pr37561.c: New test. + * g++.dg/other/increment1.C: New test. + 2008-11-14 Jerry DeLisle PR fortran/37988 diff --git a/gcc/testsuite/g++.dg/other/increment1.C b/gcc/testsuite/g++.dg/other/increment1.C new file mode 100644 index 000000000000..c36e5731f3b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/increment1.C @@ -0,0 +1,18 @@ +// 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" } +} diff --git a/gcc/testsuite/gcc.dg/pr37561.c b/gcc/testsuite/gcc.dg/pr37561.c new file mode 100644 index 000000000000..82eca9640081 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr37561.c @@ -0,0 +1,23 @@ +/* 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 } */