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