// g++ 1.37.1 bug 900322_01
+// ** Old, obsolete commentary:
+// **************************************************************************
// The ANSI C standard, in section 3.1.2.5 (first paragraph) differentiates
// types into three disjoint sets, i.e object types, function types, and
// incomplete types.
// g++ fails to flag all of the indicated statements with errors (even when
// the -pedantic option is used).
+// **************************************************************************
+
+// The above commentary is wrong. (jason 1998/11/13)
+// In fact, the lines marked OK are well-formed; the prohibition is only
+// against forming array types with multiple unknown bounds. This prohibition
+// is found in 8.3.4 [dcl.array].
+
+// It is also ill-formed to create an object of incomplete type.
// keywords: incomplete types, arrays, element types
struct s;
-extern struct s extern_s_array [10]; // ERROR - , XFAIL *-*-*
-struct s tenative_s_array [10]; // ERROR - caught by g++
-static struct s static_s_array [10]; // ERROR - caught by g++
+extern struct s extern_s_array [10]; // OK
+struct s tenative_s_array [10]; // ERROR - object with incomplete type
+static struct s static_s_array [10]; // ERROR - object with incomplete type
-struct s (*pointer_to_s_array) []; // ERROR - , XFAIL *-*-*
+struct s (*pointer_to_s_array) []; // OK
-void function_1 (struct s arg []) { // ERROR - , XFAIL *-*-*
+void function_1 (struct s arg []) { // OK
}
typedef struct s s_type;
-typedef s_type s_one_d_type [10]; // ERROR - , XFAIL *-*-*
+typedef s_type s_one_d_type [10]; // OK
int main () { return 0; }