From b494fd9851d66bf76000364d05bfca1acbf74066 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sat, 4 Oct 2003 20:02:32 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/c-typeck.c | 17 +++++++++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/c90-array-lval-6.c | 16 ++++++++++++++++ gcc/testsuite/gcc.dg/c99-array-lval-6.c | 15 +++++++++++++++ 5 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/c90-array-lval-6.c create mode 100644 gcc/testsuite/gcc.dg/c99-array-lval-6.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c0786895aae..b1724000cff 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-10-04 Eric Botcazou + + 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 * c-decl.c (duplicate_decls): retain DECL_COMMON of old declaration diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 59110c829c5..eaad4fe9698 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 66151d408ae..6361f9e33c2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-10-04 Eric Botcazou + + * gcc.dg/c90-array-lval-6.c: New test. + * gcc.dg/c99-array-lval-6.c: New test. + 2003-10-03 Alexander Malmberg Ziemowit Laski 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 00000000000..f42ef52bd19 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c90-array-lval-6.c @@ -0,0 +1,16 @@ +/* PR c/12446 */ +/* Origin: Keith Thompson */ + +/* { 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 00000000000..426b3c75c90 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c99-array-lval-6.c @@ -0,0 +1,15 @@ +/* PR c/12446 */ +/* Origin: Keith Thompson */ + +/* { 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" } */ +} -- 2.30.2