-printf 'Using seed %d\n' "$random_seed" >&AS_MESSAGE_LOG_FD
-AT_CHECK([randomdecl -En 10000 -s "$random_seed" >decls], [0], [ignore-nolog])
-AT_CHECK([sed -f sanity.sed decls], [0], [stdout-nolog])
-sort -u stdout >decls.chk
+m4_define([sanity_exp], [[FOUND $2
+]])
+LC_ALL=C sort >expout <<'EOF'
+m4_map([sanity_exp], [sanity_tests])dnl
+EOF
+
+AS_ECHO(["Using seed $random_seed"]) >&AS_MESSAGE_LOG_FD
+AT_CHECK([randomdecl -En 10000 -s "$random_seed" >decls], [0])
+AT_CHECK([$AWK -f sanity.awk decls | LC_ALL=C sort], [0], [expout])
+
+AT_CLEANUP
+
+AT_SETUP([Random crossparse])
+
+TEST_NEED_PROGRAM([randomdecl])
+TEST_NEED_PROGRAM([crossparse])
+
+AS_ECHO(["Using seed $random_seed"]) >&AS_MESSAGE_LOG_FD
+AT_CHECK([randomdecl -n "$random_iter" -s "$random_seed"],, [stdout-nolog])
+AT_CHECK([crossparse -f stdout])
+AT_CLEANUP
+
+# Check that we can parse declarations with more than 10000 specifiers.
+AT_SETUP([Excessive specifiers])
+
+s="const"
+for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14; do
+ AS_VAR_APPEND([s], [" $s"])
+done
+
+cat >test.dat <<EOF
+explain $s int
+explain int $s
+type $s int
+type int $s
+EOF
+
+s="inline"
+for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14; do
+ AS_VAR_APPEND([s], [" $s"])
+done
+cat >>test.dat <<EOF
+declare f as $s function returning int
+EOF
+
+AT_CHECK([cdecl99 -f test.dat], [0],
+[[type const int
+type const int
+const int
+const int
+inline int f()
+]])
+
+AT_CLEANUP
+
+# Check that we can parse declarations with more than 10000 declarators.
+AT_SETUP([Excessive declarators])
+
+AT_DATA([check.awk],
+[[# We don't need any field splitting, so choose a character that does not
+# appear in C code to avoid tripping over 199-field limit in HP-UX 11 awk.
+BEGIN { FS = "@"; runstart = 0; }
+END { finish_run(NR); }
+
+gsub(/,[^,)]*/, "~") {
+ while (match($0, /~+/) > 0) {
+ l = substr($0, 1, RSTART-1);
+ r = substr($0, RSTART+RLENGTH);
+ $0 = l ", [plus " RLENGTH " more parameters]" r;
+ }
+}