# Process the gcc.sum file for a run through gcc.test-framework.
# Print result lines that show potential problems.  Report the number
# of passing tests.
#
#
# Copyright (c) 2004, 2005 Free Software Foundation, Inc.
#
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# For a copy of the GNU General Public License, write the the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.

function pass(msg)	{
			  passes++;
			# printf("pass   %s\n", $0);
			}
function fail(msg)	{
			  fails++;
			  printf("fail   %s\n", $0);
			}
function ignore(msg)	{
			# printf("ignore %s\n", $0);
			}

BEGIN			{ skip = 1; passes = 0; fails = 0; }
/Running.*test-frame/	{ skip = 0; next }
/gcc Summary/		{ skip = 1; next }
			{ if (skip) next }
/^$/			{ next }
# The post tests are always expected to pass.
/^PASS.*-2.c/		{ ignore(); next }
# dg-xfail-if applies to the compile step; these should be XPASS for the
# compile step on dox tests, which are run tests.
/^XPASS.*dox.*xiff.*-1.c.*(test for excess errors)/ { ignore(); next }
# xfail for scan-assembler-not tests doesn't apply to the compile step.
/^PASS.*sa.*-1.c.*(test for excess errors)/ { ignore(); next }
# The other dox tests pass the compile step; ignore that message.
/^PASS.*dox.*(test for excess errors)/ { ignore(); next }
# Ignore lines that begin with comma.
/^,/			{ ignore(); next }
# For tests of dg-output, ignore successful compilation.
/^PASS.*dg-output.*(test for excess error)/	{ ignore(); next }
# For tests of dg-output, ignore successful execution.
/^PASS.*dg-output.*execution test/	{ ignore(); next }
/^PASS/			{ if (match ($0, "exp-P")) { pass(); next } }
/^FAIL/			{ if (match ($0, "exp-F")) { pass(); next } }
/^XPASS/		{ if (match ($0, "exp-XP")) { pass(); next } }
/^XFAIL/		{ if (match ($0, "exp-XF")) { pass(); next } }
/^UNSUPPORTED/		{ if (match ($0, "exp-U")) { pass(); next } }
			{ fail() }
END			{
			  printf("\n\t\t=== Test Framework Summary ===\n\n");
			  printf("# of expected passes\t\t%d\n", passes);
			  if (fails != 0)
			    printf("# of unexpected failures\t%d\n", fails);
			}
