diff options
author | Eric Botcazou <ebotcazou@libertysurf.fr> | 2003-10-04 20:02:32 +0200 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2003-10-04 18:02:32 +0000 |
commit | b494fd9851d66bf76000364d05bfca1acbf74066 (patch) | |
tree | ea93cb95fbf3f7b89f23547114e93eaef32cfd22 | |
parent | e9ff9b17a7c2b5dc5d3dd383dbe191c2354cd859 (diff) | |
download | gcc-b494fd9851d66bf76000364d05bfca1acbf74066.zip gcc-b494fd9851d66bf76000364d05bfca1acbf74066.tar.gz gcc-b494fd9851d66bf76000364d05bfca1acbf74066.tar.bz2 |
re PR c/12446 (ICE in emit_move_insn on complicated array reference)
PR c/12446
* c-typeck.c (convert_for_assignment): Issue an error for
array to pointer assignment after default conversion.
(digest_init): Likewise.
From-SVN: r72096
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/c-typeck.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/c90-array-lval-6.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/c99-array-lval-6.c | 15 |
5 files changed, 58 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c078689..b172400 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-10-04 Eric Botcazou <ebotcazou@libertysurf.fr> + + PR c/12446 + * c-typeck.c (convert_for_assignment): Issue an error for + array to pointer assignment after default conversion. + (digest_init): Likewise. + 2003-10-04 Fariborz Jahanian <fjahanian@apple.com> * c-decl.c (duplicate_decls): retain DECL_COMMON of old declaration diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 59110c8..eaad4fe 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -3556,6 +3556,11 @@ convert_for_assignment (tree type, tree rhs, const char *errtype, errtype, funname, parmnum); return convert (type, rhs); } + else if (codel == POINTER_TYPE && coder == ARRAY_TYPE) + { + error ("invalid use of non-lvalue array"); + return error_mark_node; + } else if (codel == POINTER_TYPE && coder == INTEGER_TYPE) { /* An explicit constant 0 can convert to a pointer, @@ -4052,8 +4057,16 @@ digest_init (tree type, tree init, int require_constant) TREE_TYPE (type), COMPARE_STRICT)))) { if (code == POINTER_TYPE) - inside_init = default_function_array_conversion (inside_init); - + { + inside_init = default_function_array_conversion (inside_init); + + if (TREE_CODE (TREE_TYPE (inside_init)) == ARRAY_TYPE) + { + error_init ("invalid use of non-lvalue array"); + return error_mark_node; + } + } + if (code == VECTOR_TYPE) /* Although the types are compatible, we may require a conversion. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 66151d4..6361f9e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-10-04 Eric Botcazou <ebotcazou@libertysurf.fr> + + * gcc.dg/c90-array-lval-6.c: New test. + * gcc.dg/c99-array-lval-6.c: New test. + 2003-10-03 Alexander Malmberg <alexander@malmberg.org> Ziemowit Laski <zlaski@apple.com> diff --git a/gcc/testsuite/gcc.dg/c90-array-lval-6.c b/gcc/testsuite/gcc.dg/c90-array-lval-6.c new file mode 100644 index 0000000..f42ef52 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c90-array-lval-6.c @@ -0,0 +1,16 @@ +/* PR c/12446 */ +/* Origin: Keith Thompson <kst@cts.com> */ + +/* { dg-do compile } */ +/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */ + + +struct s { char c[1]; }; + +extern struct s foo(void); + +void bar(void) +{ + char *ptr = foo().c; /* { dg-bogus "warning" "warning in place of error" } */ +} +/* { dg-error "non-lvalue" "array not decaying to lvalue" { target *-*-* } 14 } */ diff --git a/gcc/testsuite/gcc.dg/c99-array-lval-6.c b/gcc/testsuite/gcc.dg/c99-array-lval-6.c new file mode 100644 index 0000000..426b3c7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c99-array-lval-6.c @@ -0,0 +1,15 @@ +/* PR c/12446 */ +/* Origin: Keith Thompson <kst@cts.com> */ + +/* { dg-do compile } */ +/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */ + + +struct s { char c[1]; }; + +extern struct s foo(void); + +void bar(void) +{ + char *ptr = foo().c; /* { dg-bogus "non-lvalue" "array not decaying to lvalue" } */ +} |