diff --git a/.gitignore b/.gitignore
index 259148f..1719d26 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,6 @@
 *.exe
 *.out
 *.app
+
+# Build directories
+build*
diff --git a/Makefile b/Makefile
index eea75c6..dd7b1ac 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,5 @@
-FC ?= gfortran
-
 testdir := tests
-builddir := build
+builddir := build-$(FC)
 
 features := $(wildcard $(testdir)/*)
 tests := $(subst $(testdir)/,,$(foreach feature,$(features),$(wildcard $(feature)/*)))
@@ -13,17 +11,17 @@ $(builddir):
 
 define FEATURE_DIR_RULE
 
-$(builddir)/$(subst $(testdir)/,,$(1)): $(builddir)
-	mkdir $@
+$(builddir)/$(1): $(builddir)
+	mkdir $(builddir)/$(1)
 
 endef
 
-$(foreach feature,$(features),$(eval $(call FEATURE_DIR_RULE,$(feature))))
+$(foreach feature,$(features),$(eval $(call FEATURE_DIR_RULE,$(subst $(testdir)/,,$(feature)))))
 
 define TEST_DIR_RULE
 
-$(builddir)/$(1): $(builddir)/$(1)
-	mkdir $@
+$(builddir)/$(1): $(builddir)/$(dir $(1))
+	mkdir $(builddir)/$(1)
 
 endef
 
@@ -32,12 +30,10 @@ $(foreach test,$(tests),$(eval $(call TEST_DIR_RULE,$(test))))
 define TEST_RULE
 
 $(builddir)/$(1)/RESULT: $(builddir)/$(1)/main.exe
-	$^ || true
-	$(if $(not $(exists $@)) echo "FAILED" > $@)
+	cd $(builddir)/$(1) && ./main.exe || echo FAILED > RESULT
 
-$(builddir)/$(1)/main.exe: $(1)/main.f90 $(builddir)/$(1)
-	$FC $^ -o $@ || true
-	$(if $(not $(exits $@)) touch $@)
+$(builddir)/$(1)/main.exe: $(testdir)/$(1)/main.f90 $(builddir)/$(1)
+	$(FC) $(testdir)/$(1)/main.f90 -o $(builddir)/$(1)/main.exe || touch $(builddir)/$(1)/main.exe
 
 endef
 
diff --git a/tests/error-stop-in-pure/internal-subroutine-no-code/main.f90 b/tests/error-stop-in-pure/internal-subroutine-no-code/main.f90
new file mode 100644
index 0000000..85c064a
--- /dev/null
+++ b/tests/error-stop-in-pure/internal-subroutine-no-code/main.f90
@@ -0,0 +1,14 @@
+program main
+  !! Check whether error stop is allowed inside a pure procedure
+  implicit none
+
+  integer file_unit
+
+  open(newunit=file_unit, file="RESULT", status="REPLACE")
+  write(file_unit,'(a)') "PASSED"
+
+contains
+  pure subroutine error_stop_in_pure()
+    error stop
+  end subroutine
+end program