1// { dg-do assemble  }
2// g++ 1.37.1 bug 900322_01
3
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.
9
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.
12
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.)
16
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.
19
20// This interpretation suggests that the statements indicated below contain
21// errors.
22
23// g++ fails to flag all of the indicated statements with errors (even when
24// the -pedantic option is used).
25// **************************************************************************
26
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].
31
32// It is also ill-formed to create an object of incomplete type.
33
34// keywords: incomplete types, arrays, element types
35
36extern int extern_two_d [] [];		// { dg-error "" } invalid declaration
37int tenative_two_d [] [];		// { dg-error "" } caught by g++
38static int static_two_d [] [];		// { dg-error "" } caught by g++
39
40int (*pointer_to_two_d)[][];		// { dg-error "" } invalid declaration
41
42void function_0 (int arg [] []) {	// { dg-error "" } invalid declaration
43}
44
45typedef int int_one_d_type [];
46typedef int_one_d_type int_two_d_type[];// { dg-error "" } invalid declaration
47
48struct s;
49
50extern struct s extern_s_array [10];	// OK
51struct s tenative_s_array [10];		// { dg-error "" } object with incomplete type
52static struct s static_s_array [10];	// { dg-error "" } object with incomplete type
53
54struct s (*pointer_to_s_array) [];	// OK
55
56void function_1 (struct s arg []) {	// OK
57}
58
59typedef struct s s_type;
60typedef s_type s_one_d_type [10];	// OK
61
62int main () { return 0; }
63