#-----------------------------------------------------------------------------#
# vim: ts=8 sw=8 noexpandtab ft=make
#-----------------------------------------------------------------------------#

TESTS_DIR = ..
THIS_DIR = invalid_submodules
MAYBE_J1 = -j1

# This directory contains tests for errors in programs in which at least
# one source file contains more than one nested module. We disable
# parallel make with the -j1 above, because if we didn't, we would get
# intermittent failures caused by interface files of nested submodules
# not being ready when another job, executed in parallel by mmake,
# wants to read them.
#
# For multi-module tests (which includes all the tests in this directory)
# we normally need to make the dependencies. However, multi-module tests
# where the error is detected when building the dependencies
# (e.g. duplicate_module_test.m) should be included in MAKE_DEP_ONLY_PROGS,
# not STD_PROGS, because we have a specific make rule for them below.

STD_PROGS = \
	exported_unify3 \
	missing_parent_import \
	undef_mod_qual \
	unresolved_overloading

MAKE_DEP_ONLY_PROGS = \
	duplicate_module_test \
	func_class \
	nested_impl_in_int

# XXX The test cases import_in_parent and subtype_submodule are
# currently disabled, because
#
# - we now discover the errors they reports when making .int files,
#   which would require moving them to invalid_make_int, but
# - this would require adding support for nested submodules to
#   invalid_make_int, and
# - this is not warranted, because the errors they report are tested for
#   elsewhere.
#
# XXX The test case undef_in_ancestor is currently disabled due to the
# lack of a compatible test setup anywhere in the invalid test directories.

#-----------------------------------------------------------------------------#

PROGS = $(STD_PROGS) $(MAKE_DEP_ONLY_PROGS)
# For the MAKE_DEP_ONLY_PROGS, we want to make the dependencies
# using our own rule below, not the usual rule, which is why we disable
# the usual rule for them via the -nodepend suffix.
TESTS = $(sort $(STD_PROGS) $(MAKE_DEP_ONLY_PROGS:%=%-nodepend))
include ../Mmake.common

# Module-specific options should go in Mercury.options so they can be found
# by `mmc --make'.
include Mercury.options

MCFLAGS += --color-diagnostics

%.runtest: %.err_res ;

#-----------------------------------------------------------------------------#

ifneq ($(MMAKE_USE_MMC_MAKE),yes)

$(STD_PROGS:%=%.err): %.err: %.m
	if $(MC) --errorcheck-only $(ALL_GRADEFLAGS) $(ALL_MCFLAGS) $* \
		> $*.err 2>&1; \
	then false; \
	else true; \
	fi

else

% XXX: with `mmake --use-mmc-make' the ".DEFAULT:" rule seems to take
# precedence over "%.err: %.m" rules.
% XXX: the reason we run the $(MCM) command twice is to avoid doubled up
# error messages, once while making interface files, then the module proper.
# The second time the command is run, only one set of error messages
# should appear.
$(STD_PROGS:%=%.err):
	-$(MCM) $@
	if $(MCM) -r $@ > /dev/null 2>&1; \
	then false; \
	else true; \
	fi

endif

# For these test cases, the bug is caught when generating dependencies,
# so it is easiest just to do that step.
$(MAKE_DEP_ONLY_PROGS:%=%.err): %.err: %.m
	if $(MC) $(ALL_GRADEFLAGS) $(ALL_MCFLAGS) \
		--generate-dependencies $* > $*.err 2>&1; \
	then false; \
	else true; \
	fi

$(dates_subdir)undef_mod_qual.date: $(int0s_subdir)undef_mod_qual.int0

clean_local: clean_invalid_submodules

clean_invalid_submodules:
	rm -f *dep_err *.err *.err_res

#-----------------------------------------------------------------------------#
