diff --git a/NEWS b/NEWS
index c209cfa80..3cb18d103 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,7 @@ ver 0.20.9 (not yet released)
 * decoder
   - ffmpeg: support *.adx
 * fix byte order detection on FreeBSD/aarch64
+* fix more random crashes when compiled with clang
 
 ver 0.20.8 (2017/05/19)
 * output
diff --git a/src/command/Request.hxx b/src/command/Request.hxx
index 884b5eea7..02f7804e5 100644
--- a/src/command/Request.hxx
+++ b/src/command/Request.hxx
@@ -45,68 +45,57 @@ public:
 			     : default_value;
 	}
 
-	gcc_pure
 	int ParseInt(unsigned idx) const {
 		assert(idx < size);
 		return ParseCommandArgInt(data[idx]);
 	}
 
-	gcc_pure
 	int ParseInt(unsigned idx, int min_value, int max_value) const {
 		assert(idx < size);
 		return ParseCommandArgInt(data[idx], min_value, max_value);
 	}
 
-	gcc_pure
 	int ParseUnsigned(unsigned idx) const {
 		assert(idx < size);
 		return ParseCommandArgUnsigned(data[idx]);
 	}
 
-	gcc_pure
 	int ParseUnsigned(unsigned idx, unsigned max_value) const {
 		assert(idx < size);
 		return ParseCommandArgUnsigned(data[idx], max_value);
 	}
 
-	gcc_pure
 	bool ParseBool(unsigned idx) const {
 		assert(idx < size);
 		return ParseCommandArgBool(data[idx]);
 	}
 
-	gcc_pure
 	RangeArg ParseRange(unsigned idx) const {
 		assert(idx < size);
 		return ParseCommandArgRange(data[idx]);
 	}
 
-	gcc_pure
 	float ParseFloat(unsigned idx) const {
 		assert(idx < size);
 		return ParseCommandArgFloat(data[idx]);
 	}
 
-	gcc_pure
 	SongTime ParseSongTime(unsigned idx) const {
 		assert(idx < size);
 		return ParseCommandArgSongTime(data[idx]);
 	}
 
-	gcc_pure
 	SignedSongTime ParseSignedSongTime(unsigned idx) const {
 		assert(idx < size);
 		return ParseCommandArgSignedSongTime(data[idx]);
 	}
 
-	gcc_pure
 	int ParseOptional(unsigned idx, int default_value) const {
 		return idx < size
 			? ParseInt(idx)
 			: default_value;
 	}
 
-	gcc_pure
 	RangeArg ParseOptional(unsigned idx, RangeArg default_value) const {
 		return idx < size
 			? ParseRange(idx)
diff --git a/src/db/Interface.hxx b/src/db/Interface.hxx
index 4e01c42ce..a81d985a6 100644
--- a/src/db/Interface.hxx
+++ b/src/db/Interface.hxx
@@ -106,7 +106,6 @@ public:
 				     TagType tag_type, tag_mask_t group_mask,
 				     VisitTag visit_tag) const = 0;
 
-	gcc_pure
 	virtual DatabaseStats GetStats(const DatabaseSelection &selection) const = 0;
 
 	/**
diff --git a/src/mixer/MixerInternal.hxx b/src/mixer/MixerInternal.hxx
index 0d62fb0f3..4e2e50657 100644
--- a/src/mixer/MixerInternal.hxx
+++ b/src/mixer/MixerInternal.hxx
@@ -84,7 +84,6 @@ public:
 	 * @return the current volume (0..100 including) or -1 if
 	 * unavailable
 	 */
-	gcc_pure
 	virtual int GetVolume() = 0;
 
 	/**
diff --git a/src/pcm/Resampler.hxx b/src/pcm/Resampler.hxx
index a82387e39..26d5014da 100644
--- a/src/pcm/Resampler.hxx
+++ b/src/pcm/Resampler.hxx
@@ -63,11 +63,12 @@ public:
 	/**
 	 * Resamples a block of PCM data.
 	 *
+	 * Throws std::runtime_error on error.
+	 *
 	 * @param src the input buffer
 	 * @return the destination buffer (will be invalidated by
 	 * filter_close() or filter_filter())
 	 */
-	gcc_pure
 	virtual ConstBuffer<void> Resample(ConstBuffer<void> src) = 0;
 };
 
diff --git a/src/storage/StorageInterface.hxx b/src/storage/StorageInterface.hxx
index 57d15ab15..810b31687 100644
--- a/src/storage/StorageInterface.hxx
+++ b/src/storage/StorageInterface.hxx
@@ -39,7 +39,6 @@ public:
 	/**
 	 * Throws #std::runtime_error on error.
 	 */
-	gcc_pure
 	virtual StorageFileInfo GetInfo(bool follow) = 0;
 };
 
@@ -52,7 +51,6 @@ public:
 	/**
 	 * Throws #std::runtime_error on error.
 	 */
-	gcc_pure
 	virtual StorageFileInfo GetInfo(const char *uri_utf8, bool follow) = 0;
 
 	/**