Index: libcfa/src/assert.cfa
===================================================================
--- libcfa/src/assert.cfa	(revision 5f9c42bc7375583e7b9739ec0f5afd42ab94c1f0)
+++ libcfa/src/assert.cfa	(revision 77125cc6cdf702a586488a93c45e38d39123019c)
@@ -25,4 +25,5 @@
 
 	#define CFA_ASSERT_FMT "Cforall Assertion error \"%s\" from program \"%s\" in \"%s\" at line %d in file \"%s\""
+	#define CFA_WARNING_FMT "Cforall Assertion warning \"%s\" from program \"%s\" in \"%s\" at line %d in file \"%s\""
 
 	// called by macro assert in assert.h
@@ -48,4 +49,19 @@
 		abort();
 	}
+
+	// called by macro warnf
+	// would be cool to remove libcfa_public but it's needed for libcfathread
+	void __assert_warn_f( const char assertion[], const char file[], unsigned int line, const char function[], const char fmt[], ... ) libcfa_public {
+		__cfaabi_bits_acquire();
+		__cfaabi_bits_print_nolock( STDERR_FILENO, CFA_WARNING_FMT ": ", assertion, __progname, function, line, file );
+
+		va_list args;
+		va_start( args, fmt );
+		__cfaabi_bits_print_vararg( STDERR_FILENO, fmt, args );
+		va_end( args );
+
+		__cfaabi_bits_print_nolock( STDERR_FILENO, "\n" );
+		__cfaabi_bits_release();
+	}
 }
 
Index: libcfa/src/stdhdr/assert.h
===================================================================
--- libcfa/src/stdhdr/assert.h	(revision 5f9c42bc7375583e7b9739ec0f5afd42ab94c1f0)
+++ libcfa/src/stdhdr/assert.h	(revision 77125cc6cdf702a586488a93c45e38d39123019c)
@@ -27,16 +27,19 @@
 	#define assertf( expr, fmt, ... ) ((expr) ? ((void)0) : __assert_fail_f(__VSTRINGIFY__(expr), __FILE__, __LINE__, __PRETTY_FUNCTION__, fmt, ## __VA_ARGS__ ))
 
+	void __assert_warn_f( const char assertion[], const char file[], unsigned int line, const char function[], const char fmt[], ... ) __attribute__((format( printf, 5, 6) ));
 	void __assert_fail_f( const char assertion[], const char file[], unsigned int line, const char function[], const char fmt[], ... ) __attribute__((noreturn, format( printf, 5, 6) ));
 #endif
 
 #if !defined(NDEBUG) && (defined(__CFA_DEBUG__) || defined(__CFA_VERIFY__))
+	#define __CFA_WITH_VERIFY__
 	#define verify(x) assert(x)
 	#define verifyf(x, ...) assertf(x, __VA_ARGS__)
 	#define verifyfail(...)
-	#define __CFA_WITH_VERIFY__
+	#define warnf( expr, fmt, ... ) ({ static bool check_once##__LINE__ = false; if( false == check_once##__LINE__ && false == (expr)) { check_once##__LINE__ = true; __assert_warn_f(__VSTRINGIFY__(expr), __FILE__, __LINE__, __PRETTY_FUNCTION__, fmt, ## __VA_ARGS__ ); } })
 #else
 	#define verify(x)
 	#define verifyf(x, ...)
 	#define verifyfail(...)
+	#define warnf( expr, fmt, ... )
 #endif
 
