diff options
author | Marek Polacek <polacek@redhat.com> | 2015-06-04 08:17:45 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2015-06-04 08:17:45 +0000 |
commit | 9482b620d208237366e9d052918757cc5c17f519 (patch) | |
tree | 0ae98c0e9dd440292c437f415548e76661933de5 /gcc | |
parent | 0b98bb4e15faed6a72fa9a0f27a6e973cb8e5e70 (diff) | |
download | gcc-9482b620d208237366e9d052918757cc5c17f519.zip gcc-9482b620d208237366e9d052918757cc5c17f519.tar.gz gcc-9482b620d208237366e9d052918757cc5c17f519.tar.bz2 |
re PR c/66341 (Some casts wrongly produce a lvalue)
PR c/66341
* c-typeck.c (build_c_cast): Wrap VALUE into NON_LVALUE_EXPR if
it is a lvalue.
* gcc.dg/lvalue-8.c: New test.
From-SVN: r224115
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c/c-typeck.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/lvalue-8.c | 19 |
4 files changed, 31 insertions, 1 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 69344bb..d6be87f 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2015-06-04 Marek Polacek <polacek@redhat.com> + + PR c/66341 + * c-typeck.c (build_c_cast): Wrap VALUE into NON_LVALUE_EXPR if + it is a lvalue. + 2015-06-03 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> * c-decl.c (warn_cxx_compat_finish_struct): New parameters code, record_loc. diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index f55d4c6..6b313f3 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -5195,7 +5195,7 @@ build_c_cast (location_t loc, tree type, tree expr) } /* Don't let a cast be an lvalue. */ - if (value == expr) + if (lvalue_p (value)) value = non_lvalue_loc (loc, value); /* Don't allow the results of casting to floating-point or complex diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a74be77..3092acf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-06-04 Marek Polacek <polacek@redhat.com> + + PR c/66341 + * gcc.dg/lvalue-8.c: New test. + 2015-06-03 Manuel López-Ibáñez <manu@gcc.gnu.org> Paolo Carlini <paolo.carlini@oracle.com> diff --git a/gcc/testsuite/gcc.dg/lvalue-8.c b/gcc/testsuite/gcc.dg/lvalue-8.c new file mode 100644 index 0000000..04eeb71 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lvalue-8.c @@ -0,0 +1,19 @@ +/* PR c/66341 */ +/* { dg-do compile } */ + +void +foo (int *p) +{ + p = 0; + /* A cast does not yield an lvalue. */ + (int *) p = 0; /* { dg-error "lvalue required as left operand of assignment" } */ + /* A cast to a qualified type has the same effect as a cast + to the unqualified version of the type. */ + (int *const) p = 0; /* { dg-error "lvalue required as left operand of assignment" } */ + (int *) (char *) p = 0; /* { dg-error "lvalue required as left operand of assignment" } */ + (int *) (char *) (int *) p = 0; /* { dg-error "lvalue required as left operand of assignment" } */ + (int *) (char *) (int *) (char *) p = 0; /* { dg-error "lvalue required as left operand of assignment" } */ + (int *) (double *) p = 0; /* { dg-error "lvalue required as left operand of assignment" } */ + (int *) (int *) p = 0; /* { dg-error "lvalue required as left operand of assignment" } */ + (int *) (int *const) p = 0; /* { dg-error "lvalue required as left operand of assignment" } */ +} |