Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision db4d8e3f8b8d886886b38830044410b6a1694da5)
+++ src/Concurrency/Keywords.cc	(revision ceedde6025cceafa3bb88869c460143c276914fa)
@@ -443,22 +443,52 @@
 		bool first = false;
 		std::list<DeclarationWithType*> mutexArgs = findMutexArgs( decl, first );
-		if( mutexArgs.empty() ) return;
-
-		if( CodeGen::isConstructor(decl->name) && first ) SemanticError( decl, "constructors cannot have mutex parameters" );
-
 		bool isDtor = CodeGen::isDestructor( decl->name );
 
+		// Is this function relevant to monitors
+		if( mutexArgs.empty() ) {
+			// If this is the destructor for a monitor it must be mutex
+			if(isDtor) {
+				Type* ty = decl->get_functionType()->get_parameters().front()->get_type();
+
+				// If it's a copy, it's not a mutex
+				ReferenceType* rty = dynamic_cast< ReferenceType * >( ty );
+				if( ! rty ) return;
+
+				// If we are not pointing directly to a type, it's not a mutex
+				Type* base = rty->get_base();
+				if( dynamic_cast< ReferenceType * >( base ) ) return;
+				if( dynamic_cast< PointerType * >( base ) ) return;
+
+				// Check if its a struct
+				StructInstType * baseStruct = dynamic_cast< StructInstType * >( base );
+				if( !baseStruct ) return;
+
+				// Check if its a monitor
+				if(baseStruct->baseStruct->is_monitor() || baseStruct->baseStruct->is_thread())
+					SemanticError( decl, "destructors for structures declared as \"monitor\" must use mutex parameters\n" );
+			}
+			return;
+		}
+
+		// Monitors can't be constructed with mutual exclusion
+		if( CodeGen::isConstructor(decl->name) && !first ) SemanticError( decl, "constructors cannot have mutex parameters" );
+
+		// It makes no sense to have multiple mutex parameters for the destructor
 		if( isDtor && mutexArgs.size() != 1 ) SemanticError( decl, "destructors can only have 1 mutex argument" );
 
+		// Make sure all the mutex arguments are monitors
 		for(auto arg : mutexArgs) {
 			validate( arg );
 		}
 
+		// Check if we need to instrument the body
 		CompoundStmt* body = decl->get_statements();
 		if( ! body ) return;
 
+		// Do we have the required headers
 		if( !monitor_decl || !guard_decl || !dtor_guard_decl )
-			SemanticError( decl, "mutex keyword requires monitors to be in scope, add #include <monitor>" );
-
+			SemanticError( decl, "mutex keyword requires monitors to be in scope, add #include <monitor>\n" );
+
+		// Instrument the body
 		if( isDtor ) {
 			addDtorStatments( decl, body, mutexArgs );
