Index: libcfa/src/concurrency/io.cfa
===================================================================
--- libcfa/src/concurrency/io.cfa	(revision c7b22150acba21cf4f3fdf6053901e85f794879b)
+++ libcfa/src/concurrency/io.cfa	(revision a1f3d9373bdef67ff4153d740bcd62fef62867de)
@@ -502,39 +502,41 @@
 	}
 
-	bool __kernel_read(processor * proc, io_future_t & future, char buf[], int fd) {
-		$io_context * ctx = proc->io.ctx;
-		/* paranoid */ verify( ! __preemption_enabled() );
-		/* paranoid */ verify( proc == __cfaabi_tls.this_processor );
-		/* paranoid */ verify( ctx );
-
-		__u32 idx;
-		struct io_uring_sqe * sqe;
-
-		// We can proceed to the fast path
-		if( !__alloc(ctx, &idx, 1) ) return false;
-
-		// Allocation was successful
-		__fill( &sqe, 1, &idx, ctx );
-
-		sqe->opcode = IORING_OP_READ;
-		sqe->user_data = (uintptr_t)&future;
-		sqe->flags = 0;
-		sqe->ioprio = 0;
-		sqe->fd = fd;
-		sqe->off = 0;
-		sqe->fsync_flags = 0;
-		sqe->__pad2[0] = 0;
-		sqe->__pad2[1] = 0;
-		sqe->__pad2[2] = 0;
-		sqe->addr = (uintptr_t)buf;
-		sqe->len = sizeof(uint64_t);
-
-		asm volatile("": : :"memory");
-
-		/* paranoid */ verify( sqe->user_data == (uintptr_t)&future );
-		__submit( ctx, &idx, 1, true );
-
-		/* paranoid */ verify( proc == __cfaabi_tls.this_processor );
-		/* paranoid */ verify( ! __preemption_enabled() );
-	}
+	#if defined(IO_URING_IDLE)
+		bool __kernel_read(processor * proc, io_future_t & future, char buf[], int fd) {
+			$io_context * ctx = proc->io.ctx;
+			/* paranoid */ verify( ! __preemption_enabled() );
+			/* paranoid */ verify( proc == __cfaabi_tls.this_processor );
+			/* paranoid */ verify( ctx );
+
+			__u32 idx;
+			struct io_uring_sqe * sqe;
+
+			// We can proceed to the fast path
+			if( !__alloc(ctx, &idx, 1) ) return false;
+
+			// Allocation was successful
+			__fill( &sqe, 1, &idx, ctx );
+
+			sqe->opcode = IORING_OP_READ;
+			sqe->user_data = (uintptr_t)&future;
+			sqe->flags = 0;
+			sqe->ioprio = 0;
+			sqe->fd = fd;
+			sqe->off = 0;
+			sqe->fsync_flags = 0;
+			sqe->__pad2[0] = 0;
+			sqe->__pad2[1] = 0;
+			sqe->__pad2[2] = 0;
+			sqe->addr = (uintptr_t)buf;
+			sqe->len = sizeof(uint64_t);
+
+			asm volatile("": : :"memory");
+
+			/* paranoid */ verify( sqe->user_data == (uintptr_t)&future );
+			__submit( ctx, &idx, 1, true );
+
+			/* paranoid */ verify( proc == __cfaabi_tls.this_processor );
+			/* paranoid */ verify( ! __preemption_enabled() );
+		}
+	#endif
 #endif
Index: libcfa/src/concurrency/kernel.cfa
===================================================================
--- libcfa/src/concurrency/kernel.cfa	(revision c7b22150acba21cf4f3fdf6053901e85f794879b)
+++ libcfa/src/concurrency/kernel.cfa	(revision a1f3d9373bdef67ff4153d740bcd62fef62867de)
@@ -135,5 +135,7 @@
 static inline bool __maybe_io_drain( processor * );
 
-extern bool __kernel_read(processor * proc, io_future_t & future, char buf[], int fd);
+#if defined(IO_URING_IDLE) && defined(CFA_HAVE_LINUX_IO_URING_H)
+	extern bool __kernel_read(processor * proc, io_future_t & future, char buf[], int fd);
+#endif
 
 extern void __disable_interrupts_hard();
Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision c7b22150acba21cf4f3fdf6053901e85f794879b)
+++ src/AST/Decl.hpp	(revision a1f3d9373bdef67ff4153d740bcd62fef62867de)
@@ -270,8 +270,8 @@
 	: AggregateDecl( loc, name, std::move(attrs), linkage ), kind( kind ) {}
 
-	bool is_coroutine() { return kind == Coroutine; }
-	bool is_generator() { return kind == Generator; }
-	bool is_monitor  () { return kind == Monitor  ; }
-	bool is_thread   () { return kind == Thread   ; }
+	bool is_coroutine() const { return kind == Coroutine; }
+	bool is_generator() const { return kind == Generator; }
+	bool is_monitor  () const { return kind == Monitor  ; }
+	bool is_thread   () const { return kind == Thread   ; }
 
 	const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision c7b22150acba21cf4f3fdf6053901e85f794879b)
+++ src/AST/Print.cpp	(revision a1f3d9373bdef67ff4153d740bcd62fef62867de)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// Print.cpp --
+// Print.cpp -- Print an AST (or sub-tree) to a stream.
 //
 // Author           : Thierry Delisle
Index: src/AST/Print.hpp
===================================================================
--- src/AST/Print.hpp	(revision c7b22150acba21cf4f3fdf6053901e85f794879b)
+++ src/AST/Print.hpp	(revision a1f3d9373bdef67ff4153d740bcd62fef62867de)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// Print.hpp --
+// Print.hpp -- Print an AST (or sub-tree) to a stream.
 //
 // Author           : Thierry Delisle
@@ -35,11 +35,11 @@
 template< typename Coll >
 void printAll( std::ostream & os, const Coll & c, Indenter indent = {} ) {
-    for ( const auto & i : c ) {
-        if ( ! i ) continue;
-        
-        os << indent;
-        print( os, i, indent );
-        os << std::endl;
-    }
+	for ( const auto & i : c ) {
+		if ( ! i ) continue;
+
+		os << indent;
+		print( os, i, indent );
+		os << std::endl;
+	}
 }
 
Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision c7b22150acba21cf4f3fdf6053901e85f794879b)
+++ src/Concurrency/Keywords.cc	(revision a1f3d9373bdef67ff4153d740bcd62fef62867de)
@@ -979,4 +979,5 @@
 			// If this is the destructor for a monitor it must be mutex
 			if(isDtor) {
+				// This reflects MutexKeyword::validate, except does not produce an error.
 				Type* ty = decl->get_functionType()->get_parameters().front()->get_type();
 
Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision c7b22150acba21cf4f3fdf6053901e85f794879b)
+++ src/InitTweak/InitTweak.cc	(revision a1f3d9373bdef67ff4153d740bcd62fef62867de)
@@ -9,7 +9,7 @@
 // Author           : Rob Schluntz
 // Created On       : Fri May 13 11:26:36 2016
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jun 16 20:57:22 2021
-// Update Count     : 18
+// Last Modified By : Andrew Beach
+// Last Modified On : Fri Nov 19 19:22:00 2021
+// Update Count     : 19
 //
 
@@ -540,4 +540,14 @@
 	}
 
+	const ast::Type * getTypeofThis( const ast::FunctionType * ftype ) {
+		assertf( ftype, "getTypeofThis: nullptr ftype" );
+		const std::vector<ast::ptr<ast::Type>> & params = ftype->params;
+		assertf( !params.empty(), "getTypeofThis: ftype with 0 parameters: %s",
+				toString( ftype ).c_str() );
+		const ast::ReferenceType * refType =
+			params.front().strict_as<ast::ReferenceType>();
+		return refType->base;
+	}
+
 	ObjectDecl * getParamThis( FunctionType * ftype ) {
 		assertf( ftype, "getParamThis: nullptr ftype" );
Index: src/InitTweak/InitTweak.h
===================================================================
--- src/InitTweak/InitTweak.h	(revision c7b22150acba21cf4f3fdf6053901e85f794879b)
+++ src/InitTweak/InitTweak.h	(revision a1f3d9373bdef67ff4153d740bcd62fef62867de)
@@ -10,6 +10,6 @@
 // Created On       : Fri May 13 11:26:36 2016
 // Last Modified By : Andrew Beach
-// Last Modified On : Fri Jul 19 14:18:00 2019
-// Update Count     : 6
+// Last Modified On : Fri Nov 19 14:18:00 2021
+// Update Count     : 7
 //
 
@@ -35,4 +35,5 @@
 	/// returns the base type of the first parameter to a constructor/destructor/assignment function
 	Type * getTypeofThis( FunctionType * ftype );
+	const ast::Type * getTypeofThis( const ast::FunctionType * ftype );
 
 	/// returns the first parameter of a constructor/destructor/assignment function
