2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / gcc / testsuite / g++.old-deja / g++.bugs / 900322_01.C
blobbd3296ae2cd024321b3e8a9f0daae60037cd5189
1 // { dg-do assemble  }
2 // g++ 1.37.1 bug 900322_01
4 // ** Old, obsolete commentary:
5 // **************************************************************************
6 // The ANSI C standard, in section 3.1.2.5 (first paragraph) differentiates
7 // types into three disjoint sets, i.e object types, function types, and
8 // incomplete types.
10 // Also in 3.1.2.5 (page 24) the standard says that the element type of
11 // an array type is an object type.
13 // Later in that same section the standard also notes that array types with
14 // unknown size are considered incomplete types (page 25).  (Struct & union
15 // types which have only been "forward declared" are also incomplete types.)
17 // Some experts infer this to mean that it is not legal to specify or to
18 // construct an array *type* whose element type is an incomplete type.
20 // This interpretation suggests that the statements indicated below contain
21 // errors.
23 // g++ fails to flag all of the indicated statements with errors (even when
24 // the -pedantic option is used).
25 // **************************************************************************
27 // The above commentary is wrong.  (jason 1998/11/13)
28 // In fact, the lines marked OK are well-formed; the prohibition is only
29 // against forming array types with multiple unknown bounds.  This prohibition
30 // is found in 8.3.4 [dcl.array].
32 // It is also ill-formed to create an object of incomplete type.
34 // keywords: incomplete types, arrays, element types
36 extern int extern_two_d [] [];          // { dg-error "" } invalid declaration
37 int tenative_two_d [] [];               // { dg-error "" } caught by g++
38 static int static_two_d [] [];          // { dg-error "" } caught by g++
40 int (*pointer_to_two_d)[][];            // { dg-error "" } invalid declaration
42 void function_0 (int arg [] []) {       // { dg-error "" } invalid declaration
45 typedef int int_one_d_type [];
46 typedef int_one_d_type int_two_d_type[];// { dg-error "" } invalid declaration
48 struct s;
50 extern struct s extern_s_array [10];    // OK
51 struct s tenative_s_array [10];         // { dg-error "" } object with incomplete type
52 static struct s static_s_array [10];    // { dg-error "" } object with incomplete type
54 struct s (*pointer_to_s_array) [];      // OK
56 void function_1 (struct s arg []) {     // OK
59 typedef struct s s_type;
60 typedef s_type s_one_d_type [10];       // OK
62 int main () { return 0; }