--- /dev/null
+// Build don't link:
+
+// Copyright (C) 1999 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 19 Jan 1999 <nathan@acm.org>
+
+// Determine that throw specifiers are checked correctly.
+
+// [except.spec] 1, a type in an exception specifier shall not be incomplete,
+// or pointer or ref to incomplete
+struct X; // ERROR - forward declaration
+void fn1() throw(X); // ERROR - incomplete type
+void fn2() throw(X *); // ERROR - incomplete type
+void fn3() throw(X &); // ERROR - incomplete type
+void fn4() throw(void); // ERROR - incomplete type
+// except for cv pointer to void
+void fn5() throw(void *);
+
+// [except.spec] 2, exception specifiers must be the same set of types (but
+// can be reordered)
+void fn() throw(int, char);
+void fn() throw(char, int){}
+
+// [except.spec] 3, virtual function overriders shall throw a subset of the
+// overridden function
+struct E {};
+struct F : public E {};
+struct A
+{
+ virtual void foo() throw();
+ virtual void baz() throw(double, int);
+ virtual void bar();
+ virtual void qux() throw(E);
+ virtual void quux() throw(F);
+};
+
+struct B : A
+{
+ virtual void foo() throw(int); // ERROR - not in base function
+ virtual void baz() throw(double);
+ virtual void bar(int) throw(int);
+ virtual void qux() throw(F);
+ virtual void quux() throw(E); // ERROR - not in base function
+};
+
+// [except.spec] 5, types shall not be defined in exception specifiers
+void fn6() throw(struct Z {}); // ERROR - types shall not be defined