From: Joseph Myers Date: Sat, 24 Jan 2004 00:30:58 +0000 (+0000) Subject: c-typeck.c (build_conditional_expr): Do not allow non-lvalue arrays. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b1adf557d89a46c314979ae683dd126795d0b762;p=platform%2Fupstream%2Fgcc.git c-typeck.c (build_conditional_expr): Do not allow non-lvalue arrays. * c-typeck.c (build_conditional_expr): Do not allow non-lvalue arrays. testsuite: * gcc.dg/c90-array-lval-7.c, gcc.dg/c99-array-lval-7.c: New tests. From-SVN: r76477 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 12884b7..fb51395 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-01-24 Joseph S. Myers + + * c-typeck.c (build_conditional_expr): Do not allow non-lvalue + arrays. + 2004-01-23 Kazu Hirata * recog.c: Fix a typo in copyright. diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index b6a5d9e..367285e 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -2651,6 +2651,14 @@ build_conditional_expr (tree ifexp, tree op1, tree op2) type2 = TREE_TYPE (op2); code2 = TREE_CODE (type2); + /* C90 does not permit non-lvalue arrays in conditional expressions. + In C99 they will be pointers by now. */ + if (code1 == ARRAY_TYPE || code2 == ARRAY_TYPE) + { + error ("non-lvalue array in conditional expression"); + return error_mark_node; + } + /* Quickly detect the usual case where op1 and op2 have the same type after promotion. */ if (TYPE_MAIN_VARIANT (type1) == TYPE_MAIN_VARIANT (type2)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 26a900a..ecca656 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-01-24 Joseph S. Myers + + * gcc.dg/c90-array-lval-7.c, gcc.dg/c99-array-lval-7.c: New tests. + 2004-01-23 Andrew Pinski * gcc.dg/20030121-1.c: Move to .. diff --git a/gcc/testsuite/gcc.dg/c90-array-lval-7.c b/gcc/testsuite/gcc.dg/c90-array-lval-7.c new file mode 100644 index 0000000..ee8da4c --- /dev/null +++ b/gcc/testsuite/gcc.dg/c90-array-lval-7.c @@ -0,0 +1,23 @@ +/* Test for non-lvalue arrays: test that C90 does not allow them in + conditional expressions, while in C99 they decay and are + allowed. */ + +/* Origin: Joseph Myers */ +/* { dg-do compile } */ +/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */ + +struct s { char c[1]; }; +struct s a, b, c; +int d; +int e; + +void +bar (void) +{ + /* In C90, the non-lvalue arrays do not decay to pointers, and + 6.3.15 does not permit conditional expressions between arrays. + In C99, they decay to pointers. */ + (e ? (d ? b : c).c : (e ? b : c).c); /* { dg-bogus "warning" "warning in place of error" } */ +} + +/* { dg-error "array" "bad conditional" { target *-*-* } 20 } */ diff --git a/gcc/testsuite/gcc.dg/c99-array-lval-7.c b/gcc/testsuite/gcc.dg/c99-array-lval-7.c new file mode 100644 index 0000000..3d70ed0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c99-array-lval-7.c @@ -0,0 +1,21 @@ +/* Test for non-lvalue arrays: test that C90 does not allow them in + conditional expressions, while in C99 they decay and are + allowed. */ + +/* Origin: Joseph Myers */ +/* { dg-do compile } */ +/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */ + +struct s { char c[1]; }; +struct s a, b, c; +int d; +int e; + +void +bar (void) +{ + /* In C90, the non-lvalue arrays do not decay to pointers, and + 6.3.15 does not permit conditional expressions between arrays. + In C99, they decay to pointers. */ + (e ? (d ? b : c).c : (e ? b : c).c); +}