aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@libertysurf.fr>2003-10-04 20:02:32 +0200
committerEric Botcazou <ebotcazou@gcc.gnu.org>2003-10-04 18:02:32 +0000
commitb494fd9851d66bf76000364d05bfca1acbf74066 (patch)
treeea93cb95fbf3f7b89f23547114e93eaef32cfd22
parente9ff9b17a7c2b5dc5d3dd383dbe191c2354cd859 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/c-typeck.c17
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/c90-array-lval-6.c16
-rw-r--r--gcc/testsuite/gcc.dg/c99-array-lval-6.c15
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" } */
+}