xref: /llvm-project/clang/test/C/C99/n835.c (revision 668c1ea4aa7f3907b92116748af087f2bb006a97)
1 /* RUN: %clang_cc1 -verify -pedantic -std=c99 %s
2    RUN: %clang_cc1 -verify=c89 -pedantic -std=c89 %s
3    expected-no-diagnostics
4  */
5 
6 /* WG14 N835: Yes
7  * Conversion of array to pointer not limited to lvalues
8  *
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 type
12  * 'array of type' is converted to an expression that has type 'pointer to
13  * type' that points to the initial element of the array object and is not an
14  * lvalue.
15  *
16  * C99 6.3.2.1p3: Except when it is the operand of ..., an expression that has
17  * type 'array of type' is converted to an expression with type 'pointer to
18  * type' that points to the initial element of the array object and is not an
19  * lvalue.
20  */
21 
22 struct S {
23   char arr[100];
24 };
25 
26 struct S f(void);
27 
func(void)28 void func(void) {
29   char c;
30   /* The return from f() is an rvalue, so this code is not valid in C89, but is
31    * valid in C99.
32    */
33   c = f().arr[10]; /* c89-warning {{ISO C90 does not allow subscripting non-lvalue array}} */
34 }
35 
36