36 lines · c
1/* RUN: %clang_cc1 -verify -pedantic -std=c99 %s2 RUN: %clang_cc1 -verify=c89 -pedantic -std=c89 %s3 expected-no-diagnostics4 */5 6/* WG14 N835: Yes7 * Conversion of array to pointer not limited to lvalues8 *9 * NB: The crux of the change was C99 changing:10 *11 * C89 3.2.2.1: Except when it is the operand of ..., an lvalue that has type12 * 'array of type' is converted to an expression that has type 'pointer to13 * type' that points to the initial element of the array object and is not an14 * lvalue.15 *16 * C99 6.3.2.1p3: Except when it is the operand of ..., an expression that has17 * type 'array of type' is converted to an expression with type 'pointer to18 * type' that points to the initial element of the array object and is not an19 * lvalue.20 */21 22struct S {23 char arr[100];24};25 26struct S f(void);27 28void func(void) {29 char c;30 /* The return from f() is an rvalue, so this code is not valid in C89, but is31 * valid in C99.32 */33 c = f().arr[10]; /* c89-warning {{ISO C90 does not allow subscripting non-lvalue array}} */34}35 36